blob: 21e61efc4f8f308d38bde6d6eb60f8fd59212217 [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.
package statements
var expr bool
func use(x interface{}) {}
// 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 for-statement headers.
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
}
// 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()
}