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