github.com/xushiwei/go@v0.0.0-20130601165731-2b9d83f45bc9/src/pkg/go/printer/testdata/expressions.raw (about) 1 // Copyright 2009 The Go Authors. All rights reserved. 2 // Use of this source code is governed by a BSD-style 3 // license that can be found in the LICENSE file. 4 5 package expressions 6 7 type T struct { 8 x, y, z int 9 } 10 11 var ( 12 a, b, c, d, e int 13 under_bar int 14 longIdentifier1, longIdentifier2, longIdentifier3 int 15 t0, t1, t2 T 16 s string 17 p *int 18 ) 19 20 func _() { 21 // no spaces around simple or parenthesized expressions 22 _ = (a + 0) 23 _ = a + b 24 _ = a + b + c 25 _ = a + b - c 26 _ = a - b - c 27 _ = a + (b * c) 28 _ = a + (b / c) 29 _ = a - (b % c) 30 _ = 1 + a 31 _ = a + 1 32 _ = a + b + 1 33 _ = s[a] 34 _ = s[a:] 35 _ = s[:b] 36 _ = s[1:2] 37 _ = s[a:b] 38 _ = s[0:len(s)] 39 _ = s[0] << 1 40 _ = (s[0] << 1) & 0xf 41 _ = s[0]<<2 | s[1]>>4 42 _ = "foo" + s 43 _ = s + "foo" 44 _ = 'a' + 'b' 45 _ = len(s) / 2 46 _ = len(t0.x) / a 47 48 // spaces around expressions of different precedence or expressions containing spaces 49 _ = a + -b 50 _ = a - ^b 51 _ = a / *p 52 _ = a + b*c 53 _ = 1 + b*c 54 _ = a + 2*c 55 _ = a + c*2 56 _ = 1 + 2*3 57 _ = s[1 : 2*3] 58 _ = s[a : b-c] 59 _ = s[0:] 60 _ = s[a+b] 61 _ = s[:b-c] 62 _ = s[a+b:] 63 _ = a[a<<b+1] 64 _ = a[a<<b+1:] 65 _ = s[a+b : len(s)] 66 _ = s[len(s):-a] 67 _ = s[a : len(s)+1] 68 _ = s[a:len(s)+1] + s 69 70 // spaces around operators with equal or lower precedence than comparisons 71 _ = a == b 72 _ = a != b 73 _ = a > b 74 _ = a >= b 75 _ = a < b 76 _ = a <= b 77 _ = a < b && c > d 78 _ = a < b || c > d 79 80 // spaces around "long" operands 81 _ = a + longIdentifier1 82 _ = longIdentifier1 + a 83 _ = longIdentifier1 + longIdentifier2*longIdentifier3 84 _ = s + "a longer string" 85 86 // some selected cases 87 _ = a + t0.x 88 _ = a + t0.x + t1.x*t2.x 89 _ = a + b + c + d + e + 2*3 90 _ = a + b + c + 2*3 + d + e 91 _ = (a + b + c) * 2 92 _ = a - b + c - d + (a + b + c) + d&e 93 _ = under_bar - 1 94 _ = Open(dpath+"/file", O_WRONLY|O_CREAT, 0666) 95 _ = int(c0&_Mask4)<<18 | int(c1&_Maskx)<<12 | int(c2&_Maskx)<<6 | int(c3&_Maskx) 96 97 // the parser does not restrict expressions that may appear as statements 98 true 99 42 100 "foo" 101 x 102 (x) 103 a + b 104 a + b + c 105 a + (b * c) 106 a + (b / c) 107 1 + a 108 a + 1 109 s[a] 110 x << 1 111 (s[0] << 1) & 0xf 112 "foo" + s 113 x == y 114 x < y || z > 42 115 } 116 117 func _() { 118 _ = a + b 119 _ = a + b + c 120 _ = a + b*c 121 _ = a + (b * c) 122 _ = (a + b) * c 123 _ = a + (b * c * d) 124 _ = a + (b*c + d) 125 126 _ = 1 << x 127 _ = -1 << x 128 _ = 1<<x - 1 129 _ = -1<<x - 1 130 131 _ = f(a + b) 132 _ = f(a + b + c) 133 _ = f(a + b*c) 134 _ = f(a + (b * c)) 135 _ = f(1<<x-1, 1<<x-2) 136 137 _ = 1<<d.logWindowSize - 1 138 139 buf = make(x, 2*cap(b.buf)+n) 140 141 dst[i*3+2] = dbuf[0] << 2 142 dst[i*3+2] = dbuf[0]<<2 | dbuf[1]>>4 143 144 b.buf = b.buf[0 : b.off+m+n] 145 b.buf = b.buf[0 : b.off+m*n] 146 f(b.buf[0 : b.off+m+n]) 147 148 signed += ' ' * 8 149 tw.octal(header[148:155], chksum) 150 151 _ = x > 0 && i >= 0 152 153 x1, x0 := x>>w2, x&m2 154 z0 = t1<<w2 + t0 155 z1 = (t1 + t0>>w2) >> w2 156 q1, r1 := x1/d1, x1%d1 157 r1 = r1*b2 | x0>>w2 158 x1 = (x1 << z) | (x0 >> (uint(w) - z)) 159 x1 = x1<<z | x0>>(uint(w)-z) 160 161 _ = buf[0 : len(buf)+1] 162 _ = buf[0 : n+1] 163 164 a, b = b, a 165 a = b + c 166 a = b*c + d 167 _ = a*b + c 168 _ = a - b - c 169 _ = a - (b - c) 170 _ = a - b*c 171 _ = a - (b * c) 172 _ = a * b / c 173 _ = a / *b 174 _ = x[a|^b] 175 _ = x[a / *b] 176 _ = a & ^b 177 _ = a + +b 178 _ = a - -b 179 _ = x[a*-b] 180 _ = x[a + +b] 181 _ = x ^ y ^ z 182 _ = b[a>>24] ^ b[(a>>16)&0xFF] ^ b[(a>>8)&0xFF] ^ b[a&0xFF] 183 _ = len(longVariableName) * 2 184 185 _ = token(matchType + xlength<<lengthShift + xoffset) 186 } 187 188 func f(x int, args ...int) { 189 f(0, args...) 190 f(1, args) 191 f(2, args[0]) 192 193 // make sure syntactically legal code remains syntactically legal 194 f(3, 42 ...) // a blank must remain between 42 and ... 195 f(4, 42....) 196 f(5, 42....) 197 f(6, 42.0...) 198 f(7, 42.0...) 199 f(8, .42...) 200 f(9, .42...) 201 f(10, 42e0...) 202 f(11, 42e0...) 203 204 _ = 42 .x // a blank must remain between 42 and .x 205 _ = 42..x 206 _ = 42..x 207 _ = 42.0.x 208 _ = 42.0.x 209 _ = .42.x 210 _ = .42.x 211 _ = 42e0.x 212 _ = 42e0.x 213 214 // a blank must remain between the binary operator and the 2nd operand 215 _ = x / *y 216 _ = x < -1 217 _ = x < <-1 218 _ = x + +1 219 _ = x - -1 220 _ = x & &x 221 _ = x & ^x 222 223 _ = f(x / *y, x < -1, x < <-1, x + +1, x - -1, x & &x, x & ^x) 224 } 225 226 func _() { 227 _ = T{} 228 _ = struct{}{} 229 _ = [10]T{} 230 _ = [...]T{} 231 _ = []T{} 232 _ = map[int]T{} 233 } 234 235 // one-line structs/interfaces in composite literals (up to a threshold) 236 func _() { 237 _ = struct{}{} 238 _ = struct{ x int }{0} 239 _ = struct{ x, y, z int }{0, 1, 2} 240 _ = struct{ int }{0} 241 _ = struct{ s struct{ int } }{struct{ int }{0}} 242 } 243 244 func _() { 245 // do not modify literals 246 _ = "tab1 tab2 tab3 end" // string contains 3 tabs 247 _ = "tab1 tab2 tab3 end" // same string with 3 blanks - may be unaligned because editors see tabs in strings 248 _ = "" // this comment should be aligned with the one on the previous line 249 _ = `` 250 _ = ` 251 ` 252 _ = `foo 253 bar` 254 _ = `three spaces before the end of the line starting here: 255 they must not be removed` 256 } 257 258 func _() { 259 // smart handling of indentation for multi-line raw strings 260 var _ = `` 261 var _ = `foo` 262 var _ = `foo 263 bar` 264 265 var _ = `` 266 var _ = `foo` 267 var _ = 268 // the next line should remain indented 269 `foo 270 bar` 271 272 var _ = // comment 273 `` 274 var _ = // comment 275 `foo` 276 var _ = // comment 277 // the next line should remain indented 278 `foo 279 bar` 280 281 var _ = /* comment */ `` 282 var _ = /* comment */ `foo` 283 var _ = /* comment */ `foo 284 bar` 285 286 var _ = /* comment */ 287 `` 288 var _ = /* comment */ 289 `foo` 290 var _ = /* comment */ 291 // the next line should remain indented 292 `foo 293 bar` 294 295 var board = []int( 296 `........... 297 ........... 298 ....●●●.... 299 ....●●●.... 300 ..●●●●●●●.. 301 ..●●●○●●●.. 302 ..●●●●●●●.. 303 ....●●●.... 304 ....●●●.... 305 ........... 306 ........... 307 `) 308 309 var state = S{ 310 "foo", 311 // the next line should remain indented 312 `........... 313 ........... 314 ....●●●.... 315 ....●●●.... 316 ..●●●●●●●.. 317 ..●●●○●●●.. 318 ..●●●●●●●.. 319 ....●●●.... 320 ....●●●.... 321 ........... 322 ........... 323 `, 324 "bar", 325 } 326 } 327 328 func _() { 329 // one-line function literals (body is on a single line) 330 _ = func() {} 331 _ = func() int { return 0 } 332 _ = func(x, y int) bool { m := (x + y) / 2; return m < 0 } 333 334 // multi-line function literals (body is not on one line) 335 _ = func() { 336 } 337 _ = func() int { 338 return 0 339 } 340 _ = func(x, y int) bool { 341 m := (x + y) / 2 342 return x < y 343 } 344 345 f(func() { 346 }) 347 f(func() int { 348 return 0 349 }) 350 f(func(x, y int) bool { 351 m := (x + y) / 2 352 return x < y 353 }) 354 } 355 356 func _() { 357 _ = [][]int{ 358 []int{1}, 359 []int{1, 2}, 360 []int{1, 2, 3}, 361 } 362 _ = [][]int{ 363 {1}, 364 []int{1, 2}, 365 []int{1, 2, 3}, 366 } 367 _ = [][]int{ 368 {1}, 369 {1, 2}, 370 {1, 2, 3}, 371 } 372 _ = [][]int{{1}, {1, 2}, {1, 2, 3}} 373 } 374 375 // various multi-line expressions 376 func _() { 377 // do not add extra indentation to multi-line string lists 378 _ = "foo" + "bar" 379 _ = "foo" + 380 "bar" + 381 "bah" 382 _ = []string{ 383 "abc" + 384 "def", 385 "foo" + 386 "bar", 387 } 388 } 389 390 const _ = F1 + 391 `string = "%s";` + 392 `ptr = *;` + 393 `datafmt.T2 = s ["-" p "-"];` 394 395 const _ = `datafmt "datafmt";` + 396 `default = "%v";` + 397 `array = *;` + 398 `datafmt.T3 = s {" " a a / ","};` 399 400 const _ = `datafmt "datafmt";` + 401 `default = "%v";` + 402 `array = *;` + 403 `datafmt.T3 = s {" " a a / ","};` 404 405 func _() { 406 _ = F1 + 407 `string = "%s";` + 408 `ptr = *;` + 409 `datafmt.T2 = s ["-" p "-"];` 410 411 _ = 412 `datafmt "datafmt";` + 413 `default = "%v";` + 414 `array = *;` + 415 `datafmt.T3 = s {" " a a / ","};` 416 417 _ = `datafmt "datafmt";` + 418 `default = "%v";` + 419 `array = *;` + 420 `datafmt.T3 = s {" " a a / ","};` 421 } 422 423 func _() { 424 // respect source lines in multi-line expressions 425 _ = a + 426 b + 427 c 428 _ = a < b || 429 b < a 430 _ = "933262154439441526816992388562667004907159682643816214685929" + 431 "638952175999932299156089414639761565182862536979208272237582" + 432 "51185210916864000000000000000000000000" // 100! 433 _ = "170141183460469231731687303715884105727" // prime 434 } 435 436 // Alignment after overlong lines 437 const ( 438 _ = "991" 439 _ = "2432902008176640000" // 20! 440 _ = "933262154439441526816992388562667004907159682643816214685929" + 441 "638952175999932299156089414639761565182862536979208272237582" + 442 "51185210916864000000000000000000000000" // 100! 443 _ = "170141183460469231731687303715884105727" // prime 444 ) 445 446 // Correct placement of operators and comments in multi-line expressions 447 func _() { 448 _ = a + // comment 449 b + // comment 450 c 451 _ = "a" + 452 "b" + // comment 453 "c" 454 _ = "ba0408" + "7265717569726564" // field 71, encoding 2, string "required" 455 } 456 457 // Correct placement of terminating comma/closing parentheses in multi-line calls. 458 func _() { 459 f(1, 460 2, 461 3) 462 f(1, 463 2, 464 3, 465 ) 466 f(1, 467 2, 468 3) // comment 469 f(1, 470 2, 471 3, // comment 472 ) 473 f(1, 474 2, 475 3) // comment 476 f(1, 477 2, 478 3, // comment 479 ) 480 } 481 482 // Align comments in multi-line lists of single-line expressions. 483 var txpix = [NCOL]draw.Color{ 484 draw.Yellow, // yellow 485 draw.Cyan, // cyan 486 draw.Green, // lime green 487 draw.GreyBlue, // slate 488 draw.Red, /* red */ 489 draw.GreyGreen, /* olive green */ 490 draw.Blue, /* blue */ 491 draw.Color(0xFF55AAFF), /* pink */ 492 draw.Color(0xFFAAFFFF), /* lavender */ 493 draw.Color(0xBB005DFF), /* maroon */ 494 } 495 496 func same(t, u *Time) bool { 497 // respect source lines in multi-line expressions 498 return t.Year == u.Year && 499 t.Month == u.Month && 500 t.Day == u.Day && 501 t.Hour == u.Hour && 502 t.Minute == u.Minute && 503 t.Second == u.Second && 504 t.Weekday == u.Weekday && 505 t.ZoneOffset == u.ZoneOffset && 506 t.Zone == u.Zone 507 } 508 509 func (p *parser) charClass() { 510 // respect source lines in multi-line expressions 511 if cc.negate && len(cc.ranges) == 2 && 512 cc.ranges[0] == '\n' && cc.ranges[1] == '\n' { 513 nl := new(_NotNl) 514 p.re.add(nl) 515 } 516 } 517 518 func addState(s []state, inst instr, match []int) { 519 // handle comments correctly in multi-line expressions 520 for i := 0; i < l; i++ { 521 if s[i].inst.index() == index && // same instruction 522 s[i].match[0] < pos { // earlier match already going; leftmost wins 523 return s 524 } 525 } 526 } 527 528 func (self *T) foo(x int) *T { return self } 529 530 func _() { module.Func1().Func2() } 531 532 func _() { 533 _ = new(T). 534 foo(1). 535 foo(2). 536 foo(3) 537 538 _ = new(T). 539 foo(1). 540 foo(2). // inline comments 541 foo(3) 542 543 _ = new(T).foo(1).foo(2).foo(3) 544 545 // handle multiline argument list correctly 546 _ = new(T). 547 foo( 548 1). 549 foo(2) 550 551 _ = new(T).foo( 552 1).foo(2) 553 554 _ = Array[3+ 555 4] 556 557 _ = Method(1, 2, 558 3) 559 560 _ = new(T). 561 foo(). 562 bar().(*Type) 563 564 _ = new(T). 565 foo(). 566 bar().(*Type). 567 baz() 568 569 _ = new(T). 570 foo(). 571 bar()["idx"] 572 573 _ = new(T). 574 foo(). 575 bar()["idx"]. 576 baz() 577 578 _ = new(T). 579 foo(). 580 bar()[1:2] 581 582 _ = new(T). 583 foo(). 584 bar()[1:2]. 585 baz() 586 587 _ = new(T). 588 Field. 589 Array[3+ 590 4]. 591 Table["foo"]. 592 Blob.(*Type). 593 Slices[1:4]. 594 Method(1, 2, 595 3). 596 Thingy 597 598 _ = a.b.c 599 _ = a. 600 b. 601 c 602 _ = a.b().c 603 _ = a. 604 b(). 605 c 606 _ = a.b[0].c 607 _ = a. 608 b[0]. 609 c 610 _ = a.b[0:].c 611 _ = a. 612 b[0:]. 613 c 614 _ = a.b.(T).c 615 _ = a. 616 b.(T). 617 c 618 } 619 620 // Don't introduce extra newlines in strangely formatted expression lists. 621 func f() { 622 // os.Open parameters should remain on two lines 623 if writer, err = os.Open(outfile, s.O_WRONLY|os.O_CREATE| 624 os.O_TRUNC, 0666); err != nil { 625 log.Fatal(err) 626 } 627 } 628 629 // Handle multi-line argument lists ending in ... correctly. 630 // Was issue 3130. 631 func _() { 632 _ = append(s, a...) 633 _ = append( 634 s, a...) 635 _ = append(s, 636 a...) 637 _ = append( 638 s, 639 a...) 640 _ = append(s, a..., 641 ) 642 _ = append(s, 643 a..., 644 ) 645 _ = append( 646 s, 647 a..., 648 ) 649 } 650 651 // Literal function types in conversions must be parenthesized; 652 // for now go/parser accepts the unparenthesized form where it 653 // is non-ambiguous. 654 func _() { 655 // these conversions should be rewritten to look 656 // the same as the parenthesized conversions below 657 _ = (func())(nil) 658 _ = (func(x int) float)(nil) 659 _ = (func() func() func())(nil) 660 661 _ = (func())(nil) 662 _ = (func(x int) float)(nil) 663 _ = (func() func() func())(nil) 664 }