// 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 {
	}
	if {
	}	// 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; {
		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);
	}
}


// 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.



	use(x);

	if x < x {

		use(x);

	} else {

		use(x);

	}
}


// Formatting around labels.
func _() {
L:
	;
}


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 {
		_ = 0;
	}
	_ = 0;	// the indentation here should not be affected by the long label name
AnOverlongLabel:
	_ = 0;

	if {
		_ = 0;
	}
	_ = 0;

L:	_ = 0;
}
