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

import "io"

import (
	_ "io"
)

import _ "io"

import (
	"io";
	"io";
	"io";
)

import (
	"io";
	aLongRename "io";

	b "io";
	c "i" "o";
)

// no newlines between consecutive single imports, but
// respect extra line breaks in the source (at most one empty line)
import _ "io"
import _ "io"
import _ "io"

import _ "os"
import _ "os"
import _ "os"


import _ "fmt"
import _ "fmt"
import _ "fmt"


// at least one empty line between declarations of different kind
import _ "io"
var _ int;


func _() {
	// the following decls need a semicolon at the end
	type _ int;
	type _ *int;
	type _ []int;
	type _ map[string]int;
	type _ chan int;
	type _ func() int;

	var _ int;
	var _ *int;
	var _ []int;
	var _ map[string]int;
	var _ chan int;
	var _ func() int;

	// the following decls don't need a semicolon at the end
	type _ struct{}
	type _ *struct{}
	type _ []struct{}
	type _ map[string]struct{}
	type _ chan struct{}
	type _ func() struct{}

	type _ interface{}
	type _ *interface{}
	type _ []interface{}
	type _ map[string]interface{}
	type _ chan interface{}
	type _ func() interface{}

	var _ struct{}
	var _ *struct{}
	var _ []struct{}
	var _ map[string]struct{}
	var _ chan struct{}
	var _ func() struct{}

	var _ interface{}
	var _ *interface{}
	var _ []interface{}
	var _ map[string]interface{}
	var _ chan interface{}
	var _ func() interface{}
}


// don't lose blank lines in grouped declarations
const (
	_ int = 0;
	_ float = 1;

	_ string = "foo";

	_ = iota;
	_;
	
	// a comment
	_;

	_;
)


type (
	_ int;
	_ struct {};
	
	_ interface{};
	
	// a comment
	_ map[string]int;
)


var (
	_ int = 0;
	_ float = 1;

	_ string = "foo";

	_ bool;
	
	// a comment
	_ bool;
)


// don't lose blank lines in this struct
type _ struct {
	String struct {
		Str, Len int;
	};
	Slice struct {
		Array, Len, Cap int;
	};
	Eface struct {
		Typ, Ptr int;
	};

	UncommonType struct {
		Name, PkgPath int;
	};
	CommonType struct {
		Size, Hash, Alg, Align, FieldAlign, String, UncommonType int;
	};
	Type struct {
		Typ, Ptr int;
	};
	StructField struct {
		Name, PkgPath, Typ, Tag, Offset int;
	};
	StructType struct {
		Fields int;
	};
	PtrType struct {
		Elem int;
	};
	SliceType struct {
		Elem int;
	};
	ArrayType struct {
		Elem, Len int;
	};

	Stktop struct {
		Stackguard, Stackbase, Gobuf int;
	};
	Gobuf struct {
		Sp, Pc, G int;
	};
	G struct {
		Stackbase, Sched, Status, Alllink int;
	};
}


// no tabs for single or ungrouped decls
func _() {
	const xxxxxx = 0;
	type x int;
	var xxx int;
	var yyyy float = 3.14;
	var zzzzz = "bar";

	const (
		xxxxxx = 0;
	)
	type (
		x int;
	)
	var (
		xxx int;
	)
	var (
		yyyy float = 3.14;
	)
	var (
		zzzzz = "bar";
	)
}

// tabs for multiple or grouped decls
func _() {
	// no entry has a type
	const (
		zzzzzz = 1;
		z = 2;
		zzz = 3;
	)
	// some entries have a type
	const (
		xxxxxx = 1;
		x = 2;
		xxx = 3;
		yyyyyyyy float = iota;
		yyyy = "bar";
		yyy;
		yy = 2;
	)
}

