...

Text file src/go/printer/testdata/statements.input

Documentation: go/printer/testdata

     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