| // 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" | 
 | ) | 
 |  | 
 | import ( | 
 | 	"unrenamed" | 
 | 	renamed "renameMe" | 
 | 	. "io" | 
 | 	_ "io" | 
 | 	"io" | 
 | 	. "os" | 
 | ) | 
 |  | 
 | // 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" | 
 |  | 
 | import "foo"	// a comment | 
 | import "bar"	// a comment | 
 |  | 
 | import ( | 
 | 	_ "foo" | 
 | 	// a comment | 
 | 	"bar" | 
 | 	"foo"	// a comment | 
 | 	"bar"	// a comment | 
 | ) | 
 |  | 
 | // comments + renames | 
 | import ( | 
 | 	"unrenamed"	// a comment | 
 | 	renamed "renameMe" | 
 | 	. "io"		/* a comment */ | 
 | 	_ "io/ioutil"	// a comment | 
 | 	"io"		// testing alignment | 
 | 	. "os" | 
 | 	// a comment | 
 | ) | 
 |  | 
 | // a case that caused problems in the past (comment placement) | 
 | import ( | 
 | 	. "fmt" | 
 | 	"io" | 
 | 	"malloc"	// for the malloc count test only | 
 | 	"math" | 
 | 	"strings" | 
 | 	"testing" | 
 | ) | 
 |  | 
 | // more import examples | 
 | import ( | 
 | 	"xxx" | 
 | 	"much_longer_name"	// comment | 
 | 	"short_name"		// comment | 
 | ) | 
 |  | 
 | import ( | 
 | 	_ "xxx" | 
 | 	"much_longer_name"	// comment | 
 | ) | 
 |  | 
 | import ( | 
 | 	mymath "math" | 
 | 	"/foo/bar/long_package_path"	// a comment | 
 | ) | 
 |  | 
 | import ( | 
 | 	"package_a"	// comment | 
 | 	"package_b" | 
 | 	my_better_c "package_c"	// comment | 
 | 	"package_d"		// comment | 
 | 	my_e "package_e"	// comment | 
 |  | 
 | 	"package_a"	// comment | 
 | 	"package_bb" | 
 | 	"package_ccc"	// comment | 
 | 	"package_dddd"	// comment | 
 | ) | 
 |  | 
 | // print import paths as double-quoted strings | 
 | // (we would like more test cases but the go/parser | 
 | // already excludes most incorrect paths, and we don't | 
 | // bother setting up test-ASTs manually) | 
 | import ( | 
 | 	"fmt" | 
 | 	"math" | 
 | ) | 
 |  | 
 | // at least one empty line between declarations of different kind | 
 | import _ "io" | 
 |  | 
 | var _ int | 
 |  | 
 | // at least one empty line between declarations of the same kind | 
 | // if there is associated documentation (was issue 2570) | 
 | type T1 struct{} | 
 |  | 
 | // T2 comment | 
 | type T2 struct { | 
 | }	// should be a two-line struct | 
 |  | 
 | // T3 comment | 
 | type T2 struct { | 
 | }	// should be a two-line struct | 
 |  | 
 | // printing of constant literals | 
 | const ( | 
 | 	_	= "foobar" | 
 | 	_	= "a۰۱۸" | 
 | 	_	= "foo६४" | 
 | 	_	= "bar9876" | 
 | 	_	= 0 | 
 | 	_	= 1 | 
 | 	_	= 123456789012345678890 | 
 | 	_	= 01234567 | 
 | 	_	= 0xcafebabe | 
 | 	_	= 0. | 
 | 	_	= .0 | 
 | 	_	= 3.14159265 | 
 | 	_	= 1e0 | 
 | 	_	= 1e+100 | 
 | 	_	= 1e-100 | 
 | 	_	= 2.71828e-1000 | 
 | 	_	= 0i | 
 | 	_	= 1i | 
 | 	_	= 012345678901234567889i | 
 | 	_	= 123456789012345678890i | 
 | 	_	= 0.i | 
 | 	_	= .0i | 
 | 	_	= 3.14159265i | 
 | 	_	= 1e0i | 
 | 	_	= 1e+100i | 
 | 	_	= 1e-100i | 
 | 	_	= 2.71828e-1000i | 
 | 	_	= 'a' | 
 | 	_	= '\000' | 
 | 	_	= '\xFF' | 
 | 	_	= '\uff16' | 
 | 	_	= '\U0000ff16' | 
 | 	_	= `foobar` | 
 | 	_	= `foo | 
 | --- | 
 | --- | 
 | bar` | 
 | ) | 
 |  | 
 | func _() { | 
 | 	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 | 
 |  | 
 | 	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 blank lines in empty structs and interfaces, but leave 1- or 2-line layout alone | 
 | type _ struct{} | 
 | type _ struct { | 
 | } | 
 |  | 
 | type _ interface{} | 
 | type _ interface { | 
 | } | 
 |  | 
 | // 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"}, | 
 | 	} | 
 | } | 
 |  | 
 | // use the formatted output rather than the input to decide when to align | 
 | // (was issue 4505) | 
 | const ( | 
 | 	short		= 2 * (1 + 2) | 
 | 	aMuchLongerName	= 3 | 
 | ) | 
 |  | 
 | var ( | 
 | 	short		= X{} | 
 | 	aMuchLongerName	= X{} | 
 |  | 
 | 	x1	= X{}	// foo | 
 | 	x2	= X{}	// foo | 
 | ) | 
 |  | 
 | func _() { | 
 | 	type ( | 
 | 		xxxxxx	int | 
 | 		x	float | 
 | 		xxx	string | 
 | 		xxxxx	[]x | 
 | 		xx	struct{} | 
 | 		xxxxxxx	struct { | 
 | 			_, _	int | 
 | 			_	float | 
 | 		} | 
 | 		xxxx	chan<- string | 
 | 	) | 
 | } | 
 |  | 
 | // alignment of "=" in consecutive lines (extended example from issue 1414) | 
 | const ( | 
 | 	umax	uint	= ^uint(0)		// maximum value for a uint | 
 | 	bpu		= 1 << (5 + umax>>63)	// bits per uint | 
 | 	foo | 
 | 	bar	= -1 | 
 | ) | 
 |  | 
 | // typical enum | 
 | const ( | 
 | 	a	MyType	= iota | 
 | 	abcd | 
 | 	b | 
 | 	c | 
 | 	def | 
 | ) | 
 |  | 
 | // excerpt from godoc.go | 
 | var ( | 
 | 	goroot		= flag.String("goroot", runtime.GOROOT(), "Go root directory") | 
 | 	testDir		= flag.String("testdir", "", "Go root subdirectory - for testing only (faster startups)") | 
 | 	pkgPath		= flag.String("path", "", "additional package directories (colon-separated)") | 
 | 	filter		= flag.String("filter", "", "filter file containing permitted package directory paths") | 
 | 	filterMin	= flag.Int("filter_minutes", 0, "filter file update interval in minutes; disabled if <= 0") | 
 | 	filterDelay	delayTime	// actual filter update interval in minutes; usually filterDelay == filterMin, but filterDelay may back off exponentially | 
 | ) | 
 |  | 
 | // 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 | 
 | } | 
 |  | 
 | type _ struct { | 
 | 	a, b, | 
 | 	c, d	int	// this line should be indented | 
 | 	u, v, w, x	float	// this line should be indented | 
 | 	p, q, | 
 | 	r, s	float	// this line should be indented | 
 | } | 
 |  | 
 | // 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"} | 
 | 	) | 
 | } | 
 |  | 
 | // formatting of multi-line variable declarations | 
 | var a1, b1, c1 int	// all on one line | 
 |  | 
 | var a2, b2, | 
 | 	c2 int	// this line should be indented | 
 |  | 
 | var ( | 
 | 	a3, b3, | 
 | 	c3, d3	int	// this line should be indented | 
 | 	a4, b4, c4	int	// this line should be indented | 
 | ) | 
 |  | 
 | // Test case from issue 3304: multi-line declarations must end | 
 | // a formatting section and not influence indentation of the | 
 | // next line. | 
 | var ( | 
 | 	minRefreshTimeSec	= flag.Int64("min_refresh_time_sec", 604800, | 
 | 		"minimum time window between two refreshes for a given user.") | 
 | 	x	= flag.Int64("refresh_user_rollout_percent", 100, | 
 | 		"temporary flag to ramp up the refresh user rpc") | 
 | 	aVeryLongVariableName	= stats.GetVarInt("refresh-user-count") | 
 | ) | 
 |  | 
 | func _() { | 
 | 	var privateKey2 = &Block{Type: "RSA PRIVATE KEY", | 
 | 		Headers:	map[string]string{}, | 
 | 		Bytes: []uint8{0x30, 0x82, 0x1, 0x3a, 0x2, 0x1, 0x0, 0x2, | 
 | 			0x41, 0x0, 0xb2, 0x99, 0xf, 0x49, 0xc4, 0x7d, 0xfa, 0x8c, | 
 | 			0xd4, 0x0, 0xae, 0x6a, 0x4d, 0x1b, 0x8a, 0x3b, 0x6a, 0x13, | 
 | 			0x64, 0x2b, 0x23, 0xf2, 0x8b, 0x0, 0x3b, 0xfb, 0x97, 0x79, | 
 | 		}, | 
 | 	} | 
 | } | 
 |  | 
 | 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, | 
 | 		}, | 
 | 	} | 
 | } | 
 |  | 
 | // alignment of map composite entries | 
 | var _ = map[int]int{ | 
 | 	// small key sizes: always align even if size ratios are large | 
 | 	a:			a, | 
 | 	abcdefghabcdefgh:	a, | 
 | 	ab:			a, | 
 | 	abc:			a, | 
 | 	abcdefgabcdefg:		a, | 
 | 	abcd:			a, | 
 | 	abcde:			a, | 
 | 	abcdef:			a, | 
 |  | 
 | 	// mixed key sizes: align when key sizes change within accepted ratio | 
 | 	abcdefgh:		a, | 
 | 	abcdefghabcdefg:	a, | 
 | 	abcdefghij:		a, | 
 | 	abcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghij:	a,	// outlier - do not align with previous line | 
 | 	abcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghij:		a,	// align with previous line | 
 |  | 
 | 	ab:	a,	// do not align with previous line | 
 | 	abcde:	a,	// align with previous line | 
 | } | 
 |  | 
 | // alignment of map composite entries: test cases from issue 3965 | 
 | // aligned | 
 | var _ = T1{ | 
 | 	a:			x, | 
 | 	b:			y, | 
 | 	cccccccccccccccccccc:	z, | 
 | } | 
 |  | 
 | // not aligned | 
 | var _ = T2{ | 
 | 	a:	x, | 
 | 	b:	y, | 
 | 	ccccccccccccccccccccc:	z, | 
 | } | 
 |  | 
 | // aligned | 
 | var _ = T3{ | 
 | 	aaaaaaaaaaaaaaaaaaaa:	x, | 
 | 	b:			y, | 
 | 	c:			z, | 
 | } | 
 |  | 
 | // not aligned | 
 | var _ = T4{ | 
 | 	aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa:	x, | 
 | 	b:	y, | 
 | 	c:	z, | 
 | } | 
 |  | 
 | // no alignment of map composite entries if they are not the first entry on a line | 
 | var _ = T{0: 0}	// not aligned | 
 | var _ = T{0: 0,	// not aligned | 
 | 	1:	1,				// aligned | 
 | 	22:	22,				// aligned | 
 | 	333:	333, 1234: 12, 12345: 0,	// first on line aligned | 
 | } | 
 |  | 
 | // test cases form issue 8685 | 
 | // not aligned | 
 | var _ = map[int]string{1: "spring", 2: "summer", | 
 | 	3:	"autumn", 4: "winter"} | 
 |  | 
 | // not aligned | 
 | var _ = map[string]string{"a": "spring", "b": "summer", | 
 | 	"c":	"autumn", "d": "winter"} | 
 |  | 
 | // aligned | 
 | var _ = map[string]string{"a": "spring", | 
 | 	"b":	"summer", | 
 | 	"c":	"autumn", | 
 | 	"d":	"winter"} | 
 |  | 
 | func _() { | 
 | 	var _ = T{ | 
 | 		a,	// must introduce trailing comma | 
 | 	} | 
 | } | 
 |  | 
 | // formatting of function results | 
 | func _() func()				{} | 
 | func _() func(int)			{ return nil } | 
 | func _() func(int) int			{ return nil } | 
 | func _() func(int) func(int) func()	{ return 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	{ y := x; return y + 1 } | 
 | func _() int		{ type T struct{}; var x T; return x } | 
 |  | 
 | // these must remain multi-line since they are multi-line in the source | 
 | func _() { | 
 | 	f(1, 2, 3) | 
 | } | 
 | func _(x int) int { | 
 | 	y := x | 
 | 	return y + 1 | 
 | } | 
 | func _() int { | 
 | 	type T struct{} | 
 | 	var x T | 
 | 	return x | 
 | } | 
 |  | 
 | // making function declarations safe for new semicolon rules | 
 | func _()	{ /* single-line function because of "short-ish" comment */ } | 
 | func _() { /* multi-line function because of "long-ish" comment - much more comment text is following here */ /* and more */ | 
 | } | 
 |  | 
 | func _() { | 
 | 	/* multi-line func because block is on multiple lines */ | 
 | } | 
 |  | 
 | // ellipsis parameters | 
 | func _(...int) | 
 | func _(...*int) | 
 | func _(...[]int) | 
 | func _(...struct{}) | 
 | func _(bool, ...interface{}) | 
 | func _(bool, ...func()) | 
 | func _(bool, ...func(...int)) | 
 | func _(bool, ...map[string]int) | 
 | func _(bool, ...chan int) | 
 |  | 
 | func _(b bool, x ...int) | 
 | func _(b bool, x ...*int) | 
 | func _(b bool, x ...[]int) | 
 | func _(b bool, x ...struct{}) | 
 | func _(x ...interface{}) | 
 | func _(x ...func()) | 
 | func _(x ...func(...int)) | 
 | func _(x ...map[string]int) | 
 | func _(x ...chan int) | 
 |  | 
 | // these parameter lists must remain multi-line since they are multi-line in the source | 
 | func _(bool, | 
 | 	int) { | 
 | } | 
 | func _(x bool, | 
 | 	y int) { | 
 | } | 
 | func _(x, | 
 | 	y bool) { | 
 | } | 
 | func _(bool,	// comment | 
 | 	int) { | 
 | } | 
 | func _(x bool,	// comment | 
 | 	y int) { | 
 | } | 
 | func _(x,	// comment | 
 | 	y bool) { | 
 | } | 
 | func _(bool,	// comment | 
 | 	// comment | 
 | 	int) { | 
 | } | 
 | func _(x bool,	// comment | 
 | 	// comment | 
 | 	y int) { | 
 | } | 
 | func _(x,	// comment | 
 | 	// comment | 
 | 	y bool) { | 
 | } | 
 | func _(bool, | 
 | 	// comment | 
 | 	int) { | 
 | } | 
 | func _(x bool, | 
 | 	// comment | 
 | 	y int) { | 
 | } | 
 | func _(x, | 
 | 	// comment | 
 | 	y bool) { | 
 | } | 
 | func _(x,	// comment | 
 | 	y,	// comment | 
 | 	z bool) { | 
 | } | 
 | func _(x,	// comment | 
 | 	y,	// comment | 
 | 	z bool) { | 
 | } | 
 | func _(x int,	// comment | 
 | 	y float,	// comment | 
 | 	z bool) { | 
 | } | 
 |  | 
 | // properly indent multi-line signatures | 
 | func ManageStatus(in <-chan *Status, req <-chan Request, | 
 | 	stat chan<- *TargetInfo, | 
 | 	TargetHistorySize int) { | 
 | } | 
 |  | 
 | func MultiLineSignature0( | 
 | 	a, b, c int, | 
 | ) { | 
 | } | 
 |  | 
 | func MultiLineSignature1( | 
 | 	a, b, c int, | 
 | 	u, v, w float, | 
 | ) { | 
 | } | 
 |  | 
 | func MultiLineSignature2( | 
 | 	a, b, | 
 | 	c int, | 
 | ) { | 
 | } | 
 |  | 
 | func MultiLineSignature3( | 
 | 	a, b, | 
 | 	c int, u, v, | 
 | 	w float, | 
 | 	x ...int) { | 
 | } | 
 |  | 
 | func MultiLineSignature4( | 
 | 	a, b, c int, | 
 | 	u, v, | 
 | 	w float, | 
 | 	x ...int) { | 
 | } | 
 |  | 
 | func MultiLineSignature5( | 
 | 	a, b, c int, | 
 | 	u, v, w float, | 
 | 	p, q, | 
 | 	r string, | 
 | 	x ...int) { | 
 | } | 
 |  | 
 | // make sure it also works for methods in interfaces | 
 | type _ interface { | 
 | 	MultiLineSignature0( | 
 | 		a, b, c int, | 
 | 	) | 
 |  | 
 | 	MultiLineSignature1( | 
 | 		a, b, c int, | 
 | 		u, v, w float, | 
 | 	) | 
 |  | 
 | 	MultiLineSignature2( | 
 | 		a, b, | 
 | 		c int, | 
 | 	) | 
 |  | 
 | 	MultiLineSignature3( | 
 | 		a, b, | 
 | 		c int, u, v, | 
 | 		w float, | 
 | 		x ...int) | 
 |  | 
 | 	MultiLineSignature4( | 
 | 		a, b, c int, | 
 | 		u, v, | 
 | 		w float, | 
 | 		x ...int) | 
 |  | 
 | 	MultiLineSignature5( | 
 | 		a, b, c int, | 
 | 		u, v, w float, | 
 | 		p, q, | 
 | 		r string, | 
 | 		x ...int) | 
 | } | 
 |  | 
 | // omit superfluous parentheses in parameter lists | 
 | func _(int) | 
 | func _(int) | 
 | func _(x int) | 
 | func _(x int) | 
 | func _(x, y int) | 
 | func _(x, y int) | 
 |  | 
 | func _() int | 
 | func _() int | 
 | func _() int | 
 |  | 
 | func _() (x int) | 
 | func _() (x int) | 
 | func _() (x int) | 
 |  | 
 | // special cases: some channel types require parentheses | 
 | func _(x chan (<-chan int)) | 
 | func _(x chan (<-chan int)) | 
 | func _(x chan (<-chan int)) | 
 |  | 
 | func _(x chan<- (chan int)) | 
 | func _(x chan<- (chan int)) | 
 | func _(x chan<- (chan int)) | 
 |  | 
 | // don't introduce comma after last parameter if the closing ) is on the same line | 
 | // even if the parameter type itself is multi-line (test cases from issue 4533) | 
 | func _(...interface{}) | 
 | func _(...interface { | 
 | 	m() | 
 | 	n() | 
 | })	// no extra comma between } and ) | 
 |  | 
 | func (t *T) _(...interface{}) | 
 | func (t *T) _(...interface { | 
 | 	m() | 
 | 	n() | 
 | })	// no extra comma between } and ) | 
 |  | 
 | func _(interface{}) | 
 | func _(interface { | 
 | 	m() | 
 | })	// no extra comma between } and ) | 
 |  | 
 | func _(struct{}) | 
 | func _(struct { | 
 | 	x	int | 
 | 	y	int | 
 | })	// no extra comma between } and ) |