%PDF- %PDF-
Direktori : /usr/local/go/src/go/printer/testdata/ |
Current File : //usr/local/go/src/go/printer/testdata/expressions.input |
// 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) // test case for issue 8021 // want: // ([]bool{})[([]int{})[((1)+(((1)+((((1)*(((1)+(1))+(1)))+(1))*(1)))+(1)))]] _ = ([]bool{})[([]int{})[((1) + (((((1) + (((((((1) * (((((1) + (1))) + (1))))) + (1))) * (1))))) + (1))))]] // 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 issue22111() { _ = x[:] _ = x[:b] _ = x[:b+1] _ = x[a:] _ = x[a+1:] _ = x[a:b] _ = x[a+1:b] _ = x[a:b+1] _ = x[a+1:b+1] _ = x[:b:c] _ = x[:b+1:c] _ = x[:b:c+1] _ = x[:b+1:c+1] _ = x[a:b:c] _ = x[a+1:b:c] _ = x[a:b+1:c] _ = x[a+1:b+1:c] _ = x[a:b:c+1] _ = x[a+1:b:c+1] _ = x[a:b+1:c+1] _ = x[a+1:b+1:c+1] } 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} } _ = (interface{})(nil) _ = (interface{String() string})(nil) _ = (interface{ String() string })(nil) _ = (interface{fmt.Stringer})(nil) _ = (interface{ fmt.Stringer })(nil) } 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) } func _() { _ = f(). f(func() { f() }). f(map[int]int{ 1: 2, 3: 4, }) _ = f(). f( func() { f() }, ) }