• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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}
556