| // 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() |
| } |