func _() {
	// no entry has a type
	var (
		zzzzzz = 1;
		z = 2;
		zzz = 3;
	)
	// no entry has a value
	var (
		_ int;
		_ float;
		_ string;

		_ int;  // comment
		_ float;  // comment
		_ string;  // comment
	)
	// some entries have a type
	var (
		xxxxxx int;
		x float;
		xxx string;
		yyyyyyyy int = 1234;
		y float = 3.14;
		yyyy = "bar";
		yyy string = "foo";
	)
	// mixed entries - all comments should be aligned
	var (
		a, b, c int;
		x = 10;
		d int;  // comment
		y = 20;  // comment
		f, ff, fff, ffff int = 0, 1, 2, 3;  // comment
	)
	// respect original line breaks
	var _ = []T {
		T{0x20,	"Telugu"}
	};
	var _ = []T {
		// respect original line breaks
		T{0x20,	"Telugu"}
	};
}

func _() {
	type (
		xxxxxx int;
		x float;
		xxx string;
		xxxxx []x;
		xx struct{};
		xxxxxxx struct {
			_, _ int;
			_ float;
		};
		xxxx chan<- string;
	)
}


// formatting of structs
type _ struct{}

type _ struct{ /* this comment should be visible */ }

type _ struct{
	// this comment should be visible and properly indented
}

type _ struct {  // this comment must not change indentation
	f int;
	f, ff, fff, ffff int;
}

type _ struct {
	string;
}

type _ struct {
	string;  // comment
}

type _ struct {
	string "tag"
}

type _ struct {
	string "tag"  // comment
}

type _ struct {
	f int;
}

type _ struct {
	f int;  // comment
}

type _ struct {
	f int "tag";
}

type _ struct {
	f int "tag";  // comment
}

type _ struct {
	bool;
	a, b, c int;
	int "tag";
	ES; // comment
	float "tag";  // comment
	f int;  // comment
	f, ff, fff, ffff int;  // comment
	g float "tag";
	h float "tag";  // comment
}


// difficult cases
type _ struct {
	bool;  // comment
	text []byte;  // comment
}



// formatting of interfaces
type EI interface{}

type _ interface {
	EI;
}

type _ interface {
	f();
	fffff();
}

type _ interface {
	EI;
	f();
	fffffg();
}

type _ interface {  // this comment must not change indentation
	EI;  // here's a comment
	f();  // no blank between identifier and ()
	fffff();  // no blank between identifier and ()
	gggggggggggg(x, y, z int) ();  // hurray
}

// formatting of variable declarations
func _() {
	type day struct { n int; short, long string };
	var (
		Sunday = day{ 0, "SUN", "Sunday" };
		Monday = day{ 1, "MON", "Monday" };
		Tuesday = day{ 2, "TUE", "Tuesday" };
		Wednesday = day{ 3, "WED", "Wednesday" };
		Thursday = day{ 4, "THU", "Thursday" };
		Friday = day{ 5, "FRI", "Friday" };
		Saturday = day{ 6, "SAT", "Saturday" };
	)
}


func _() {
	var Universe = Scope {
		Names: map[string]*Ident {
			// basic types
			"bool": nil,
			"byte": nil,
			"int8": nil,
			"int16": nil,
			"int32": nil,
			"int64": nil,
			"uint8": nil,
			"uint16": nil,
			"uint32": nil,
			"uint64": nil,
			"float32": nil,
			"float64": nil,
			"string": nil,

			// convenience types
			"int": nil,
			"uint": nil,
			"uintptr": nil,
			"float": nil,

			// constants
			"false": nil,
			"true": nil,
			"iota": nil,
			"nil": nil,

			// functions
			"cap": nil,
			"len": nil,
			"new": nil,
			"make": nil,
			"panic": nil,
			"panicln": nil,
			"print": nil,
			"println": nil,
		}
	}
}


// formatting of consecutive single-line functions
func _() {}
func _() {}
func _() {}

func _() {}  // an empty line before this function
func _() {}
func _() {}

func _() {
	f(1, 2, 3);
}
func _(x int) int {
	return x+1
}
func _() int {
	type T struct{}
}
