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

type T struct {
	x, y, z int
}

var (
	a, b, c, d, e int
	under_bar int
	longIdentifier1, longIdentifier2, longIdentifier3 int
	t0, t1, t2 T
	s string
	p *int
)


func _() {
	// no spaces around simple or parenthesized expressions
	_ = (a+0)
	_ = a+b
	_ = a+b+c
	_ = a+b-c
	_ = a-b-c
	_ = a+(b*c)
	_ = a+(b/c)
	_ = a-(b%c)
	_ = 1+a
	_ = a+1
	_ = a+b+1
	_ = s[a]
	_ = s[a:]
	_ = s[:b]
	_ = s[1:2]
	_ = s[a:b]
	_ = s[0:len(s)]
	_ = s[0]<<1
	_ = (s[0]<<1)&0xf
	_ = s[0] << 2 | s[1] >> 4
	_ = "foo"+s
	_ = s+"foo"
	_ = 'a'+'b'
	_ = len(s)/2
	_ = len(t0.x)/a

	// spaces around expressions of different precedence or expressions containing spaces
	_ = a + -b
	_ = a - ^b
	_ = a / *p
	_ = a + b*c
	_ = 1 + b*c
	_ = a + 2*c
	_ = a + c*2
	_ = 1 + 2*3
	_ = s[1 : 2*3]
	_ = s[a : b-c]
	_ = s[0:]
	_ = s[a+b]
	_ = s[: b-c]
	_ = s[a+b :]
	_ = a[a<<b+1]
	_ = a[a<<b+1 :]
	_ = s[a+b : len(s)]
	_ = s[len(s) : -a]
	_ = s[a : len(s)+1]
	_ = s[a : len(s)+1]+s

	// spaces around operators with equal or lower precedence than comparisons
	_ = a == b
	_ = a != b
	_ = a > b
	_ = a >= b
	_ = a < b
	_ = a <= b
	_ = a < b && c > d
	_ = a < b || c > d

	// spaces around "long" operands
	_ = a + longIdentifier1
	_ = longIdentifier1 + a
	_ = longIdentifier1 + longIdentifier2 * longIdentifier3
	_ = s + "a longer string"

	// some selected cases
	_ = a + t0.x
	_ = a + t0.x + t1.x * t2.x
	_ = a + b + c + d + e + 2*3
	_ = a + b + c + 2*3 + d + e
	_ = (a+b+c)*2
	_ = a - b + c - d + (a+b+c) + d&e
	_ = under_bar-1
	_ = Open(dpath + "/file", O_WRONLY | O_CREAT, 0666)
	_ = int(c0&_Mask4)<<18 | int(c1&_Maskx)<<12 | int(c2&_Maskx)<<6 | int(c3&_Maskx)

	// the parser does not restrict expressions that may appear as statements
	true
	42
	"foo"
	x
	(x)
	a+b
	a+b+c
	a+(b*c)
	a+(b/c)
	1+a
	a+1
	s[a]
	x<<1
	(s[0]<<1)&0xf
	"foo"+s
	x == y
	x < y || z > 42
}


// slice expressions with cap
func _() {
	_ = x[a:b:c]
	_ = x[a:b:c+d]
	_ = x[a:b+d:c]
	_ = x[a:b+d:c+d]
	_ = x[a+d:b:c]
	_ = x[a+d:b:c+d]
	_ = x[a+d:b+d:c]
	_ = x[a+d:b+d:c+d]

	_ = x[:b:c]
	_ = x[:b:c+d]
	_ = x[:b+d:c]
	_ = x[:b+d:c+d]
}

