// 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. package statements var expr bool func use(x interface{}) {} // Formatting of multi-line return statements. func _f() { return return x, y, z return T{} return T{1, 2, 3}, x, y, z return T{1, 2, 3}, x, y, z return T{1, 2, 3} return T{1, 2, 3, } return T{ 1, 2, 3} return T{ 1, 2, 3, } return T{ 1, T{1, 2, 3}, 3, } return T{ 1, T{1, 2, 3}, 3, } return T{ 1, T{1, 2, 3}, 3, } return T{ 1, 2, }, nil return T{ 1, 2, }, T{ x: 3, y: 4, }, nil return T{ 1, 2, }, nil return T{ 1, 2, }, T{ x: 3, y: 4, }, nil return x + y + z return func() {} return func() { _ = 0 }, T{ 1, 2, } return func() { _ = 0 } return func() T { return T { 1, 2, } } } // Formatting of multi-line returns: test cases from issue 1207. func F() (*T, os.Error) { return &T{ X: 1, Y: 2, }, nil } func G() (*T, *T, os.Error) { return &T{ X: 1, Y: 2, }, &T{ X: 3, Y: 4, }, nil } func _() interface{} { return &fileStat{ name: basename(file.name), size: mkSize(d.FileSizeHigh, d.FileSizeLow), modTime: mkModTime(d.LastWriteTime), mode: mkMode(d.FileAttributes), sys: mkSysFromFI(&d), }, nil } // Formatting of if-statement headers. func _() { if true {} if; true {} // no semicolon printed if expr{} if;expr{} // no semicolon printed if (expr){} // no parens printed if;((expr)){} // no semicolon and parens printed if x:=expr;true{ use(x)} if x:=expr; expr {use(x)} } // Formatting of switch-statement headers. func _() { switch {} switch;{} // no semicolon printed switch expr {} switch;expr{} // no semicolon printed switch (expr) {} // no parens printed switch;((expr)){} // no semicolon and parens printed switch x := expr; { default:use( x) } switch x := expr; expr {default:use(x)} } // Formatting of switch statement bodies. func _() { switch { } switch x := 0; x { case 1: use(x) use(x) // followed by an empty line case 2: // followed by an empty line use(x) // followed by an empty line case 3: // no empty lines use(x) use(x) } switch x { case 0: use(x) case 1: // this comment should have no effect on the previous or next line use(x) } switch x := 0; x { case 1: x = 0 // this comment should be indented case 2: x = 0 // this comment should not be indented, it is aligned with the next case case 3: x = 0 /* indented comment aligned aligned */ // bla /* and more */ case 4: x = 0 /* not indented comment aligned aligned */ // bla /* and more */ case 5: } } // Formatting of selected select statements. func _() { select { } select { /* this comment should not be tab-aligned because the closing } is on the same line */ } select { /* this comment should be tab-aligned */ } select { // this comment should be tab-aligned } select { case <-c: } } // Formatting of for-statement headers for single-line for-loops. func _() { for{} for expr {} for (expr) {} // no parens printed for;;{} // no semicolons printed for x :=expr;; {use( x)} for; expr;{} // no semicolons printed for; ((expr));{} // no semicolons and parens printed for; ; expr = false {} for x :=expr; expr; {use(x)} for x := expr;; expr=false {use(x)} for;expr;expr =false {} for x := expr;expr;expr = false { use(x) } for x := range []int{} { use(x) } for x := range (([]int{})) { use(x) } // no parens printed } // Formatting of for-statement headers for multi-line for-loops. func _() { for{ } for expr { } for (expr) { } // no parens printed for;;{ } // no semicolons printed for x :=expr;; {use( x) } for; expr;{ } // no semicolons printed for; ((expr));{ } // no semicolons and parens printed for; ; expr = false { } for x :=expr; expr; {use(x) } for x := expr;; expr=false {use(x) } for;expr;expr =false { } for x := expr;expr;expr = false { use(x) } for range []int{} { println("foo")} for x := range []int{} { use(x) } for x := range (([]int{})) { use(x) } // no parens printed } // Formatting of selected short single- and multi-line statements. func _() { if cond {} if cond { } // multiple lines if cond {} else {} // else clause always requires multiple lines for {} for i := 0; i < len(a); 1++ {} for i := 0; i < len(a); 1++ { a[i] = i } for i := 0; i < len(a); 1++ { a[i] = i } // multiple lines for range a{} for _ = range a{} for _, _ = range a{} for i := range a {} for i := range a { a[i] = i } for i := range a { a[i] = i } // multiple lines go func() { for { a <- <-b } }() defer func() { if x := recover(); x != nil { err = fmt.Sprintf("error: %s", x.msg) } }() } // Don't remove mandatory parentheses around composite literals in control clauses. func _() { // strip parentheses - no composite literals or composite literals don't start with a type name if (x) {} if (((x))) {} if ([]T{}) {} if (([]T{})) {} if ; (((([]T{})))) {} for (x) {} for (((x))) {} for ([]T{}) {} for (([]T{})) {} for ; (((([]T{})))) ; {} switch (x) {} switch (((x))) {} switch ([]T{}) {} switch ; (((([]T{})))) {} for _ = range ((([]T{T{42}}))) {} // leave parentheses - composite literals start with a type name if (T{}) {} if ((T{})) {} if ; ((((T{})))) {} for (T{}) {} for ((T{})) {} for ; ((((T{})))) ; {} switch (T{}) {} switch ; ((((T{})))) {} for _ = range (((T1{T{42}}))) {} if x == (T{42}[0]) {} if (x == T{42}[0]) {} if (x == (T{42}[0])) {} if (x == (((T{42}[0])))) {} if (((x == (T{42}[0])))) {} if x == a + b*(T{42}[0]) {} if (x == a + b*T{42}[0]) {} if (x == a + b*(T{42}[0])) {} if (x == a + ((b * (T{42}[0])))) {} if (((x == a + b * (T{42}[0])))) {} if (((a + b * (T{42}[0])) == x)) {} if (((a + b * (T{42}[0])))) == x {} if (struct{x bool}{false}.x) {} if (struct{x bool}{false}.x) == false {} if (struct{x bool}{false}.x == false) {} } // Extra empty lines inside functions. Do respect source code line // breaks between statement boundaries but print at most one empty // line at a time. func _() { const _ = 0 const _ = 1 type _ int type _ float var _ = 0 var x = 1 // Each use(x) call below should have at most one empty line before and after. // Known bug: The first use call may have more than one empty line before // (see go/printer/nodes.go, func linebreak). use(x) if x < x { use(x) } else { use(x) } } // Formatting around labels. func _() { L: } func _() { // this comment should be indented L: ; // no semicolon needed } func _() { switch 0 { case 0: L0: ; // semicolon required case 1: L1: ; // semicolon required default: L2: ; // no semicolon needed } } func _() { f() L1: f() L2: ; L3: } func _() { // this comment should be indented L: } func _() { L: _ = 0 } func _() { // this comment should be indented L: _ = 0 } func _() { for { L1: _ = 0 L2: _ = 0 } } func _() { // this comment should be indented for { L1: _ = 0 L2: _ = 0 } } func _() { if true { _ = 0 } _ = 0 // the indentation here should not be affected by the long label name AnOverlongLabel: _ = 0 if true { _ = 0 } _ = 0 L: _ = 0 } func _() { for { goto L } L: MoreCode() } func _() { for { goto L } L: // A comment on the same line as the label, followed by a single empty line. // Known bug: There may be more than one empty line before MoreCode() // (see go/printer/nodes.go, func linebreak). MoreCode() } func _() { for { goto L } L: // There should be a single empty line before this comment. MoreCode() } func _() { for { goto AVeryLongLabelThatShouldNotAffectFormatting } AVeryLongLabelThatShouldNotAffectFormatting: // There should be a single empty line after this comment. // There should be a single empty line before this comment. MoreCode() } // Formatting of empty statements. func _() { ;;;;;;;;;;;;;;;;;;;;;;;;; } func _() {;;;;;;;;;;;;;;;;;;;;;;;;; } func _() {;;;;;;;;;;;;;;;;;;;;;;;;;} func _() { f();;;;;;;;;;;;;;;;;;;;;;;;; } func _() { L:;;;;;;;;;;;; } func _() { L:;;;;;;;;;;;; f() }