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