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// 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 106var x int // x 107var () 108 109// This comment SHOULD be associated with f0. 110func 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// 122func f1() { 123 f0() 124 /* 1 */ 125 // 2 126 /* 3 */ 127 /* 4 */ 128 f0() 129} 130 131func _() { 132 // this comment should be properly indented 133} 134 135func _(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 145func 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 176func _() { 177 s := 1 + 178 2 179 // should be indented like s 180} 181 182func _() { 183 s := 1 + 184 2 // comment 185 // should be indented like s 186} 187 188func _() { 189 s := 1 + 190 2 // comment 191 // should be indented like s 192 _ = 0 193} 194 195func _() { 196 s := 1 + 197 2 198 // should be indented like s 199 _ = 0 200} 201 202func _() { 203 s := 1 + 204 2 205 206 // should be indented like s 207} 208 209func _() { 210 s := 1 + 211 2 // comment 212 213 // should be indented like s 214} 215 216func _() { 217 s := 1 + 218 2 // comment 219 220 // should be indented like s 221 _ = 0 222} 223 224func _() { 225 s := 1 + 226 2 227 228 // should be indented like s 229 _ = 0 230} 231 232// Test case from issue 3147. 233func 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. 243func 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 256func _() { 257 /* freestanding comment 258 aligned line 259 aligned line 260 */ 261} 262 263func _() { 264 /* freestanding comment 265 aligned line 266 aligned line 267 */ 268} 269 270func _() { 271 /* freestanding comment 272 aligned line 273 aligned line */ 274} 275 276func _() { 277 /* freestanding comment 278 aligned line 279 aligned line 280 */ 281} 282 283func _() { 284 /* freestanding comment 285 aligned line 286 aligned line 287 */ 288} 289 290func _() { 291 /* freestanding comment 292 aligned line 293 aligned line */ 294} 295 296func _() { 297 /* 298 freestanding comment 299 aligned line 300 aligned line 301 */ 302} 303 304func _() { 305 /* 306 freestanding comment 307 aligned line 308 aligned line 309 */ 310} 311 312func _() { 313 /* 314 freestanding comment 315 aligned line 316 aligned line */ 317} 318 319func _() { 320 /* 321 freestanding comment 322 aligned line 323 aligned line 324 */ 325} 326 327func _() { 328 /* 329 freestanding comment 330 aligned line 331 aligned line 332 */ 333} 334 335func _() { 336 /* 337 freestanding comment 338 aligned line 339 aligned line */ 340} 341 342func _() { 343 /* freestanding comment 344 aligned line 345 */ 346} 347 348func _() { 349 /* freestanding comment 350 aligned line 351 */ 352} 353 354func _() { 355 /* freestanding comment 356 aligned line */ 357} 358 359func _() { 360 /* freestanding comment 361 aligned line 362 */ 363} 364 365func _() { 366 /* freestanding comment 367 aligned line 368 */ 369} 370 371func _() { 372 /* freestanding comment 373 aligned line */ 374} 375 376func _() { 377 /* 378 freestanding comment 379 aligned line 380 */ 381} 382 383func _() { 384 /* 385 freestanding comment 386 aligned line 387 */ 388} 389 390func _() { 391 /* 392 freestanding comment 393 aligned line */ 394} 395 396func _() { 397 /* 398 freestanding comment 399 aligned line 400 */ 401} 402 403func _() { 404 /* 405 freestanding comment 406 aligned line 407 */ 408} 409 410func _() { 411 /* 412 freestanding comment 413 aligned line */ 414} 415 416// Issue 9751. 417func _() { 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/* 511aligned in middle 512here 513 not here 514*/ 515 516/* 517blank line in middle: 518 519with 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 534func _() { 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. 556func _( /* this */ x /* is */ /* an */ int) { 557} 558 559func _( /* no params - extra blank before and after comment */ ) {} 560func _(a, b int /* params - no extra blank after comment */) {} 561 562func _() { f( /* no args - extra blank before and after comment */ ) } 563func _() { f(a, b /* args - no extra blank after comment */) } 564 565func _() { 566 f( /* no args - extra blank before and after comment */ ) 567 f(a, b /* args - no extra blank after comment */) 568} 569 570func ( /* comment1 */ T /* comment2 */) _() {} 571 572func _() { /* "short-ish one-line functions with comments are formatted as multi-line functions */ } 573func _() { x := 0; /* comment */ y = x /* comment */ } 574 575func _() { 576 _ = 0 577 /* closing curly brace should be on new line */ 578} 579 580func _() { 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. 586func _() { 587 var a = []int{1, 2 /*jasldf*/} 588 _ = a 589} 590 591func _() { 592 var a = []int{1, 2}/*jasldf 593 */ 594 595 _ = a 596} 597 598func _() { 599 var a = []int{1, 2}// jasldf 600 601 _ = a 602} 603 604// Comments immediately adjacent to punctuation followed by a newline 605// remain after the punctuation (looks better and permits alignment of 606// comments). 607func _() { 608 _ = T{ 609 1, // comment after comma 610 2, /* comment after comma */ 611 3, // comment after comma 612 } 613 _ = T{ 614 1, // comment after comma 615 2, /* comment after comma */ 616 3, // comment after comma 617 } 618 _ = T{ 619 /* comment before literal */ 1, 620 2, /* comment before comma - ok to move after comma */ 621 3, /* comment before comma - ok to move after comma */ 622 } 623 624 for i = 0; // comment after semicolon 625 i < 9; /* comment after semicolon */ 626 i++ { // comment after opening curly brace 627 } 628 629 // TODO(gri) the last comment in this example should be aligned */ 630 for i = 0; // comment after semicolon 631 i < 9; /* comment before semicolon - ok to move after semicolon */ 632 i++ /* comment before opening curly brace */ { 633 } 634} 635 636// If there is no newline following punctuation, commas move before the punctuation. 637// This way, commas interspersed in lists stay with the respective expression. 638func f(x /* comment */, y int, z int /* comment */, u, v, w int /* comment */) { 639 f(x /* comment */, y) 640 f(x, /* comment */ 641 y) 642 f( 643 x, /* comment */ 644 ) 645} 646 647func g( 648 x int, /* comment */ 649) { 650} 651 652type _ struct { 653 a, b /* comment */, c int 654} 655 656type _ struct { 657 a, b /* comment */, c int 658} 659 660func _() { 661 for a /* comment */, b := range x { 662 } 663} 664 665// Print line directives correctly. 666 667// The following is a legal line directive. 668//line foo:1 669func _() { 670 _ = 0 671 // The following is a legal line directive. It must not be indented: 672//line foo:2 673 _ = 1 674 675 // The following is not a legal line directive (it doesn't start in column 1): 676 //line foo:2 677 _ = 2 678 679 // The following is not a legal line directive (negative line number): 680 //line foo:-3 681 _ = 3 682} 683 684// Line comments with tabs 685func _() { 686 var finput *bufio.Reader // input file 687 var stderr *bufio.Writer 688 var ftable *bufio.Writer // y.go file 689 var foutput *bufio.Writer // y.output file 690 691 var oflag string // -o [y.go] - y.go file 692 var vflag string // -v [y.output] - y.output file 693 var lflag bool // -l - disable line directives 694} 695 696// Trailing white space in comments should be trimmed 697func _() { 698 // This comment has 4 blanks following that should be trimmed: 699 /* Each line of this comment has blanks or tabs following that should be trimmed: 700 line 2: 701 line 3: 702 */ 703} 704 705/* This comment is the last entry in this file. It must be printed and should be followed by a newline */ 706