func _() {
	_ = a+b
	_ = a+b+c
	_ = a+b*c
	_ = a+(b*c)
	_ = (a+b)*c
	_ = a+(b*c*d)
	_ = a+(b*c+d)

	_ = 1<<x
	_ = -1<<x
	_ = 1<<x-1
	_ = -1<<x-1

	_ = f(a+b)
	_ = f(a+b+c)
	_ = f(a+b*c)
	_ = f(a+(b*c))
	_ = f(1<<x-1, 1<<x-2)

	_ = 1<<d.logWindowSize-1

	buf = make(x, 2*cap(b.buf) + n)

	dst[i*3+2] = dbuf[0]<<2
	dst[i*3+2] = dbuf[0]<<2 | dbuf[1]>>4

	b.buf = b.buf[0:b.off+m+n]
	b.buf = b.buf[0:b.off+m*n]
	f(b.buf[0:b.off+m+n])

	signed += ' '*8
	tw.octal(header[148:155], chksum)

	_ = x > 0 && i >= 0

	x1, x0 := x>>w2, x&m2
	z0 = t1<<w2+t0
	z1 = (t1+t0>>w2)>>w2
	q1, r1 := x1/d1, x1%d1
	r1 = r1*b2 | x0>>w2
	x1 = (x1<<z)|(x0>>(uint(w)-z))
	x1 = x1<<z | x0>>(uint(w)-z)

	_ = buf[0:len(buf)+1]
	_ = buf[0:n+1]

	a,b = b,a
	a = b+c
	a = b*c+d
	_ = a*b+c
	_ = a-b-c
	_ = a-(b-c)
	_ = a-b*c
	_ = a-(b*c)
	_ = a*b/c
	_ = a/ *b
	_ = x[a|^b]
	_ = x[a/ *b]
	_ = a& ^b
	_ = a+ +b
	_ = a- -b
	_ = x[a*-b]
	_ = x[a+ +b]
	_ = x^y^z
	_ = b[a>>24] ^ b[(a>>16)&0xFF] ^ b[(a>>8)&0xFF] ^ b[a&0xFF]
	_ = len(longVariableName)*2

	_ = token(matchType + xlength<<lengthShift + xoffset)
}


func f(x int, args ...int) {
	f(0, args...)
	f(1, args)
	f(2, args[0])

	// make sure syntactically legal code remains syntactically legal
	f(3, 42 ...) // a blank must remain between 42 and ...
	f(4, 42. ...)
	f(5, 42....)
	f(6, 42.0 ...)
	f(7, 42.0...)
	f(8, .42 ...)
	f(9, .42...)
	f(10, 42e0 ...)
	f(11, 42e0...)

	_ = 42 .x // a blank must remain between 42 and .x
	_ = 42. .x
	_ = 42..x
	_ = 42.0 .x
	_ = 42.0.x
	_ = .42 .x
	_ = .42.x
	_ = 42e0 .x
	_ = 42e0.x

	// a blank must remain between the binary operator and the 2nd operand
	_ = x/ *y
	_ = x< -1
	_ = x< <-1
	_ = x+ +1
	_ = x- -1
	_ = x& &x
	_ = x& ^x

	_ = f(x/ *y, x< -1, x< <-1, x+ +1, x- -1, x& &x, x& ^x)
}


func _() {
	_ = T{}
	_ = struct{}{}
	_ = [10]T{}
	_ = [...]T{}
	_ = []T{}
	_ = map[int]T{}
}


// one-line structs/interfaces in composite literals (up to a threshold)
func _() {
	_ = struct{}{}
	_ = struct{ x int }{0}
	_ = struct{ x, y, z int }{0, 1, 2}
	_ = struct{ int }{0}
	_ = struct{ s struct { int } }{struct{ int}{0} }
}


func _() {
	// do not modify literals
	_ = "tab1	tab2	tab3	end"  // string contains 3 tabs
	_ = "tab1 tab2 tab3 end"  // same string with 3 blanks - may be unaligned because editors see tabs in strings
	_ = ""  // this comment should be aligned with the one on the previous line
	_ = ``
	_ = `
`
_ = `foo
		bar`
	_ = `three spaces before the end of the line starting here:   
they must not be removed`
}


