1 // Copyright 2009 The Go Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style
3 // license that can be found in the LICENSE file.
4
5 // This is a package for testing comment placement by go/printer.
6 //
7 package main
8
9 import "fmt" // fmt
10
11 const c0 = 0 // zero
12 const (
13 c1 = iota // c1
14 c2 // c2
15 )
16
17 // Alignment of comments in declarations>
18 const (
19 _ T = iota // comment
20 _ // comment
21 _ // comment
22 _ = iota + 10
23 _ // comments
24
25 _ = 10 // comment
26 _ T = 20 // comment
27 )
28
29 const (
30 _____ = iota // foo
31 _ // bar
32 _ = 0 // bal
33 _ // bat
34 )
35
36 const (
37 _ T = iota // comment
38 _ // comment
39 _ // comment
40 _ = iota + 10
41 _ // comment
42 _ = 10
43 _ = 20 // comment
44 _ T = 0 // comment
45 )
46
47 // The SZ struct; it is empty.
48 type SZ struct{}
49
50 // The S0 struct; no field is exported.
51 type S0 struct {
52 int
53 x, y, z int // 3 unexported fields
54 }
55
56 // The S1 struct; some fields are not exported.
57 type S1 struct {
58 S0
59 A, B, C float // 3 exported fields
60 D, b, c int // 2 unexported fields
61 }
62
63 // The S2 struct; all fields are exported.
64 type S2 struct {
65 S1
66 A, B, C float // 3 exported fields
67 }
68
69 // The IZ interface; it is empty.
70 type SZ interface{}
71
72 // The I0 interface; no method is exported.
73 type I0 interface {
74 f(x int) int // unexported method
75 }
76
77 // The I1 interface; some methods are not exported.
78 type I1 interface {
79 I0
80 F(x float) float // exported methods
81 g(x int) int // unexported method
82 }
83
84 // The I2 interface; all methods are exported.
85 type I2 interface {
86 I0
87 F(x float) float // exported method
88 G(x float) float // exported method
89 }
90
91 // The S3 struct; all comments except for the last one must appear in the export.
92 type S3 struct {
93 // lead comment for F1
94 F1 int // line comment for F1
95 // lead comment for F2
96 F2 int // line comment for F2
97 f3 int // f3 is not exported
98 }
99
100 // This comment group should be separated
101 // with a newline from the next comment
102 // group.
103
104 // This comment should NOT be associated with the next declaration.
105
106 var x int // x
107 var ()
108
109 // This comment SHOULD be associated with f0.
110 func f0() {
111 const pi = 3.14 // pi
112 var s1 struct{} /* an empty struct */ /* foo */
113 // a struct constructor
114 // --------------------
115 var s2 struct{} = struct{}{}
116 x := pi
117 }
118
119 //
120 // This comment should be associated with f1, with one blank line before the comment.
121 //
122 func f1() {
123 f0()
124 /* 1 */
125 // 2
126 /* 3 */
127 /* 4 */
128 f0()
129 }
130
131 func _() {
132 // this comment should be properly indented
133 }
134
135 func _(x int) int {
136 if x < 0 { // the tab printed before this comment's // must not affect the remaining lines
137 return -x // this statement should be properly indented
138 }
139 if x < 0 { /* the tab printed before this comment's /* must not affect the remaining lines */
140 return -x // this statement should be properly indented
141 }
142 return x
143 }
144
145 func typeswitch(x interface{}) {
146 switch v := x.(type) {
147 case bool, int, float:
148 case string:
149 default:
150 }
151
152 switch x.(type) {
153 }
154
155 switch v0, ok := x.(int); v := x.(type) {
156 }
157
158 switch v0, ok := x.(int); x.(type) {
159 case byte: // this comment should be on the same line as the keyword
160 // this comment should be normally indented
161 _ = 0
162 case bool, int, float:
163 // this comment should be indented
164 case string:
165 default:
166 // this comment should be indented
167 }
168 // this comment should not be indented
169 }
170
171 //
172 // Indentation of comments after possibly indented multi-line constructs
173 // (test cases for issue 3147).
174 //
175
176 func _() {
177 s := 1 +
178 2
179 // should be indented like s
180 }
181
182 func _() {
183 s := 1 +
184 2 // comment
185 // should be indented like s
186 }
187
188 func _() {
189 s := 1 +
190 2 // comment
191 // should be indented like s
192 _ = 0
193 }
194
195 func _() {
196 s := 1 +
197 2
198 // should be indented like s
199 _ = 0
200 }
201
202 func _() {
203 s := 1 +
204 2
205
206 // should be indented like s
207 }
208
209 func _() {
210 s := 1 +
211 2 // comment
212
213 // should be indented like s
214 }
215
216 func _() {
217 s := 1 +
218 2 // comment
219
220 // should be indented like s
221 _ = 0
222 }
223
224 func _() {
225 s := 1 +
226 2
227
228 // should be indented like s
229 _ = 0
230 }
231
232 // Test case from issue 3147.
233 func f() {
234 templateText := "a" + // A
235 "b" + // B
236 "c" // C
237
238 // should be aligned with f()
239 f()
240 }
241
242 // Modified test case from issue 3147.
243 func f() {
244 templateText := "a" + // A
245 "b" + // B
246 "c" // C
247
248 // may not be aligned with f() (source is not aligned)
249 f()
250 }
251
252 //
253 // Test cases for alignment of lines in general comments.
254 //
255
256 func _() {
257 /* freestanding comment
258 aligned line
259 aligned line
260 */
261 }
262
263 func _() {
264 /* freestanding comment
265 aligned line
266 aligned line
267 */
268 }
269
270 func _() {
271 /* freestanding comment
272 aligned line
273 aligned line */
274 }
275
276 func _() {
277 /* freestanding comment
278 aligned line
279 aligned line
280 */
281 }
282
283 func _() {
284 /* freestanding comment
285 aligned line
286 aligned line
287 */
288 }
289
290 func _() {
291 /* freestanding comment
292 aligned line
293 aligned line */
294 }
295
296 func _() {
297 /*
298 freestanding comment
299 aligned line
300 aligned line
301 */
302 }
303
304 func _() {
305 /*
306 freestanding comment
307 aligned line
308 aligned line
309 */
310 }
311
312 func _() {
313 /*
314 freestanding comment
315 aligned line
316 aligned line */
317 }
318
319 func _() {
320 /*
321 freestanding comment
322 aligned line
323 aligned line
324 */
325 }
326
327 func _() {
328 /*
329 freestanding comment
330 aligned line
331 aligned line
332 */
333 }
334
335 func _() {
336 /*
337 freestanding comment
338 aligned line
339 aligned line */
340 }
341
342 func _() {
343 /* freestanding comment
344 aligned line
345 */
346 }
347
348 func _() {
349 /* freestanding comment
350 aligned line
351 */
352 }
353
354 func _() {
355 /* freestanding comment
356 aligned line */
357 }
358
359 func _() {
360 /* freestanding comment
361 aligned line
362 */
363 }
364
365 func _() {
366 /* freestanding comment
367 aligned line
368 */
369 }
370
371 func _() {
372 /* freestanding comment
373 aligned line */
374 }
375
376 func _() {
377 /*
378 freestanding comment
379 aligned line
380 */
381 }
382
383 func _() {
384 /*
385 freestanding comment
386 aligned line
387 */
388 }
389
390 func _() {
391 /*
392 freestanding comment
393 aligned line */
394 }
395
396 func _() {
397 /*
398 freestanding comment
399 aligned line
400 */
401 }
402
403 func _() {
404 /*
405 freestanding comment
406 aligned line
407 */
408 }
409
410 func _() {
411 /*
412 freestanding comment
413 aligned line */
414 }
415
416 // Issue 9751.
417 func _() {
418 /*a string
419
420 b string*/
421
422 /*A string
423
424
425
426 Z string*/
427
428 /*a string
429
430 b string
431
432 c string*/
433
434 {
435 /*a string
436 b string*/
437
438 /*a string
439
440 b string*/
441
442 /*a string
443
444 b string
445
446 c string*/
447 }
448
449 {
450 /*a string
451 b string*/
452
453 /*a string
454
455 b string*/
456
457 /*a string
458
459 b string
460
461 c string*/
462 }
463
464 /*
465 */
466
467 /*
468
469 */
470
471 /*
472
473 * line
474
475 */
476 }
477
478 /*
479 * line
480 * of
481 * stars
482 */
483
484 /* another line
485 * of
486 * stars */
487
488 /* and another line
489 * of
490 * stars */
491
492 /* a line of
493 * stars */
494
495 /* and another line of
496 * stars */
497
498 /* a line of stars
499 */
500
501 /* and another line of
502 */
503
504 /* a line of stars
505 */
506
507 /* and another line of
508 */
509
510 /*
511 aligned in middle
512 here
513 not here
514 */
515
516 /*
517 blank line in middle:
518
519 with no leading spaces on blank line.
520 */
521
522 /*
523 aligned in middle
524 here
525 not here
526 */
527
528 /*
529 blank line in middle:
530
531 with no leading spaces on blank line.
532 */
533
534 func _() {
535 /*
536 * line
537 * of
538 * stars
539 */
540
541 /*
542 aligned in middle
543 here
544 not here
545 */
546
547 /*
548 blank line in middle:
549
550 with no leading spaces on blank line.
551 */
552 }
553
554 // Some interesting interspersed comments.
555 // See below for more common cases.
556 func _( /* this */ x /* is */ /* an */ int) {
557 }
558
559 func _( /* no params - extra blank before and after comment */ ) {}
560 func _(a, b int /* params - no extra blank after comment */) {}
561
562 func _() { f( /* no args - extra blank before and after comment */ ) }
563 func _() { f(a, b /* args - no extra blank after comment */) }
564
565 func _() {
566 f( /* no args - extra blank before and after comment */ )
567 f(a, b /* args - no extra blank after comment */)
568 }
569
570 func ( /* comment1 */ T /* comment2 */) _() {}
571
572 func _() { /* "short-ish one-line functions with comments are formatted as multi-line functions */ }
573 func _() { x := 0; /* comment */ y = x /* comment */ }
574
575 func _() {
576 _ = 0
577 /* closing curly brace should be on new line */
578 }
579
580 func _() {
581 _ = []int{0, 1 /* don't introduce a newline after this comment - was issue 1365 */}
582 }
583
584 // Test cases from issue 1542:
585 // Comments must not be placed before commas and cause invalid programs.
586 func _() {
587 var a = []int{1, 2 /*jasldf*/}
588 _ = a
589 }
590
591 func _() {
592 var a = []int{1, 2}/*jasldf
593 */
594
595 _ = a
596 }
597
598 func _() {
599 var a = []int{1, 2}// jasldf
600
601 _ = a
602 }
603
604 // Test cases from issues 11274, 15137:
605 // Semicolon must not be lost when multiple statements are on the same line with a comment.
606 func _() {
607 x := 0 /**/
608 y := 1
609 }
610
611 func _() {
612 f()
613 f()
614 f() /* comment */
615 f()
616 f() /* comment */
617 f()
618 f() /* a */ /* b */
619 f()
620 f() /* a */ /* b */
621 f()
622 f() /* a */ /* b */
623 f()
624 }
625
626 func _() {
627 f() /* a */ /* b */
628 }
629
630 // Comments immediately adjacent to punctuation followed by a newline
631 // remain after the punctuation (looks better and permits alignment of
632 // comments).
633 func _() {
634 _ = T{
635 1, // comment after comma
636 2, /* comment after comma */
637 3, // comment after comma
638 }
639 _ = T{
640 1, // comment after comma
641 2, /* comment after comma */
642 3, // comment after comma
643 }
644 _ = T{
645 /* comment before literal */ 1,
646 2, /* comment before comma - ok to move after comma */
647 3, /* comment before comma - ok to move after comma */
648 }
649
650 for i = 0; // comment after semicolon
651 i < 9; /* comment after semicolon */
652 i++ { // comment after opening curly brace
653 }
654
655 // TODO(gri) the last comment in this example should be aligned */
656 for i = 0; // comment after semicolon
657 i < 9; /* comment before semicolon - ok to move after semicolon */
658 i++ /* comment before opening curly brace */ {
659 }
660 }
661
662 // If there is no newline following punctuation, commas move before the punctuation.
663 // This way, commas interspersed in lists stay with the respective expression.
664 func f(x /* comment */, y int, z int /* comment */, u, v, w int /* comment */) {
665 f(x /* comment */, y)
666 f(x, /* comment */
667 y)
668 f(
669 x, /* comment */
670 )
671 }
672
673 func g(
674 x int, /* comment */
675 ) {
676 }
677
678 type _ struct {
679 a, b /* comment */, c int
680 }
681
682 type _ struct {
683 a, b /* comment */, c int
684 }
685
686 func _() {
687 for a /* comment */, b := range x {
688 }
689 }
690
691 // Print line directives correctly.
692
693 // The following is a legal line directive.
694 //line foo:1
695 func _() {
696 _ = 0
697 // The following is a legal line directive. It must not be indented:
698 //line foo:2
699 _ = 1
700
701 // The following is not a legal line directive (it doesn't start in column 1):
702 //line foo:2
703 _ = 2
704
705 // The following is not a legal line directive (missing colon):
706 //line foo -3
707 _ = 3
708 }
709
710 // Line comments with tabs
711 func _() {
712 var finput *bufio.Reader // input file
713 var stderr *bufio.Writer
714 var ftable *bufio.Writer // y.go file
715 var foutput *bufio.Writer // y.output file
716
717 var oflag string // -o [y.go] - y.go file
718 var vflag string // -v [y.output] - y.output file
719 var lflag bool // -l - disable line directives
720 }
721
722 // Trailing white space in comments should be trimmed
723 func _() {
724 // This comment has 4 blanks following that should be trimmed:
725 /* Each line of this comment has blanks or tabs following that should be trimmed:
726 line 2:
727 line 3:
728 */
729 }
730
731 var _ = []T{ /* lone comment */ }
732
733 var _ = []T{
734 /* lone comment */
735 }
736
737 var _ = []T{
738 // lone comments
739 // in composite lit
740 }
741
742 var _ = [][]T{
743 {
744 // lone comments
745 // in composite lit
746 },
747 }
748
749 // TODO: gofmt doesn't add these tabs; make it so that these golden
750 // tests run the printer in a way that it's exactly like gofmt.
751
752 var _ = []T{ // lone comment
753 }
754
755 var _ = []T{ // lone comments
756 // in composite lit
757 }
758
759 /* This comment is the last entry in this file. It must be printed and should be followed by a newline */
760
View as plain text