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
5package statements
6
7var expr bool
8
9func use(x interface{}) {}
10
11// Formatting of multi-line return statements.
12func _f() {
13 return
14 return x, y, z
15 return T{}
16 return T{1, 2, 3},
17 x, y, z
18 return T{1, 2, 3},
19 x, y,
20 z
21 return T{1,
22 2,
23 3}
24 return T{1,
25 2,
26 3,
27 }
28 return T{
29 1,
30 2,
31 3}
32 return T{
33 1,
34 2,
35 3,
36 }
37 return T{
38 1,
39 T{1, 2, 3},
40 3,
41 }
42 return T{
43 1,
44 T{1,
45 2, 3},
46 3,
47 }
48 return T{
49 1,
50 T{1,
51 2,
52 3},
53 3,
54 }
55 return T{
56 1,
57 2,
58 }, nil
59 return T{
60 1,
61 2,
62 },
63 T{
64 x: 3,
65 y: 4,
66 }, nil
67 return T{
68 1,
69 2,
70 },
71 nil
72 return T{
73 1,
74 2,
75 },
76 T{
77 x: 3,
78 y: 4,
79 },
80 nil
81 return x + y +
82 z
83 return func() {}
84 return func() {
85 _ = 0
86 }, T{
87 1, 2,
88 }
89 return func() {
90 _ = 0
91 }
92 return func() T {
93 return T {
94 1, 2,
95 }
96 }
97}
98
99// Formatting of multi-line returns: test cases from issue 1207.
100func F() (*T, os.Error) {
101 return &T{
102 X: 1,
103 Y: 2,
104 },
105 nil
106}
107
108func G() (*T, *T, os.Error) {
109 return &T{
110 X: 1,
111 Y: 2,
112 },
113 &T{
114 X: 3,
115 Y: 4,
116 },
117 nil
118}
119
120func _() interface{} {
121 return &fileStat{
122 name: basename(file.name),
123 size: mkSize(d.FileSizeHigh, d.FileSizeLow),
124 modTime: mkModTime(d.LastWriteTime),
125 mode: mkMode(d.FileAttributes),
126 sys: mkSysFromFI(&d),
127 }, nil
128}
129
130// Formatting of if-statement headers.
131func _() {
132 if true {}
133 if; true {} // no semicolon printed
134 if expr{}
135 if;expr{} // no semicolon printed
136 if (expr){} // no parens printed
137 if;((expr)){} // no semicolon and parens printed
138 if x:=expr;true{
139 use(x)}
140 if x:=expr; expr {use(x)}
141}
142
143
144// Formatting of switch-statement headers.
145func _() {
146 switch {}
147 switch;{} // no semicolon printed
148 switch expr {}
149 switch;expr{} // no semicolon printed
150 switch (expr) {} // no parens printed
151 switch;((expr)){} // no semicolon and parens printed
152 switch x := expr; { default:use(
153x)
154 }
155 switch x := expr; expr {default:use(x)}
156}
157
158
159// Formatting of switch statement bodies.
160func _() {
161 switch {
162 }
163
164 switch x := 0; x {
165 case 1:
166 use(x)
167 use(x) // followed by an empty line
168
169 case 2: // followed by an empty line
170
171 use(x) // followed by an empty line
172
173 case 3: // no empty lines
174 use(x)
175 use(x)
176 }
177
178 switch x {
179 case 0:
180 use(x)
181 case 1: // this comment should have no effect on the previous or next line
182 use(x)
183 }
184
185 switch x := 0; x {
186 case 1:
187 x = 0
188 // this comment should be indented
189 case 2:
190 x = 0
191 // this comment should not be indented, it is aligned with the next case
192 case 3:
193 x = 0
194 /* indented comment
195 aligned
196 aligned
197 */
198 // bla
199 /* and more */
200 case 4:
201 x = 0
202 /* not indented comment
203 aligned
204 aligned
205 */
206 // bla
207 /* and more */
208 case 5:
209 }
210}
211
212
213// Formatting of selected select statements.
214func _() {
215 select {
216 }
217 select { /* this comment should not be tab-aligned because the closing } is on the same line */ }
218 select { /* this comment should be tab-aligned */
219 }
220 select { // this comment should be tab-aligned
221 }
222 select { case <-c: }
223}
224
225
226// Formatting of for-statement headers for single-line for-loops.
227func _() {
228 for{}
229 for expr {}
230 for (expr) {} // no parens printed
231 for;;{} // no semicolons printed
232 for x :=expr;; {use( x)}
233 for; expr;{} // no semicolons printed
234 for; ((expr));{} // no semicolons and parens printed
235 for; ; expr = false {}
236 for x :=expr; expr; {use(x)}
237 for x := expr;; expr=false {use(x)}
238 for;expr;expr =false {}
239 for x := expr;expr;expr = false { use(x) }
240 for x := range []int{} { use(x) }
241 for x := range (([]int{})) { use(x) } // no parens printed
242}
243
244
245// Formatting of for-statement headers for multi-line for-loops.
246func _() {
247 for{
248 }
249 for expr {
250 }
251 for (expr) {
252 } // no parens printed
253 for;;{
254 } // no semicolons printed
255 for x :=expr;; {use( x)
256 }
257 for; expr;{
258 } // no semicolons printed
259 for; ((expr));{
260 } // no semicolons and parens printed
261 for; ; expr = false {
262 }
263 for x :=expr; expr; {use(x)
264 }
265 for x := expr;; expr=false {use(x)
266 }
267 for;expr;expr =false {
268 }
269 for x := expr;expr;expr = false {
270 use(x)
271 }
272 for range []int{} {
273 println("foo")}
274 for x := range []int{} {
275 use(x) }
276 for x := range (([]int{})) {
277 use(x) } // no parens printed
278}
279
280
281// Formatting of selected short single- and multi-line statements.
282func _() {
283 if cond {}
284 if cond {
285 } // multiple lines
286 if cond {} else {} // else clause always requires multiple lines
287
288 for {}
289 for i := 0; i < len(a); 1++ {}
290 for i := 0; i < len(a); 1++ { a[i] = i }
291 for i := 0; i < len(a); 1++ { a[i] = i
292 } // multiple lines
293
294 for range a{}
295 for _ = range a{}
296 for _, _ = range a{}
297 for i := range a {}
298 for i := range a { a[i] = i }
299 for i := range a { a[i] = i
300 } // multiple lines
301
302 go func() { for { a <- <-b } }()
303 defer func() { if x := recover(); x != nil { err = fmt.Sprintf("error: %s", x.msg) } }()
304}
305
306
307// Don't remove mandatory parentheses around composite literals in control clauses.
308func _() {
309 // strip parentheses - no composite literals or composite literals don't start with a type name
310 if (x) {}
311 if (((x))) {}
312 if ([]T{}) {}
313 if (([]T{})) {}
314 if ; (((([]T{})))) {}
315
316 for (x) {}
317 for (((x))) {}
318 for ([]T{}) {}
319 for (([]T{})) {}
320 for ; (((([]T{})))) ; {}
321
322 switch (x) {}
323 switch (((x))) {}
324 switch ([]T{}) {}
325 switch ; (((([]T{})))) {}
326
327 for _ = range ((([]T{T{42}}))) {}
328
329 // leave parentheses - composite literals start with a type name
330 if (T{}) {}
331 if ((T{})) {}
332 if ; ((((T{})))) {}
333
334 for (T{}) {}
335 for ((T{})) {}
336 for ; ((((T{})))) ; {}
337
338 switch (T{}) {}
339 switch ; ((((T{})))) {}
340
341 for _ = range (((T1{T{42}}))) {}
342
343 if x == (T{42}[0]) {}
344 if (x == T{42}[0]) {}
345 if (x == (T{42}[0])) {}
346 if (x == (((T{42}[0])))) {}
347 if (((x == (T{42}[0])))) {}
348 if x == a + b*(T{42}[0]) {}
349 if (x == a + b*T{42}[0]) {}
350 if (x == a + b*(T{42}[0])) {}
351 if (x == a + ((b * (T{42}[0])))) {}
352 if (((x == a + b * (T{42}[0])))) {}
353 if (((a + b * (T{42}[0])) == x)) {}
354 if (((a + b * (T{42}[0])))) == x {}
355
356 if (struct{x bool}{false}.x) {}
357 if (struct{x bool}{false}.x) == false {}
358 if (struct{x bool}{false}.x == false) {}
359}
360
361
362// Extra empty lines inside functions. Do respect source code line
363// breaks between statement boundaries but print at most one empty
364// line at a time.
365func _() {
366
367 const _ = 0
368
369 const _ = 1
370 type _ int
371 type _ float
372
373 var _ = 0
374 var x = 1
375
376 // Each use(x) call below should have at most one empty line before and after.
377 // Known bug: The first use call may have more than one empty line before
378 // (see go/printer/nodes.go, func linebreak).
379
380
381
382 use(x)
383
384 if x < x {
385
386 use(x)
387
388 } else {
389
390 use(x)
391
392 }
393}
394
395
396// Formatting around labels.
397func _() {
398 L:
399}
400
401
402func _() {
403 // this comment should be indented
404 L: ; // no semicolon needed
405}
406
407
408func _() {
409 switch 0 {
410 case 0:
411 L0: ; // semicolon required
412 case 1:
413 L1: ; // semicolon required
414 default:
415 L2: ; // no semicolon needed
416 }
417}
418
419
420func _() {
421 f()
422L1:
423 f()
424L2:
425 ;
426L3:
427}
428
429
430func _() {
431 // this comment should be indented
432 L:
433}
434
435
436func _() {
437 L: _ = 0
438}
439
440
441func _() {
442 // this comment should be indented
443 L: _ = 0
444}
445
446
447func _() {
448 for {
449 L1: _ = 0
450 L2:
451 _ = 0
452 }
453}
454
455
456func _() {
457 // this comment should be indented
458 for {
459 L1: _ = 0
460 L2:
461 _ = 0
462 }
463}
464
465
466func _() {
467 if true {
468 _ = 0
469 }
470 _ = 0 // the indentation here should not be affected by the long label name
471AnOverlongLabel:
472 _ = 0
473
474 if true {
475 _ = 0
476 }
477 _ = 0
478
479L: _ = 0
480}
481
482
483func _() {
484 for {
485 goto L
486 }
487L:
488
489 MoreCode()
490}
491
492
493func _() {
494 for {
495 goto L
496 }
497L: // A comment on the same line as the label, followed by a single empty line.
498 // Known bug: There may be more than one empty line before MoreCode()
499 // (see go/printer/nodes.go, func linebreak).
500
501
502
503
504 MoreCode()
505}
506
507
508func _() {
509 for {
510 goto L
511 }
512L:
513
514
515
516
517 // There should be a single empty line before this comment.
518 MoreCode()
519}
520
521
522func _() {
523 for {
524 goto AVeryLongLabelThatShouldNotAffectFormatting
525 }
526AVeryLongLabelThatShouldNotAffectFormatting:
527 // There should be a single empty line after this comment.
528
529 // There should be a single empty line before this comment.
530 MoreCode()
531}
532
533
534// Formatting of empty statements.
535func _() {
536 ;;;;;;;;;;;;;;;;;;;;;;;;;
537}
538
539func _() {;;;;;;;;;;;;;;;;;;;;;;;;;
540}
541
542func _() {;;;;;;;;;;;;;;;;;;;;;;;;;}
543
544func _() {
545f();;;;;;;;;;;;;;;;;;;;;;;;;
546}
547
548func _() {
549L:;;;;;;;;;;;;
550}
551
552func _() {
553L:;;;;;;;;;;;;
554 f()
555}
View as plain text