func _() {
	// smart handling of indentation for multi-line raw strings
	var _ = ``
	var _ = `foo`
	var _ = `foo
bar`


var _ =
	``
var _ =
	`foo`
var _ =
	// the next line should remain indented
	`foo
bar`


	var _ = // comment
		``
	var _ = // comment
		`foo`
	var _ = // comment
		// the next line should remain indented
		`foo
bar`


var _ = /* comment */ ``
var _ = /* comment */ `foo`
var _ = /* comment */ `foo
bar`


	var _ = /* comment */
		``
	var _ = /* comment */
		`foo`
	var _ = /* comment */
		// the next line should remain indented
		`foo
bar`


var board = []int(
	`...........
...........
....●●●....
....●●●....
..●●●●●●●..
..●●●○●●●..
..●●●●●●●..
....●●●....
....●●●....
...........
...........
`)


	var state = S{
		"foo",
		// the next line should remain indented
		`...........
...........
....●●●....
....●●●....
..●●●●●●●..
..●●●○●●●..
..●●●●●●●..
....●●●....
....●●●....
...........
...........
`,
		"bar",
	}
}


func _() {
	// one-line function literals (body is on a single line)
	_ = func() {}
	_ = func() int { return 0 }
	_ = func(x, y int) bool { m := (x+y)/2; return m < 0 }

	// multi-line function literals (body is not on one line)
	_ = func() {
	}
	_ = func() int {
		return 0
	}
	_ = func(x, y int) bool {
		m := (x+y)/2; return x < y }

	f(func() {
	})
	f(func() int {
		return 0
	})
	f(func(x, y int) bool {
		m := (x+y)/2; return x < y })
}


func _() {
	_ = [][]int {
		[]int{1},
		[]int{1, 2},
		[]int{1, 2, 3},
	}
	_ = [][]int {
		{1},
		[]int{1, 2},
		[]int{1, 2, 3},
	}
	_ = [][]int {
		{1},
		{1, 2},
		{1, 2, 3},
	}
	_ = [][]int {{1}, {1, 2}, {1, 2, 3}}
}


// various multi-line expressions
func _() {
	// do not add extra indentation to multi-line string lists
	_ = "foo" + "bar"
	_ = "foo" +
	"bar" +
	"bah"
	_ = []string {
		"abc" +
		"def",
		"foo" +
		"bar",
	}
}


const _ = F1 +
	`string = "%s";` +
	`ptr = *;` +
	`datafmt.T2 = s ["-" p "-"];`


const _ =
	`datafmt "datafmt";` +
	`default = "%v";` +
	`array = *;` +
	`datafmt.T3 = s  {" " a a / ","};`


const _ = `datafmt "datafmt";` +
`default = "%v";` +
`array = *;` +
`datafmt.T3 = s  {" " a a / ","};`


func _() {
	_ = F1 +
		`string = "%s";` +
		`ptr = *;` +
		`datafmt.T2 = s ["-" p "-"];`

	_ =
		`datafmt "datafmt";` +
		`default = "%v";` +
		`array = *;` +
		`datafmt.T3 = s  {" " a a / ","};`

	_ = `datafmt "datafmt";` +
	`default = "%v";` +
	`array = *;` +
	`datafmt.T3 = s  {" " a a / ","};`
}


func _() {
	// respect source lines in multi-line expressions
	_ = a+
	b+
	c
	_ = a < b ||
		b < a
	_ = "933262154439441526816992388562667004907159682643816214685929" +
	"638952175999932299156089414639761565182862536979208272237582" +
	"51185210916864000000000000000000000000"  // 100!
	_ = "170141183460469231731687303715884105727"  // prime
}


// Alignment after overlong lines
const (
	_ = "991"
	_ = "2432902008176640000"  // 20!
	_ = "933262154439441526816992388562667004907159682643816214685929" +
	"638952175999932299156089414639761565182862536979208272237582" +
	"51185210916864000000000000000000000000"  // 100!
	_ = "170141183460469231731687303715884105727"  // prime
)


// Correct placement of operators and comments in multi-line expressions
func _() {
	_ = a +  // comment
		b +  // comment
		c
	_ = "a"	+
		"b" +	// comment
		"c"
	_ = "ba0408" + "7265717569726564"     // field 71, encoding 2, string "required"
}


// Correct placement of terminating comma/closing parentheses in multi-line calls.
func _() {
	f(1,
		2,
		3)
	f(1,
		2,
		3,
	)
	f(1,
		2,
		3)  // comment
	f(1,
		2,
		3,  // comment
	)
	f(1,
		2,
		3)// comment
	f(1,
		2,
		3,// comment
	)
}


