blob: 1a21fff331473753c408478c794099348c8e140e [file] [log] [blame]
// Copyright 2009 The Go Authors. All rights reserved.
// Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file.
// This is a package for testing comment placement by go/printer.
//
package main
import "fmt" // fmt
const c0 = 0 // zero
const (
c1 = iota // c1
c2 // c2
)
// Alignment of comments in declarations>
const (
_ T = iota // comment
_ // comment
_ // comment
_ = iota + 10
_ // comments
_ = 10 // comment
_ T = 20 // comment
)
const (
_____ = iota // foo
_ // bar
_ = 0 // bal
_ // bat
)
const (
_ T = iota // comment
_ // comment
_ // comment
_ = iota + 10
_ // comment
_ = 10
_ = 20 // comment
_ T = 0 // comment
)
// The SZ struct; it is empty.
type SZ struct{}
// The S0 struct; no field is exported.
type S0 struct {
int
x, y, z int // 3 unexported fields
}
// The S1 struct; some fields are not exported.
type S1 struct {
S0
A, B, C float // 3 exported fields
D, b, c int // 2 unexported fields
}
// The S2 struct; all fields are exported.
type S2 struct {
S1
A, B, C float // 3 exported fields
}
// The IZ interface; it is empty.
type SZ interface{}
// The I0 interface; no method is exported.
type I0 interface {
f(x int) int // unexported method
}
// The I1 interface; some methods are not exported.
type I1 interface {
I0
F(x float) float // exported methods
g(x int) int // unexported method
}
// The I2 interface; all methods are exported.
type I2 interface {
I0
F(x float) float // exported method
G(x float) float // exported method
}
// The S3 struct; all comments except for the last one must appear in the export.
type S3 struct {
// lead comment for F1
F1 int // line comment for F1
// lead comment for F2
F2 int // line comment for F2
f3 int // f3 is not exported
}
// This comment group should be separated
// with a newline from the next comment
// group.
// This comment should NOT be associated with the next declaration.
var x int // x
var ()
// This comment SHOULD be associated with f0.
func f0() {
const pi = 3.14 // pi
var s1 struct{} /* an empty struct */ /* foo */
// a struct constructor
// --------------------
var s2 struct{} = struct{}{}
x := pi
}
//
// This comment should be associated with f1, with one blank line before the comment.
//
func f1() {
f0()
/* 1 */
// 2
/* 3 */
/* 4 */
f0()
}
func _() {
// this comment should be properly indented
}
func _(x int) int {
if x < 0 { // the tab printed before this comment's // must not affect the remaining lines
return -x // this statement should be properly indented
}
if x < 0 { /* the tab printed before this comment's /* must not affect the remaining lines */
return -x // this statement should be properly indented
}
return x
}
func typeswitch(x interface{}) {
switch v := x.(type) {
case bool, int, float:
case string:
default:
}
switch x.(type) {
}
switch v0, ok := x.(int); v := x.(type) {
}
switch v0, ok := x.(int); x.(type) {
case byte: // this comment should be on the same line as the keyword
// this comment should be normally indented
_ = 0
case bool, int, float:
// this comment should be indented
case string:
default:
// this comment should be indented
}
// this comment should not be indented
}
//
// Indentation of comments after possibly indented multi-line constructs
// (test cases for issue 3147).
//
func _() {
s := 1 +
2
// should be indented like s
}
func _() {
s := 1 +
2 // comment
// should be indented like s
}
func _() {
s := 1 +
2 // comment
// should be indented like s
_ = 0
}
func _() {
s := 1 +
2
// should be indented like s
_ = 0
}
func _() {
s := 1 +
2
// should be indented like s
}
func _() {
s := 1 +
2 // comment
// should be indented like s
}
func _() {
s := 1 +
2 // comment
// should be indented like s
_ = 0
}
func _() {
s := 1 +
2
// should be indented like s
_ = 0
}
// Test case from issue 3147.
func f() {
templateText := "a" + // A
"b" + // B
"c" // C
// should be aligned with f()
f()
}
// Modified test case from issue 3147.
func f() {
templateText := "a" + // A
"b" + // B
"c" // C
// may not be aligned with f() (source is not aligned)
f()
}
//
// Test cases for alignment of lines in general comments.
//
func _() {
/* freestanding comment
aligned line
aligned line
*/
}
func _() {
/* freestanding comment
aligned line
aligned line
*/
}
func _() {
/* freestanding comment
aligned line
aligned line */
}
func _() {
/* freestanding comment
aligned line
aligned line
*/
}
func _() {
/* freestanding comment
aligned line
aligned line
*/
}
func _() {
/* freestanding comment
aligned line
aligned line */
}
func _() {
/*
freestanding comment
aligned line
aligned line
*/
}
func _() {
/*
freestanding comment
aligned line
aligned line
*/
}
func _() {
/*
freestanding comment
aligned line
aligned line */
}
func _() {
/*
freestanding comment
aligned line
aligned line
*/
}
func _() {
/*
freestanding comment
aligned line
aligned line
*/
}
func _() {
/*
freestanding comment
aligned line
aligned line */
}
func _() {
/* freestanding comment
aligned line
*/
}
func _() {
/* freestanding comment
aligned line
*/
}
func _() {
/* freestanding comment
aligned line */
}
func _() {
/* freestanding comment
aligned line
*/
}
func _() {
/* freestanding comment
aligned line
*/
}
func _() {
/* freestanding comment
aligned line */
}
func _() {
/*
freestanding comment
aligned line
*/
}
func _() {
/*
freestanding comment
aligned line
*/
}
func _() {
/*
freestanding comment
aligned line */
}
func _() {
/*
freestanding comment
aligned line
*/
}
func _() {
/*
freestanding comment
aligned line
*/
}
func _() {
/*
freestanding comment
aligned line */
}
// Issue 9751.
func _() {
/*a string
b string*/
/*A string
Z string*/
/*a string
b string
c string*/
{
/*a string
b string*/
/*a string
b string*/
/*a string
b string
c string*/
}
{
/*a string
b string*/
/*a string
b string*/
/*a string
b string
c string*/
}
/*
*/
/*
*/
/*
* line
*/
}
/*
* line
* of
* stars
*/
/* another line
* of
* stars */
/* and another line
* of
* stars */
/* a line of
* stars */
/* and another line of
* stars */
/* a line of stars
*/
/* and another line of
*/
/* a line of stars
*/
/* and another line of
*/
/*
aligned in middle
here
not here
*/
/*
blank line in middle:
with no leading spaces on blank line.
*/
/*
aligned in middle
here
not here
*/
/*
blank line in middle:
with no leading spaces on blank line.
*/
func _() {
/*
* line
* of
* stars
*/
/*
aligned in middle
here
not here
*/
/*
blank line in middle:
with no leading spaces on blank line.
*/
}
// Some interesting interspersed comments.
// See below for more common cases.
func _( /* this */ x /* is */ /* an */ int) {
}
func _( /* no params - extra blank before and after comment */ ) {}
func _(a, b int /* params - no extra blank after comment */) {}
func _() { f( /* no args - extra blank before and after comment */ ) }
func _() { f(a, b /* args - no extra blank after comment */) }
func _() {
f( /* no args - extra blank before and after comment */ )
f(a, b /* args - no extra blank after comment */)
}
func ( /* comment1 */ T /* comment2 */) _() {}
func _() { /* "short-ish one-line functions with comments are formatted as multi-line functions */ }
func _() { x := 0; /* comment */ y = x /* comment */ }
func _() {
_ = 0
/* closing curly brace should be on new line */
}
func _() {
_ = []int{0, 1 /* don't introduce a newline after this comment - was issue 1365 */}
}
// Test cases from issue 1542:
// Comments must not be placed before commas and cause invalid programs.
func _() {
var a = []int{1, 2 /*jasldf*/}
_ = a
}
func _() {
var a = []int{1, 2}/*jasldf
*/
_ = a
}
func _() {
var a = []int{1, 2}// jasldf
_ = a
}
// Test cases from issues 11274, 15137:
// Semicolon must not be lost when multiple statements are on the same line with a comment.
func _() {
x := 0 /**/
y := 1
}
func _() {
f()
f()
f() /* comment */
f()
f() /* comment */
f()
f() /* a */ /* b */
f()
f() /* a */ /* b */
f()
f() /* a */ /* b */
f()
}
func _() {
f() /* a */ /* b */
}
// Comments immediately adjacent to punctuation followed by a newline
// remain after the punctuation (looks better and permits alignment of
// comments).
func _() {
_ = T{
1, // comment after comma
2, /* comment after comma */
3, // comment after comma
}
_ = T{
1, // comment after comma
2, /* comment after comma */
3, // comment after comma
}
_ = T{
/* comment before literal */ 1,
2, /* comment before comma - ok to move after comma */
3, /* comment before comma - ok to move after comma */
}
for i = 0; // comment after semicolon
i < 9; /* comment after semicolon */
i++ { // comment after opening curly brace
}
// TODO(gri) the last comment in this example should be aligned */
for i = 0; // comment after semicolon
i < 9; /* comment before semicolon - ok to move after semicolon */
i++ /* comment before opening curly brace */ {
}
}
// If there is no newline following punctuation, commas move before the punctuation.
// This way, commas interspersed in lists stay with the respective expression.
func f(x /* comment */, y int, z int /* comment */, u, v, w int /* comment */) {
f(x /* comment */, y)
f(x, /* comment */
y)
f(
x, /* comment */
)
}
func g(
x int, /* comment */
) {
}
type _ struct {
a, b /* comment */, c int
}
type _ struct {
a, b /* comment */, c int
}
func _() {
for a /* comment */, b := range x {
}
}
// Print line directives correctly.
// The following is a legal line directive.
//line foo:1
func _() {
_ = 0
// The following is a legal line directive. It must not be indented:
//line foo:2
_ = 1
// The following is not a legal line directive (it doesn't start in column 1):
//line foo:2
_ = 2
// The following is not a legal line directive (missing colon):
//line foo -3
_ = 3
}
// Line comments with tabs
func _() {
var finput *bufio.Reader // input file
var stderr *bufio.Writer
var ftable *bufio.Writer // y.go file
var foutput *bufio.Writer // y.output file
var oflag string // -o [y.go] - y.go file
var vflag string // -v [y.output] - y.output file
var lflag bool // -l - disable line directives
}
// Trailing white space in comments should be trimmed
func _() {
// This comment has 4 blanks following that should be trimmed:
/* Each line of this comment has blanks or tabs following that should be trimmed:
line 2:
line 3:
*/
}
var _ = []T{ /* lone comment */ }
var _ = []T{
/* lone comment */
}
var _ = []T{
// lone comments
// in composite lit
}
var _ = [][]T{
{
// lone comments
// in composite lit
},
}
// TODO: gofmt doesn't add these tabs; make it so that these golden
// tests run the printer in a way that it's exactly like gofmt.
var _ = []T{ // lone comment
}
var _ = []T{ // lone comments
// in composite lit
}
/* This comment is the last entry in this file. It must be printed and should be followed by a newline */