// 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{}
}