// Align comments in multi-line lists of single-line expressions.
var txpix = [NCOL]draw.Color{
	draw.Yellow, // yellow
	draw.Cyan, // cyan
	draw.Green, // lime green
	draw.GreyBlue, // slate
	draw.Red, /* red */
	draw.GreyGreen, /* olive green */
	draw.Blue, /* blue */
	draw.Color(0xFF55AAFF), /* pink */
	draw.Color(0xFFAAFFFF), /* lavender */
	draw.Color(0xBB005DFF), /* maroon */
}


func same(t, u *Time) bool {
	// respect source lines in multi-line expressions
	return t.Year == u.Year &&
		t.Month == u.Month &&
		t.Day == u.Day &&
		t.Hour == u.Hour &&
		t.Minute == u.Minute &&
		t.Second == u.Second &&
		t.Weekday == u.Weekday &&
		t.ZoneOffset == u.ZoneOffset &&
		t.Zone == u.Zone
}


func (p *parser) charClass() {
	// respect source lines in multi-line expressions
	if cc.negate && len(cc.ranges) == 2 &&
		cc.ranges[0] == '\n' && cc.ranges[1] == '\n' {
		nl := new(_NotNl)
		p.re.add(nl)
	}
}


func addState(s []state, inst instr, match []int) {
	// handle comments correctly in multi-line expressions
	for i := 0; i < l; i++ {
		if s[i].inst.index() == index && // same instruction
		   s[i].match[0] < pos {	// earlier match already going; leftmost wins
		   	return s
		 }
	}
}

func (self *T) foo(x int) *T { return self }

func _() { module.Func1().Func2() }

func _() {
	_ = new(T).
		foo(1).
			foo(2).
		foo(3)

	_ = new(T).
	foo(1).
	foo(2). // inline comments
	foo(3)

	_ = new(T).foo(1).foo(2).foo(3)

	// handle multiline argument list correctly
	_ = new(T).
	foo(
		1).
		foo(2)

	_ = new(T).foo(
		1).foo(2)

	_ = Array[3 +
4]

	_ = Method(1, 2,
		3)

	_ = new(T).
   foo().
   bar() . (*Type)

	_ = new(T).
foo().
bar().(*Type).
baz()

	_ = new(T).
	foo().
	bar()["idx"]

	_ = new(T).
	foo().
	bar()["idx"]	.
	baz()

	_ = new(T).
	foo().
	bar()[1:2]

	_ = new(T).
	foo().
	bar()[1:2].
	baz()

	_ = new(T).
		Field.
		Array[3+
       		4].
		Table ["foo"].
		Blob. (*Type).
	Slices[1:4].
	Method(1, 2,
	3).
		Thingy

	_ = a.b.c
	_ = a.
	b.
	c
	_ = a.b().c
	_ = a.
	b().
	c
	_ = a.b[0].c
	_ = a.
	b[0].
	c
	_ = a.b[0:].c
	_ = a.
	b[0:].
	c
	_ = a.b.(T).c
	_ = a.
	b.
	(T).
	c
}


// Don't introduce extra newlines in strangely formatted expression lists.
func f() {
	// os.Open parameters should remain on two lines
	if writer, err = os.Open(outfile, s.O_WRONLY|os.O_CREATE|
		os.O_TRUNC, 0666); err != nil {
	    log.Fatal(err)
	}
}

// Handle multi-line argument lists ending in ... correctly.
// Was issue 3130.
func _() {
	_ = append(s, a...)
	_ = append(
		s, a...)
	_ = append(s,
		a...)
	_ = append(
		s,
		a...)
	_ = append(s, a...,
	)
	_ = append(s,
		a...,
	)
	_ = append(
		s,
		a...,
	)
}

// Literal function types in conversions must be parenthesized;
// for now go/parser accepts the unparenthesized form where it
// is non-ambiguous.
func _() {
	// these conversions should be rewritten to look
	// the same as the parenthesized conversions below
	_ = func()()(nil)
	_ = func(x int)(float)(nil)
	_ = func() func() func()()(nil)

	_ = (func()())(nil)
	_ = (func(x int)(float))(nil)
	_ = (func() func() func()())(nil)
}
