Source file
src/go/parser/parser.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25 package parser
26
27 import (
28 "fmt"
29 "go/ast"
30 "go/build/constraint"
31 "go/scanner"
32 "go/token"
33 "strings"
34 )
35
36
37 type parser struct {
38 file *token.File
39 errors scanner.ErrorList
40 scanner scanner.Scanner
41
42
43 mode Mode
44 trace bool
45 indent int
46
47
48 comments []*ast.CommentGroup
49 leadComment *ast.CommentGroup
50 lineComment *ast.CommentGroup
51 top bool
52 goVersion string
53
54
55 pos token.Pos
56 tok token.Token
57 lit string
58
59
60
61
62
63 syncPos token.Pos
64 syncCnt int
65
66
67 exprLev int
68 inRhs bool
69
70 imports []*ast.ImportSpec
71
72
73
74 nestLev int
75 }
76
77 func (p *parser) init(file *token.File, src []byte, mode Mode) {
78 p.file = file
79 eh := func(pos token.Position, msg string) { p.errors.Add(pos, msg) }
80 p.scanner.Init(p.file, src, eh, scanner.ScanComments)
81
82 p.top = true
83 p.mode = mode
84 p.trace = mode&Trace != 0
85 p.next()
86 }
87
88
89 func (p *parser) end() token.Pos {
90 return p.scanner.End()
91 }
92
93
94
95
96 func (p *parser) printTrace(a ...any) {
97 const dots = ". . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . "
98 const n = len(dots)
99 pos := p.file.Position(p.pos)
100 fmt.Printf("%5d:%3d: ", pos.Line, pos.Column)
101 i := 2 * p.indent
102 for i > n {
103 fmt.Print(dots)
104 i -= n
105 }
106
107 fmt.Print(dots[0:i])
108 fmt.Println(a...)
109 }
110
111 func trace(p *parser, msg string) *parser {
112 p.printTrace(msg, "(")
113 p.indent++
114 return p
115 }
116
117
118 func un(p *parser) {
119 p.indent--
120 p.printTrace(")")
121 }
122
123
124 const maxNestLev int = 1e5
125
126 func incNestLev(p *parser) *parser {
127 p.nestLev++
128 if p.nestLev > maxNestLev {
129 p.error(p.pos, "exceeded max nesting depth")
130 panic(bailout{})
131 }
132 return p
133 }
134
135
136
137 func decNestLev(p *parser) {
138 p.nestLev--
139 }
140
141
142 func (p *parser) next0() {
143
144
145
146
147 if p.trace && p.pos.IsValid() {
148 s := p.tok.String()
149 switch {
150 case p.tok.IsLiteral():
151 p.printTrace(s, p.lit)
152 case p.tok.IsOperator(), p.tok.IsKeyword():
153 p.printTrace("\"" + s + "\"")
154 default:
155 p.printTrace(s)
156 }
157 }
158
159 for {
160 p.pos, p.tok, p.lit = p.scanner.Scan()
161 if p.tok == token.COMMENT {
162 if p.top && strings.HasPrefix(p.lit, "//go:build") {
163 if x, err := constraint.Parse(p.lit); err == nil {
164 p.goVersion = constraint.GoVersion(x)
165 }
166 }
167 if p.mode&ParseComments == 0 {
168 continue
169 }
170 } else {
171
172 p.top = false
173 }
174 break
175 }
176 }
177
178
179 func (p *parser) lineFor(pos token.Pos) int {
180 return p.file.PositionFor(pos, false).Line
181 }
182
183
184 func (p *parser) consumeComment() (comment *ast.Comment, endline int) {
185
186
187 endline = p.lineFor(p.pos)
188 if p.lit[1] == '*' {
189
190 for i := 0; i < len(p.lit); i++ {
191 if p.lit[i] == '\n' {
192 endline++
193 }
194 }
195 }
196
197 comment = &ast.Comment{Slash: p.pos, Text: p.lit}
198 p.next0()
199
200 return
201 }
202
203
204
205
206
207 func (p *parser) consumeCommentGroup(n int) (comments *ast.CommentGroup, endline int) {
208 var list []*ast.Comment
209 endline = p.lineFor(p.pos)
210 for p.tok == token.COMMENT && p.lineFor(p.pos) <= endline+n {
211 var comment *ast.Comment
212 comment, endline = p.consumeComment()
213 list = append(list, comment)
214 }
215
216
217 comments = &ast.CommentGroup{List: list}
218 p.comments = append(p.comments, comments)
219
220 return
221 }
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237 func (p *parser) next() {
238 p.leadComment = nil
239 p.lineComment = nil
240 prev := p.pos
241 p.next0()
242
243 if p.tok == token.COMMENT {
244 var comment *ast.CommentGroup
245 var endline int
246
247 if p.lineFor(p.pos) == p.lineFor(prev) {
248
249
250 comment, endline = p.consumeCommentGroup(0)
251 if p.lineFor(p.pos) != endline || p.tok == token.SEMICOLON || p.tok == token.EOF {
252
253
254 p.lineComment = comment
255 }
256 }
257
258
259 endline = -1
260 for p.tok == token.COMMENT {
261 comment, endline = p.consumeCommentGroup(1)
262 }
263
264 if endline+1 == p.lineFor(p.pos) {
265
266
267 p.leadComment = comment
268 }
269 }
270 }
271
272
273
274 type bailout struct {
275 pos token.Pos
276 msg string
277 }
278
279 func (p *parser) error(pos token.Pos, msg string) {
280 if p.trace {
281 defer un(trace(p, "error: "+msg))
282 }
283
284 epos := p.file.Position(pos)
285
286
287
288
289 if p.mode&AllErrors == 0 {
290 n := len(p.errors)
291 if n > 0 && p.errors[n-1].Pos.Line == epos.Line {
292 return
293 }
294 if n > 10 {
295 panic(bailout{})
296 }
297 }
298
299 p.errors.Add(epos, msg)
300 }
301
302 func (p *parser) errorExpected(pos token.Pos, msg string) {
303 msg = "expected " + msg
304 if pos == p.pos {
305
306
307 switch {
308 case p.tok == token.SEMICOLON && p.lit == "\n":
309 msg += ", found newline"
310 case p.tok.IsLiteral():
311
312 msg += ", found " + p.lit
313 default:
314 msg += ", found '" + p.tok.String() + "'"
315 }
316 }
317 p.error(pos, msg)
318 }
319
320 func (p *parser) expect(tok token.Token) token.Pos {
321 pos := p.pos
322 if p.tok != tok {
323 p.errorExpected(pos, "'"+tok.String()+"'")
324 }
325 p.next()
326 return pos
327 }
328
329
330
331 func (p *parser) expect2(tok token.Token) (pos token.Pos) {
332 if p.tok == tok {
333 pos = p.pos
334 } else {
335 p.errorExpected(p.pos, "'"+tok.String()+"'")
336 }
337 p.next()
338 return
339 }
340
341
342
343 func (p *parser) expectClosing(tok token.Token, context string) token.Pos {
344 if p.tok != tok && p.tok == token.SEMICOLON && p.lit == "\n" {
345 p.error(p.pos, "missing ',' before newline in "+context)
346 p.next()
347 }
348 return p.expect(tok)
349 }
350
351
352 func (p *parser) expectSemi() (comment *ast.CommentGroup) {
353 switch p.tok {
354 case token.RPAREN, token.RBRACE:
355 return nil
356 case token.COMMA:
357
358 p.errorExpected(p.pos, "';'")
359 fallthrough
360 case token.SEMICOLON:
361 if p.lit == ";" {
362
363 p.next()
364 comment = p.lineComment
365 } else {
366
367 comment = p.lineComment
368 p.next()
369 }
370 return comment
371 default:
372 p.errorExpected(p.pos, "';'")
373 p.advance(stmtStart)
374 return nil
375 }
376 }
377
378 func (p *parser) atComma(context string, follow token.Token) bool {
379 if p.tok == token.COMMA {
380 return true
381 }
382 if p.tok != follow {
383 msg := "missing ','"
384 if p.tok == token.SEMICOLON && p.lit == "\n" {
385 msg += " before newline"
386 }
387 p.error(p.pos, msg+" in "+context)
388 return true
389 }
390 return false
391 }
392
393 func assert(cond bool, msg string) {
394 if !cond {
395 panic("go/parser internal error: " + msg)
396 }
397 }
398
399
400
401 func (p *parser) advance(to map[token.Token]bool) {
402 for ; p.tok != token.EOF; p.next() {
403 if to[p.tok] {
404
405
406
407
408
409
410
411 if p.pos == p.syncPos && p.syncCnt < 10 {
412 p.syncCnt++
413 return
414 }
415 if p.pos > p.syncPos {
416 p.syncPos = p.pos
417 p.syncCnt = 0
418 return
419 }
420
421
422
423
424
425 }
426 }
427 }
428
429 var stmtStart = map[token.Token]bool{
430 token.BREAK: true,
431 token.CONST: true,
432 token.CONTINUE: true,
433 token.DEFER: true,
434 token.FALLTHROUGH: true,
435 token.FOR: true,
436 token.GO: true,
437 token.GOTO: true,
438 token.IF: true,
439 token.RETURN: true,
440 token.SELECT: true,
441 token.SWITCH: true,
442 token.TYPE: true,
443 token.VAR: true,
444 }
445
446 var declStart = map[token.Token]bool{
447 token.IMPORT: true,
448 token.CONST: true,
449 token.TYPE: true,
450 token.VAR: true,
451 }
452
453 var exprEnd = map[token.Token]bool{
454 token.COMMA: true,
455 token.COLON: true,
456 token.SEMICOLON: true,
457 token.RPAREN: true,
458 token.RBRACK: true,
459 token.RBRACE: true,
460 }
461
462
463
464
465 func (p *parser) parseIdent() *ast.Ident {
466 pos := p.pos
467 name := "_"
468 if p.tok == token.IDENT {
469 name = p.lit
470 p.next()
471 } else {
472 p.expect(token.IDENT)
473 }
474 return &ast.Ident{NamePos: pos, Name: name}
475 }
476
477 func (p *parser) parseIdentList() (list []*ast.Ident) {
478 if p.trace {
479 defer un(trace(p, "IdentList"))
480 }
481
482 list = append(list, p.parseIdent())
483 for p.tok == token.COMMA {
484 p.next()
485 list = append(list, p.parseIdent())
486 }
487
488 return
489 }
490
491
492
493
494
495 func (p *parser) parseExprList() (list []ast.Expr) {
496 if p.trace {
497 defer un(trace(p, "ExpressionList"))
498 }
499
500 list = append(list, p.parseExpr())
501 for p.tok == token.COMMA {
502 p.next()
503 list = append(list, p.parseExpr())
504 }
505
506 return
507 }
508
509 func (p *parser) parseList(inRhs bool) []ast.Expr {
510 old := p.inRhs
511 p.inRhs = inRhs
512 list := p.parseExprList()
513 p.inRhs = old
514 return list
515 }
516
517
518
519
520 func (p *parser) parseType() ast.Expr {
521 if p.trace {
522 defer un(trace(p, "Type"))
523 }
524
525 typ := p.tryIdentOrType()
526
527 if typ == nil {
528 pos := p.pos
529 p.errorExpected(pos, "type")
530 p.advance(exprEnd)
531 return &ast.BadExpr{From: pos, To: p.pos}
532 }
533
534 return typ
535 }
536
537 func (p *parser) parseQualifiedIdent(ident *ast.Ident) ast.Expr {
538 if p.trace {
539 defer un(trace(p, "QualifiedIdent"))
540 }
541
542 typ := p.parseTypeName(ident)
543 if p.tok == token.LBRACK {
544 typ = p.parseTypeInstance(typ)
545 }
546
547 return typ
548 }
549
550
551 func (p *parser) parseTypeName(ident *ast.Ident) ast.Expr {
552 if p.trace {
553 defer un(trace(p, "TypeName"))
554 }
555
556 if ident == nil {
557 ident = p.parseIdent()
558 }
559
560 if p.tok == token.PERIOD {
561
562 p.next()
563 sel := p.parseIdent()
564 return &ast.SelectorExpr{X: ident, Sel: sel}
565 }
566
567 return ident
568 }
569
570
571
572 func (p *parser) parseArrayType(lbrack token.Pos, len ast.Expr) *ast.ArrayType {
573 if p.trace {
574 defer un(trace(p, "ArrayType"))
575 }
576
577 if len == nil {
578 p.exprLev++
579
580 if p.tok == token.ELLIPSIS {
581 len = &ast.Ellipsis{Ellipsis: p.pos}
582 p.next()
583 } else if p.tok != token.RBRACK {
584 len = p.parseRhs()
585 }
586 p.exprLev--
587 }
588 if p.tok == token.COMMA {
589
590
591
592 p.error(p.pos, "unexpected comma; expecting ]")
593 p.next()
594 }
595 p.expect(token.RBRACK)
596 elt := p.parseType()
597 return &ast.ArrayType{Lbrack: lbrack, Len: len, Elt: elt}
598 }
599
600 func (p *parser) parseArrayFieldOrTypeInstance(x *ast.Ident) (*ast.Ident, ast.Expr) {
601 if p.trace {
602 defer un(trace(p, "ArrayFieldOrTypeInstance"))
603 }
604
605 lbrack := p.expect(token.LBRACK)
606 trailingComma := token.NoPos
607 var args []ast.Expr
608 if p.tok != token.RBRACK {
609 p.exprLev++
610 args = append(args, p.parseRhs())
611 for p.tok == token.COMMA {
612 comma := p.pos
613 p.next()
614 if p.tok == token.RBRACK {
615 trailingComma = comma
616 break
617 }
618 args = append(args, p.parseRhs())
619 }
620 p.exprLev--
621 }
622 rbrack := p.expect(token.RBRACK)
623
624 if len(args) == 0 {
625
626 elt := p.parseType()
627 return x, &ast.ArrayType{Lbrack: lbrack, Elt: elt}
628 }
629
630
631 if len(args) == 1 {
632 elt := p.tryIdentOrType()
633 if elt != nil {
634
635 if trailingComma.IsValid() {
636
637 p.error(trailingComma, "unexpected comma; expecting ]")
638 }
639 return x, &ast.ArrayType{Lbrack: lbrack, Len: args[0], Elt: elt}
640 }
641 }
642
643
644 return nil, packIndexExpr(x, lbrack, args, rbrack)
645 }
646
647 func (p *parser) parseFieldDecl() *ast.Field {
648 if p.trace {
649 defer un(trace(p, "FieldDecl"))
650 }
651
652 doc := p.leadComment
653
654 var names []*ast.Ident
655 var typ ast.Expr
656 switch p.tok {
657 case token.IDENT:
658 name := p.parseIdent()
659 if p.tok == token.PERIOD || p.tok == token.STRING || p.tok == token.SEMICOLON || p.tok == token.RBRACE {
660
661 typ = name
662 if p.tok == token.PERIOD {
663 typ = p.parseQualifiedIdent(name)
664 }
665 } else {
666
667 names = []*ast.Ident{name}
668 for p.tok == token.COMMA {
669 p.next()
670 names = append(names, p.parseIdent())
671 }
672
673
674 if len(names) == 1 && p.tok == token.LBRACK {
675 name, typ = p.parseArrayFieldOrTypeInstance(name)
676 if name == nil {
677 names = nil
678 }
679 } else {
680
681 typ = p.parseType()
682 }
683 }
684 case token.MUL:
685 star := p.pos
686 p.next()
687 if p.tok == token.LPAREN {
688
689 p.error(p.pos, "cannot parenthesize embedded type")
690 p.next()
691 typ = p.parseQualifiedIdent(nil)
692
693 if p.tok == token.RPAREN {
694 p.next()
695 }
696 } else {
697
698 typ = p.parseQualifiedIdent(nil)
699 }
700 typ = &ast.StarExpr{Star: star, X: typ}
701
702 case token.LPAREN:
703 p.error(p.pos, "cannot parenthesize embedded type")
704 p.next()
705 if p.tok == token.MUL {
706
707 star := p.pos
708 p.next()
709 typ = &ast.StarExpr{Star: star, X: p.parseQualifiedIdent(nil)}
710 } else {
711
712 typ = p.parseQualifiedIdent(nil)
713 }
714
715 if p.tok == token.RPAREN {
716 p.next()
717 }
718
719 default:
720 pos := p.pos
721 p.errorExpected(pos, "field name or embedded type")
722 p.advance(exprEnd)
723 typ = &ast.BadExpr{From: pos, To: p.pos}
724 }
725
726 var tag *ast.BasicLit
727 if p.tok == token.STRING {
728 tag = &ast.BasicLit{ValuePos: p.pos, ValueEnd: p.end(), Kind: p.tok, Value: p.lit}
729 p.next()
730 }
731
732 comment := p.expectSemi()
733
734 field := &ast.Field{Doc: doc, Names: names, Type: typ, Tag: tag, Comment: comment}
735 return field
736 }
737
738 func (p *parser) parseStructType() *ast.StructType {
739 if p.trace {
740 defer un(trace(p, "StructType"))
741 }
742
743 pos := p.expect(token.STRUCT)
744 lbrace := p.expect(token.LBRACE)
745 var list []*ast.Field
746 for p.tok == token.IDENT || p.tok == token.MUL || p.tok == token.LPAREN {
747
748
749
750 list = append(list, p.parseFieldDecl())
751 }
752 rbrace := p.expect(token.RBRACE)
753
754 return &ast.StructType{
755 Struct: pos,
756 Fields: &ast.FieldList{
757 Opening: lbrace,
758 List: list,
759 Closing: rbrace,
760 },
761 }
762 }
763
764 func (p *parser) parsePointerType() *ast.StarExpr {
765 if p.trace {
766 defer un(trace(p, "PointerType"))
767 }
768
769 star := p.expect(token.MUL)
770 base := p.parseType()
771
772 return &ast.StarExpr{Star: star, X: base}
773 }
774
775 func (p *parser) parseDotsType() *ast.Ellipsis {
776 if p.trace {
777 defer un(trace(p, "DotsType"))
778 }
779
780 pos := p.expect(token.ELLIPSIS)
781 elt := p.parseType()
782
783 return &ast.Ellipsis{Ellipsis: pos, Elt: elt}
784 }
785
786 type field struct {
787 name *ast.Ident
788 typ ast.Expr
789 }
790
791 func (p *parser) parseParamDecl(name *ast.Ident, typeSetsOK bool) (f field) {
792
793
794 if p.trace {
795 defer un(trace(p, "ParamDecl"))
796 }
797
798 ptok := p.tok
799 if name != nil {
800 p.tok = token.IDENT
801 } else if typeSetsOK && p.tok == token.TILDE {
802
803 return field{nil, p.embeddedElem(nil)}
804 }
805
806 switch p.tok {
807 case token.IDENT:
808
809 if name != nil {
810 f.name = name
811 p.tok = ptok
812 } else {
813 f.name = p.parseIdent()
814 }
815 switch p.tok {
816 case token.IDENT, token.MUL, token.ARROW, token.FUNC, token.CHAN, token.MAP, token.STRUCT, token.INTERFACE, token.LPAREN:
817
818 f.typ = p.parseType()
819
820 case token.LBRACK:
821
822 f.name, f.typ = p.parseArrayFieldOrTypeInstance(f.name)
823
824 case token.ELLIPSIS:
825
826 f.typ = p.parseDotsType()
827 return
828
829 case token.PERIOD:
830
831 f.typ = p.parseQualifiedIdent(f.name)
832 f.name = nil
833
834 case token.TILDE:
835 if typeSetsOK {
836 f.typ = p.embeddedElem(nil)
837 return
838 }
839
840 case token.OR:
841 if typeSetsOK {
842
843 f.typ = p.embeddedElem(f.name)
844 f.name = nil
845 return
846 }
847 }
848
849 case token.MUL, token.ARROW, token.FUNC, token.LBRACK, token.CHAN, token.MAP, token.STRUCT, token.INTERFACE, token.LPAREN:
850
851 f.typ = p.parseType()
852
853 case token.ELLIPSIS:
854
855
856 f.typ = p.parseDotsType()
857 return
858
859 default:
860
861
862 p.errorExpected(p.pos, "')'")
863 p.advance(exprEnd)
864 }
865
866
867 if typeSetsOK && p.tok == token.OR && f.typ != nil {
868 f.typ = p.embeddedElem(f.typ)
869 }
870
871 return
872 }
873
874 func (p *parser) parseParameterList(name0 *ast.Ident, typ0 ast.Expr, closing token.Token, dddok bool) (params []*ast.Field) {
875 if p.trace {
876 defer un(trace(p, "ParameterList"))
877 }
878
879
880 tparams := closing == token.RBRACK
881
882 pos0 := p.pos
883 if name0 != nil {
884 pos0 = name0.Pos()
885 } else if typ0 != nil {
886 pos0 = typ0.Pos()
887 }
888
889
890
891
892
893
894
895 var list []field
896 var named int
897 var typed int
898
899 for name0 != nil || p.tok != closing && p.tok != token.EOF {
900 var par field
901 if typ0 != nil {
902 if tparams {
903 typ0 = p.embeddedElem(typ0)
904 }
905 par = field{name0, typ0}
906 } else {
907 par = p.parseParamDecl(name0, tparams)
908 }
909 name0 = nil
910 typ0 = nil
911 if par.name != nil || par.typ != nil {
912 list = append(list, par)
913 if par.name != nil && par.typ != nil {
914 named++
915 }
916 if par.typ != nil {
917 typed++
918 }
919 }
920 if !p.atComma("parameter list", closing) {
921 break
922 }
923 p.next()
924 }
925
926 if len(list) == 0 {
927 return
928 }
929
930
931 if named == 0 {
932
933 for i := range list {
934 par := &list[i]
935 if typ := par.name; typ != nil {
936 par.typ = typ
937 par.name = nil
938 }
939 }
940 if tparams {
941
942
943 var errPos token.Pos
944 var msg string
945 if named == typed {
946 errPos = p.pos
947 msg = "missing type constraint"
948 } else {
949 errPos = pos0
950 msg = "missing type parameter name"
951 if len(list) == 1 {
952 msg += " or invalid array length"
953 }
954 }
955 p.error(errPos, msg)
956 }
957 } else if named != len(list) {
958
959 var errPos token.Pos
960 var typ ast.Expr
961 for i := range list {
962 if par := &list[len(list)-i-1]; par.typ != nil {
963 typ = par.typ
964 if par.name == nil {
965 errPos = typ.Pos()
966 n := ast.NewIdent("_")
967 n.NamePos = errPos
968 par.name = n
969 }
970 } else if typ != nil {
971 par.typ = typ
972 } else {
973
974 errPos = par.name.Pos()
975 par.typ = &ast.BadExpr{From: errPos, To: p.pos}
976 }
977 }
978 if errPos.IsValid() {
979
980
981
982
983
984
985 var msg string
986 if named == typed {
987 errPos = p.pos
988 if tparams {
989 msg = "missing type constraint"
990 } else {
991 msg = "missing parameter type"
992 }
993 } else {
994 if tparams {
995 msg = "missing type parameter name"
996
997 if len(list) == 1 {
998 msg += " or invalid array length"
999 }
1000 } else {
1001 msg = "missing parameter name"
1002 }
1003 }
1004 p.error(errPos, msg)
1005 }
1006 }
1007
1008
1009 first := true
1010 for i, _ := range list {
1011 f := &list[i]
1012 if t, _ := f.typ.(*ast.Ellipsis); t != nil && (!dddok || i+1 < len(list)) {
1013 if first {
1014 first = false
1015 if dddok {
1016 p.error(t.Ellipsis, "can only use ... with final parameter")
1017 } else {
1018 p.error(t.Ellipsis, "invalid use of ...")
1019 }
1020 }
1021
1022
1023
1024 f.typ = &ast.BadExpr{From: t.Pos(), To: t.End()}
1025 }
1026 }
1027
1028
1029
1030 if named == 0 {
1031
1032 for _, par := range list {
1033 assert(par.typ != nil, "nil type in unnamed parameter list")
1034 params = append(params, &ast.Field{Type: par.typ})
1035 }
1036 return
1037 }
1038
1039
1040
1041 var names []*ast.Ident
1042 var typ ast.Expr
1043 addParams := func() {
1044 assert(typ != nil, "nil type in named parameter list")
1045 field := &ast.Field{Names: names, Type: typ}
1046 params = append(params, field)
1047 names = nil
1048 }
1049 for _, par := range list {
1050 if par.typ != typ {
1051 if len(names) > 0 {
1052 addParams()
1053 }
1054 typ = par.typ
1055 }
1056 names = append(names, par.name)
1057 }
1058 if len(names) > 0 {
1059 addParams()
1060 }
1061 return
1062 }
1063
1064 func (p *parser) parseTypeParameters() *ast.FieldList {
1065 if p.trace {
1066 defer un(trace(p, "TypeParameters"))
1067 }
1068
1069 lbrack := p.expect(token.LBRACK)
1070 var list []*ast.Field
1071 if p.tok != token.RBRACK {
1072 list = p.parseParameterList(nil, nil, token.RBRACK, false)
1073 }
1074 rbrack := p.expect(token.RBRACK)
1075
1076 if len(list) == 0 {
1077 p.error(rbrack, "empty type parameter list")
1078 return nil
1079 }
1080
1081 return &ast.FieldList{Opening: lbrack, List: list, Closing: rbrack}
1082 }
1083
1084 func (p *parser) parseParameters(result bool) *ast.FieldList {
1085 if p.trace {
1086 defer un(trace(p, "Parameters"))
1087 }
1088
1089 if !result || p.tok == token.LPAREN {
1090 lparen := p.expect(token.LPAREN)
1091 var list []*ast.Field
1092 if p.tok != token.RPAREN {
1093 list = p.parseParameterList(nil, nil, token.RPAREN, !result)
1094 }
1095 rparen := p.expect(token.RPAREN)
1096 return &ast.FieldList{Opening: lparen, List: list, Closing: rparen}
1097 }
1098
1099 if typ := p.tryIdentOrType(); typ != nil {
1100 list := make([]*ast.Field, 1)
1101 list[0] = &ast.Field{Type: typ}
1102 return &ast.FieldList{List: list}
1103 }
1104
1105 return nil
1106 }
1107
1108 func (p *parser) parseFuncType() *ast.FuncType {
1109 if p.trace {
1110 defer un(trace(p, "FuncType"))
1111 }
1112
1113 pos := p.expect(token.FUNC)
1114
1115 if p.tok == token.LBRACK {
1116 tparams := p.parseTypeParameters()
1117 if tparams != nil {
1118 p.error(tparams.Opening, "function type must have no type parameters")
1119 }
1120 }
1121 params := p.parseParameters(false)
1122 results := p.parseParameters(true)
1123
1124 return &ast.FuncType{Func: pos, Params: params, Results: results}
1125 }
1126
1127 func (p *parser) parseMethodSpec() *ast.Field {
1128 if p.trace {
1129 defer un(trace(p, "MethodSpec"))
1130 }
1131
1132 doc := p.leadComment
1133 var idents []*ast.Ident
1134 var typ ast.Expr
1135 x := p.parseTypeName(nil)
1136 if ident, _ := x.(*ast.Ident); ident != nil {
1137 switch {
1138 case p.tok == token.LBRACK:
1139
1140 lbrack := p.pos
1141 p.next()
1142 p.exprLev++
1143 x := p.parseExpr()
1144 p.exprLev--
1145 if name0, _ := x.(*ast.Ident); name0 != nil && p.tok != token.COMMA && p.tok != token.RBRACK {
1146
1147
1148
1149
1150 _ = p.parseParameterList(name0, nil, token.RBRACK, false)
1151 _ = p.expect(token.RBRACK)
1152 p.error(lbrack, "interface method must have no type parameters")
1153
1154
1155 params := p.parseParameters(false)
1156 results := p.parseParameters(true)
1157 idents = []*ast.Ident{ident}
1158 typ = &ast.FuncType{
1159 Func: token.NoPos,
1160 Params: params,
1161 Results: results,
1162 }
1163 } else {
1164
1165
1166 list := []ast.Expr{x}
1167 if p.atComma("type argument list", token.RBRACK) {
1168 p.exprLev++
1169 p.next()
1170 for p.tok != token.RBRACK && p.tok != token.EOF {
1171 list = append(list, p.parseType())
1172 if !p.atComma("type argument list", token.RBRACK) {
1173 break
1174 }
1175 p.next()
1176 }
1177 p.exprLev--
1178 }
1179 rbrack := p.expectClosing(token.RBRACK, "type argument list")
1180 typ = packIndexExpr(ident, lbrack, list, rbrack)
1181 }
1182 case p.tok == token.LPAREN:
1183
1184
1185 params := p.parseParameters(false)
1186 results := p.parseParameters(true)
1187 idents = []*ast.Ident{ident}
1188 typ = &ast.FuncType{Func: token.NoPos, Params: params, Results: results}
1189 default:
1190
1191 typ = x
1192 }
1193 } else {
1194
1195 typ = x
1196 if p.tok == token.LBRACK {
1197
1198 typ = p.parseTypeInstance(typ)
1199 }
1200 }
1201
1202
1203
1204
1205
1206 return &ast.Field{Doc: doc, Names: idents, Type: typ}
1207 }
1208
1209 func (p *parser) embeddedElem(x ast.Expr) ast.Expr {
1210 if p.trace {
1211 defer un(trace(p, "EmbeddedElem"))
1212 }
1213 if x == nil {
1214 x = p.embeddedTerm()
1215 }
1216 for p.tok == token.OR {
1217 t := new(ast.BinaryExpr)
1218 t.OpPos = p.pos
1219 t.Op = token.OR
1220 p.next()
1221 t.X = x
1222 t.Y = p.embeddedTerm()
1223 x = t
1224 }
1225 return x
1226 }
1227
1228 func (p *parser) embeddedTerm() ast.Expr {
1229 if p.trace {
1230 defer un(trace(p, "EmbeddedTerm"))
1231 }
1232 if p.tok == token.TILDE {
1233 t := new(ast.UnaryExpr)
1234 t.OpPos = p.pos
1235 t.Op = token.TILDE
1236 p.next()
1237 t.X = p.parseType()
1238 return t
1239 }
1240
1241 t := p.tryIdentOrType()
1242 if t == nil {
1243 pos := p.pos
1244 p.errorExpected(pos, "~ term or type")
1245 p.advance(exprEnd)
1246 return &ast.BadExpr{From: pos, To: p.pos}
1247 }
1248
1249 return t
1250 }
1251
1252 func (p *parser) parseInterfaceType() *ast.InterfaceType {
1253 if p.trace {
1254 defer un(trace(p, "InterfaceType"))
1255 }
1256
1257 pos := p.expect(token.INTERFACE)
1258 lbrace := p.expect(token.LBRACE)
1259
1260 var list []*ast.Field
1261
1262 parseElements:
1263 for {
1264 switch {
1265 case p.tok == token.IDENT:
1266 f := p.parseMethodSpec()
1267 if f.Names == nil {
1268 f.Type = p.embeddedElem(f.Type)
1269 }
1270 f.Comment = p.expectSemi()
1271 list = append(list, f)
1272 case p.tok == token.TILDE:
1273 typ := p.embeddedElem(nil)
1274 comment := p.expectSemi()
1275 list = append(list, &ast.Field{Type: typ, Comment: comment})
1276 default:
1277 if t := p.tryIdentOrType(); t != nil {
1278 typ := p.embeddedElem(t)
1279 comment := p.expectSemi()
1280 list = append(list, &ast.Field{Type: typ, Comment: comment})
1281 } else {
1282 break parseElements
1283 }
1284 }
1285 }
1286
1287
1288
1289 rbrace := p.expect(token.RBRACE)
1290
1291 return &ast.InterfaceType{
1292 Interface: pos,
1293 Methods: &ast.FieldList{
1294 Opening: lbrace,
1295 List: list,
1296 Closing: rbrace,
1297 },
1298 }
1299 }
1300
1301 func (p *parser) parseMapType() *ast.MapType {
1302 if p.trace {
1303 defer un(trace(p, "MapType"))
1304 }
1305
1306 pos := p.expect(token.MAP)
1307 p.expect(token.LBRACK)
1308 key := p.parseType()
1309 p.expect(token.RBRACK)
1310 value := p.parseType()
1311
1312 return &ast.MapType{Map: pos, Key: key, Value: value}
1313 }
1314
1315 func (p *parser) parseChanType() *ast.ChanType {
1316 if p.trace {
1317 defer un(trace(p, "ChanType"))
1318 }
1319
1320 pos := p.pos
1321 dir := ast.SEND | ast.RECV
1322 var arrow token.Pos
1323 if p.tok == token.CHAN {
1324 p.next()
1325 if p.tok == token.ARROW {
1326 arrow = p.pos
1327 p.next()
1328 dir = ast.SEND
1329 }
1330 } else {
1331 arrow = p.expect(token.ARROW)
1332 p.expect(token.CHAN)
1333 dir = ast.RECV
1334 }
1335 value := p.parseType()
1336
1337 return &ast.ChanType{Begin: pos, Arrow: arrow, Dir: dir, Value: value}
1338 }
1339
1340 func (p *parser) parseTypeInstance(typ ast.Expr) ast.Expr {
1341 if p.trace {
1342 defer un(trace(p, "TypeInstance"))
1343 }
1344
1345 opening := p.expect(token.LBRACK)
1346 p.exprLev++
1347 var list []ast.Expr
1348 for p.tok != token.RBRACK && p.tok != token.EOF {
1349 list = append(list, p.parseType())
1350 if !p.atComma("type argument list", token.RBRACK) {
1351 break
1352 }
1353 p.next()
1354 }
1355 p.exprLev--
1356
1357 closing := p.expectClosing(token.RBRACK, "type argument list")
1358
1359 if len(list) == 0 {
1360 p.errorExpected(closing, "type argument list")
1361 return &ast.IndexExpr{
1362 X: typ,
1363 Lbrack: opening,
1364 Index: &ast.BadExpr{From: opening + 1, To: closing},
1365 Rbrack: closing,
1366 }
1367 }
1368
1369 return packIndexExpr(typ, opening, list, closing)
1370 }
1371
1372 func (p *parser) tryIdentOrType() ast.Expr {
1373 defer decNestLev(incNestLev(p))
1374
1375 switch p.tok {
1376 case token.IDENT:
1377 typ := p.parseTypeName(nil)
1378 if p.tok == token.LBRACK {
1379 typ = p.parseTypeInstance(typ)
1380 }
1381 return typ
1382 case token.LBRACK:
1383 lbrack := p.expect(token.LBRACK)
1384 return p.parseArrayType(lbrack, nil)
1385 case token.STRUCT:
1386 return p.parseStructType()
1387 case token.MUL:
1388 return p.parsePointerType()
1389 case token.FUNC:
1390 return p.parseFuncType()
1391 case token.INTERFACE:
1392 return p.parseInterfaceType()
1393 case token.MAP:
1394 return p.parseMapType()
1395 case token.CHAN, token.ARROW:
1396 return p.parseChanType()
1397 case token.LPAREN:
1398 lparen := p.pos
1399 p.next()
1400 typ := p.parseType()
1401 rparen := p.expect(token.RPAREN)
1402 return &ast.ParenExpr{Lparen: lparen, X: typ, Rparen: rparen}
1403 }
1404
1405
1406 return nil
1407 }
1408
1409
1410
1411
1412 func (p *parser) parseStmtList() (list []ast.Stmt) {
1413 if p.trace {
1414 defer un(trace(p, "StatementList"))
1415 }
1416
1417 for p.tok != token.CASE && p.tok != token.DEFAULT && p.tok != token.RBRACE && p.tok != token.EOF {
1418 list = append(list, p.parseStmt())
1419 }
1420
1421 return
1422 }
1423
1424 func (p *parser) parseBody() *ast.BlockStmt {
1425 if p.trace {
1426 defer un(trace(p, "Body"))
1427 }
1428
1429 lbrace := p.expect(token.LBRACE)
1430 list := p.parseStmtList()
1431 rbrace := p.expect2(token.RBRACE)
1432
1433 return &ast.BlockStmt{Lbrace: lbrace, List: list, Rbrace: rbrace}
1434 }
1435
1436 func (p *parser) parseBlockStmt() *ast.BlockStmt {
1437 if p.trace {
1438 defer un(trace(p, "BlockStmt"))
1439 }
1440
1441 lbrace := p.expect(token.LBRACE)
1442 list := p.parseStmtList()
1443 rbrace := p.expect2(token.RBRACE)
1444
1445 return &ast.BlockStmt{Lbrace: lbrace, List: list, Rbrace: rbrace}
1446 }
1447
1448
1449
1450
1451 func (p *parser) parseFuncTypeOrLit() ast.Expr {
1452 if p.trace {
1453 defer un(trace(p, "FuncTypeOrLit"))
1454 }
1455
1456 typ := p.parseFuncType()
1457 if p.tok != token.LBRACE {
1458
1459 return typ
1460 }
1461
1462 p.exprLev++
1463 body := p.parseBody()
1464 p.exprLev--
1465
1466 return &ast.FuncLit{Type: typ, Body: body}
1467 }
1468
1469
1470
1471 func (p *parser) parseOperand() ast.Expr {
1472 if p.trace {
1473 defer un(trace(p, "Operand"))
1474 }
1475
1476 switch p.tok {
1477 case token.IDENT:
1478 return p.parseIdent()
1479
1480 case token.INT, token.FLOAT, token.IMAG, token.CHAR, token.STRING:
1481 x := &ast.BasicLit{ValuePos: p.pos, ValueEnd: p.end(), Kind: p.tok, Value: p.lit}
1482 p.next()
1483 return x
1484
1485 case token.LBRACE:
1486 return p.parseLiteralValue(nil)
1487
1488 case token.LPAREN:
1489 lparen := p.pos
1490 p.next()
1491 p.exprLev++
1492 x := p.parseRhs()
1493 p.exprLev--
1494 rparen := p.expect(token.RPAREN)
1495 return &ast.ParenExpr{Lparen: lparen, X: x, Rparen: rparen}
1496
1497 case token.FUNC:
1498 return p.parseFuncTypeOrLit()
1499 }
1500
1501 if typ := p.tryIdentOrType(); typ != nil {
1502
1503 _, isIdent := typ.(*ast.Ident)
1504 assert(!isIdent, "type cannot be identifier")
1505 return typ
1506 }
1507
1508
1509 pos := p.pos
1510 p.errorExpected(pos, "operand")
1511 p.advance(stmtStart)
1512 return &ast.BadExpr{From: pos, To: p.pos}
1513 }
1514
1515 func (p *parser) parseSelector(x ast.Expr) ast.Expr {
1516 if p.trace {
1517 defer un(trace(p, "Selector"))
1518 }
1519
1520 sel := p.parseIdent()
1521
1522 return &ast.SelectorExpr{X: x, Sel: sel}
1523 }
1524
1525 func (p *parser) parseTypeAssertion(x ast.Expr) ast.Expr {
1526 if p.trace {
1527 defer un(trace(p, "TypeAssertion"))
1528 }
1529
1530 lparen := p.expect(token.LPAREN)
1531 var typ ast.Expr
1532 if p.tok == token.TYPE {
1533
1534 p.next()
1535 } else {
1536 typ = p.parseType()
1537 }
1538 rparen := p.expect(token.RPAREN)
1539
1540 return &ast.TypeAssertExpr{X: x, Type: typ, Lparen: lparen, Rparen: rparen}
1541 }
1542
1543 func (p *parser) parseIndexOrSliceOrInstance(x ast.Expr) ast.Expr {
1544 if p.trace {
1545 defer un(trace(p, "parseIndexOrSliceOrInstance"))
1546 }
1547
1548 lbrack := p.expect(token.LBRACK)
1549 if p.tok == token.RBRACK {
1550
1551
1552 p.errorExpected(p.pos, "operand")
1553 rbrack := p.pos
1554 p.next()
1555 return &ast.IndexExpr{
1556 X: x,
1557 Lbrack: lbrack,
1558 Index: &ast.BadExpr{From: rbrack, To: rbrack},
1559 Rbrack: rbrack,
1560 }
1561 }
1562 p.exprLev++
1563
1564 const N = 3
1565 var args []ast.Expr
1566 var index [N]ast.Expr
1567 var colons [N - 1]token.Pos
1568 if p.tok != token.COLON {
1569
1570
1571 index[0] = p.parseRhs()
1572 }
1573 ncolons := 0
1574 switch p.tok {
1575 case token.COLON:
1576
1577 for p.tok == token.COLON && ncolons < len(colons) {
1578 colons[ncolons] = p.pos
1579 ncolons++
1580 p.next()
1581 if p.tok != token.COLON && p.tok != token.RBRACK && p.tok != token.EOF {
1582 index[ncolons] = p.parseRhs()
1583 }
1584 }
1585 case token.COMMA:
1586
1587 args = append(args, index[0])
1588 for p.tok == token.COMMA {
1589 p.next()
1590 if p.tok != token.RBRACK && p.tok != token.EOF {
1591 args = append(args, p.parseType())
1592 }
1593 }
1594 }
1595
1596 p.exprLev--
1597 rbrack := p.expect(token.RBRACK)
1598
1599 if ncolons > 0 {
1600
1601 slice3 := false
1602 if ncolons == 2 {
1603 slice3 = true
1604
1605
1606 if index[1] == nil {
1607 p.error(colons[0], "middle index required in 3-index slice")
1608 index[1] = &ast.BadExpr{From: colons[0] + 1, To: colons[1]}
1609 }
1610 if index[2] == nil {
1611 p.error(colons[1], "final index required in 3-index slice")
1612 index[2] = &ast.BadExpr{From: colons[1] + 1, To: rbrack}
1613 }
1614 }
1615 return &ast.SliceExpr{X: x, Lbrack: lbrack, Low: index[0], High: index[1], Max: index[2], Slice3: slice3, Rbrack: rbrack}
1616 }
1617
1618 if len(args) == 0 {
1619
1620 return &ast.IndexExpr{X: x, Lbrack: lbrack, Index: index[0], Rbrack: rbrack}
1621 }
1622
1623
1624 return packIndexExpr(x, lbrack, args, rbrack)
1625 }
1626
1627 func (p *parser) parseCallOrConversion(fun ast.Expr) *ast.CallExpr {
1628 if p.trace {
1629 defer un(trace(p, "CallOrConversion"))
1630 }
1631
1632 lparen := p.expect(token.LPAREN)
1633 p.exprLev++
1634 var list []ast.Expr
1635 var ellipsis token.Pos
1636 for p.tok != token.RPAREN && p.tok != token.EOF && !ellipsis.IsValid() {
1637 list = append(list, p.parseRhs())
1638 if p.tok == token.ELLIPSIS {
1639 ellipsis = p.pos
1640 p.next()
1641 }
1642 if !p.atComma("argument list", token.RPAREN) {
1643 break
1644 }
1645 p.next()
1646 }
1647 p.exprLev--
1648 rparen := p.expectClosing(token.RPAREN, "argument list")
1649
1650 return &ast.CallExpr{Fun: fun, Lparen: lparen, Args: list, Ellipsis: ellipsis, Rparen: rparen}
1651 }
1652
1653 func (p *parser) parseElement() ast.Expr {
1654 if p.trace {
1655 defer un(trace(p, "Element"))
1656 }
1657
1658 x := p.parseExpr()
1659 if p.tok == token.COLON {
1660 colon := p.pos
1661 p.next()
1662 x = &ast.KeyValueExpr{Key: x, Colon: colon, Value: p.parseExpr()}
1663 }
1664
1665 return x
1666 }
1667
1668 func (p *parser) parseElementList() (list []ast.Expr) {
1669 if p.trace {
1670 defer un(trace(p, "ElementList"))
1671 }
1672
1673 for p.tok != token.RBRACE && p.tok != token.EOF {
1674 list = append(list, p.parseElement())
1675 if !p.atComma("composite literal", token.RBRACE) {
1676 break
1677 }
1678 p.next()
1679 }
1680
1681 return
1682 }
1683
1684 func (p *parser) parseLiteralValue(typ ast.Expr) ast.Expr {
1685 defer decNestLev(incNestLev(p))
1686
1687 if p.trace {
1688 defer un(trace(p, "LiteralValue"))
1689 }
1690
1691 lbrace := p.expect(token.LBRACE)
1692 var elts []ast.Expr
1693 p.exprLev++
1694 if p.tok != token.RBRACE {
1695 elts = p.parseElementList()
1696 }
1697 p.exprLev--
1698 rbrace := p.expectClosing(token.RBRACE, "composite literal")
1699 return &ast.CompositeLit{Type: typ, Lbrace: lbrace, Elts: elts, Rbrace: rbrace}
1700 }
1701
1702 func (p *parser) parsePrimaryExpr(x ast.Expr) ast.Expr {
1703 if p.trace {
1704 defer un(trace(p, "PrimaryExpr"))
1705 }
1706
1707 if x == nil {
1708 x = p.parseOperand()
1709 }
1710
1711
1712
1713 var n int
1714 defer func() { p.nestLev -= n }()
1715 for n = 1; ; n++ {
1716 incNestLev(p)
1717 switch p.tok {
1718 case token.PERIOD:
1719 p.next()
1720 switch p.tok {
1721 case token.IDENT:
1722 x = p.parseSelector(x)
1723 case token.LPAREN:
1724 x = p.parseTypeAssertion(x)
1725 default:
1726 pos := p.pos
1727 p.errorExpected(pos, "selector or type assertion")
1728
1729
1730
1731
1732
1733 if p.tok != token.RBRACE {
1734 p.next()
1735 }
1736 sel := &ast.Ident{NamePos: pos, Name: "_"}
1737 x = &ast.SelectorExpr{X: x, Sel: sel}
1738 }
1739 case token.LBRACK:
1740 x = p.parseIndexOrSliceOrInstance(x)
1741 case token.LPAREN:
1742 x = p.parseCallOrConversion(x)
1743 case token.LBRACE:
1744
1745
1746 t := ast.Unparen(x)
1747
1748 switch t.(type) {
1749 case *ast.BadExpr, *ast.Ident, *ast.SelectorExpr:
1750 if p.exprLev < 0 {
1751 return x
1752 }
1753
1754 case *ast.IndexExpr, *ast.IndexListExpr:
1755 if p.exprLev < 0 {
1756 return x
1757 }
1758
1759 case *ast.ArrayType, *ast.StructType, *ast.MapType:
1760
1761 default:
1762 return x
1763 }
1764 if t != x {
1765 p.error(t.Pos(), "cannot parenthesize type in composite literal")
1766
1767 }
1768 x = p.parseLiteralValue(t)
1769 default:
1770 return x
1771 }
1772 }
1773 }
1774
1775 func (p *parser) parseUnaryExpr() ast.Expr {
1776 defer decNestLev(incNestLev(p))
1777
1778 if p.trace {
1779 defer un(trace(p, "UnaryExpr"))
1780 }
1781
1782 switch p.tok {
1783 case token.ADD, token.SUB, token.NOT, token.XOR, token.AND, token.TILDE:
1784 pos, op := p.pos, p.tok
1785 p.next()
1786 x := p.parseUnaryExpr()
1787 return &ast.UnaryExpr{OpPos: pos, Op: op, X: x}
1788
1789 case token.ARROW:
1790
1791 arrow := p.pos
1792 p.next()
1793
1794
1795
1796
1797
1798
1799
1800
1801
1802
1803
1804
1805
1806
1807
1808 x := p.parseUnaryExpr()
1809
1810
1811 if typ, ok := x.(*ast.ChanType); ok {
1812
1813
1814
1815 dir := ast.SEND
1816 for ok && dir == ast.SEND {
1817 if typ.Dir == ast.RECV {
1818
1819 p.errorExpected(typ.Arrow, "'chan'")
1820 }
1821 arrow, typ.Begin, typ.Arrow = typ.Arrow, arrow, arrow
1822 dir, typ.Dir = typ.Dir, ast.RECV
1823 typ, ok = typ.Value.(*ast.ChanType)
1824 }
1825 if dir == ast.SEND {
1826 p.errorExpected(arrow, "channel type")
1827 }
1828
1829 return x
1830 }
1831
1832
1833 return &ast.UnaryExpr{OpPos: arrow, Op: token.ARROW, X: x}
1834
1835 case token.MUL:
1836
1837 pos := p.pos
1838 p.next()
1839 x := p.parseUnaryExpr()
1840 return &ast.StarExpr{Star: pos, X: x}
1841 }
1842
1843 return p.parsePrimaryExpr(nil)
1844 }
1845
1846 func (p *parser) tokPrec() (token.Token, int) {
1847 tok := p.tok
1848 if p.inRhs && tok == token.ASSIGN {
1849 tok = token.EQL
1850 }
1851 return tok, tok.Precedence()
1852 }
1853
1854
1855
1856
1857
1858 func (p *parser) parseBinaryExpr(x ast.Expr, prec1 int) ast.Expr {
1859 if p.trace {
1860 defer un(trace(p, "BinaryExpr"))
1861 }
1862
1863 if x == nil {
1864 x = p.parseUnaryExpr()
1865 }
1866
1867
1868
1869 var n int
1870 defer func() { p.nestLev -= n }()
1871 for n = 1; ; n++ {
1872 incNestLev(p)
1873 op, oprec := p.tokPrec()
1874 if oprec < prec1 {
1875 return x
1876 }
1877 pos := p.expect(op)
1878 y := p.parseBinaryExpr(nil, oprec+1)
1879 x = &ast.BinaryExpr{X: x, OpPos: pos, Op: op, Y: y}
1880 }
1881 }
1882
1883
1884 func (p *parser) parseExpr() ast.Expr {
1885 if p.trace {
1886 defer un(trace(p, "Expression"))
1887 }
1888
1889 return p.parseBinaryExpr(nil, token.LowestPrec+1)
1890 }
1891
1892 func (p *parser) parseRhs() ast.Expr {
1893 old := p.inRhs
1894 p.inRhs = true
1895 x := p.parseExpr()
1896 p.inRhs = old
1897 return x
1898 }
1899
1900
1901
1902
1903
1904 const (
1905 basic = iota
1906 labelOk
1907 rangeOk
1908 )
1909
1910
1911
1912
1913
1914 func (p *parser) parseSimpleStmt(mode int) (ast.Stmt, bool) {
1915 if p.trace {
1916 defer un(trace(p, "SimpleStmt"))
1917 }
1918
1919 x := p.parseList(false)
1920
1921 switch p.tok {
1922 case
1923 token.DEFINE, token.ASSIGN, token.ADD_ASSIGN,
1924 token.SUB_ASSIGN, token.MUL_ASSIGN, token.QUO_ASSIGN,
1925 token.REM_ASSIGN, token.AND_ASSIGN, token.OR_ASSIGN,
1926 token.XOR_ASSIGN, token.SHL_ASSIGN, token.SHR_ASSIGN, token.AND_NOT_ASSIGN:
1927
1928 pos, tok := p.pos, p.tok
1929 p.next()
1930 var y []ast.Expr
1931 isRange := false
1932 if mode == rangeOk && p.tok == token.RANGE && (tok == token.DEFINE || tok == token.ASSIGN) {
1933 pos := p.pos
1934 p.next()
1935 y = []ast.Expr{&ast.UnaryExpr{OpPos: pos, Op: token.RANGE, X: p.parseRhs()}}
1936 isRange = true
1937 } else {
1938 y = p.parseList(true)
1939 }
1940 return &ast.AssignStmt{Lhs: x, TokPos: pos, Tok: tok, Rhs: y}, isRange
1941 }
1942
1943 if len(x) > 1 {
1944 p.errorExpected(x[0].Pos(), "1 expression")
1945
1946 }
1947
1948 switch p.tok {
1949 case token.COLON:
1950
1951 colon := p.pos
1952 p.next()
1953 if label, isIdent := x[0].(*ast.Ident); mode == labelOk && isIdent {
1954
1955
1956
1957 stmt := &ast.LabeledStmt{Label: label, Colon: colon, Stmt: p.parseStmt()}
1958 return stmt, false
1959 }
1960
1961
1962
1963
1964
1965
1966 p.error(colon, "illegal label declaration")
1967 return &ast.BadStmt{From: x[0].Pos(), To: colon + 1}, false
1968
1969 case token.ARROW:
1970
1971 arrow := p.pos
1972 p.next()
1973 y := p.parseRhs()
1974 return &ast.SendStmt{Chan: x[0], Arrow: arrow, Value: y}, false
1975
1976 case token.INC, token.DEC:
1977
1978 s := &ast.IncDecStmt{X: x[0], TokPos: p.pos, Tok: p.tok}
1979 p.next()
1980 return s, false
1981 }
1982
1983
1984 return &ast.ExprStmt{X: x[0]}, false
1985 }
1986
1987 func (p *parser) parseCallExpr(callType string) *ast.CallExpr {
1988 x := p.parseRhs()
1989 if t := ast.Unparen(x); t != x {
1990 p.error(x.Pos(), fmt.Sprintf("expression in %s must not be parenthesized", callType))
1991 x = t
1992 }
1993 if call, isCall := x.(*ast.CallExpr); isCall {
1994 return call
1995 }
1996 if _, isBad := x.(*ast.BadExpr); !isBad {
1997
1998 p.error(x.End(), fmt.Sprintf("expression in %s must be function call", callType))
1999 }
2000 return nil
2001 }
2002
2003 func (p *parser) parseGoStmt() ast.Stmt {
2004 if p.trace {
2005 defer un(trace(p, "GoStmt"))
2006 }
2007
2008 pos := p.expect(token.GO)
2009 call := p.parseCallExpr("go")
2010 p.expectSemi()
2011 if call == nil {
2012 return &ast.BadStmt{From: pos, To: pos + 2}
2013 }
2014
2015 return &ast.GoStmt{Go: pos, Call: call}
2016 }
2017
2018 func (p *parser) parseDeferStmt() ast.Stmt {
2019 if p.trace {
2020 defer un(trace(p, "DeferStmt"))
2021 }
2022
2023 pos := p.expect(token.DEFER)
2024 call := p.parseCallExpr("defer")
2025 p.expectSemi()
2026 if call == nil {
2027 return &ast.BadStmt{From: pos, To: pos + 5}
2028 }
2029
2030 return &ast.DeferStmt{Defer: pos, Call: call}
2031 }
2032
2033 func (p *parser) parseReturnStmt() *ast.ReturnStmt {
2034 if p.trace {
2035 defer un(trace(p, "ReturnStmt"))
2036 }
2037
2038 pos := p.pos
2039 p.expect(token.RETURN)
2040 var x []ast.Expr
2041 if p.tok != token.SEMICOLON && p.tok != token.RBRACE {
2042 x = p.parseList(true)
2043 }
2044 p.expectSemi()
2045
2046 return &ast.ReturnStmt{Return: pos, Results: x}
2047 }
2048
2049 func (p *parser) parseBranchStmt(tok token.Token) *ast.BranchStmt {
2050 if p.trace {
2051 defer un(trace(p, "BranchStmt"))
2052 }
2053
2054 pos := p.expect(tok)
2055 var label *ast.Ident
2056 if tok == token.GOTO || ((tok == token.CONTINUE || tok == token.BREAK) && p.tok == token.IDENT) {
2057 label = p.parseIdent()
2058 }
2059 p.expectSemi()
2060
2061 return &ast.BranchStmt{TokPos: pos, Tok: tok, Label: label}
2062 }
2063
2064 func (p *parser) makeExpr(s ast.Stmt, want string) ast.Expr {
2065 if s == nil {
2066 return nil
2067 }
2068 if es, isExpr := s.(*ast.ExprStmt); isExpr {
2069 return es.X
2070 }
2071 found := "simple statement"
2072 if _, isAss := s.(*ast.AssignStmt); isAss {
2073 found = "assignment"
2074 }
2075 p.error(s.Pos(), fmt.Sprintf("expected %s, found %s (missing parentheses around composite literal?)", want, found))
2076 return &ast.BadExpr{From: s.Pos(), To: s.End()}
2077 }
2078
2079
2080
2081
2082 func (p *parser) parseIfHeader() (init ast.Stmt, cond ast.Expr) {
2083 if p.tok == token.LBRACE {
2084 p.error(p.pos, "missing condition in if statement")
2085 cond = &ast.BadExpr{From: p.pos, To: p.pos}
2086 return
2087 }
2088
2089
2090 prevLev := p.exprLev
2091 p.exprLev = -1
2092
2093 if p.tok != token.SEMICOLON {
2094
2095 if p.tok == token.VAR {
2096 p.next()
2097 p.error(p.pos, "var declaration not allowed in if initializer")
2098 }
2099 init, _ = p.parseSimpleStmt(basic)
2100 }
2101
2102 var condStmt ast.Stmt
2103 var semi struct {
2104 pos token.Pos
2105 lit string
2106 }
2107 if p.tok != token.LBRACE {
2108 if p.tok == token.SEMICOLON {
2109 semi.pos = p.pos
2110 semi.lit = p.lit
2111 p.next()
2112 } else {
2113 p.expect(token.SEMICOLON)
2114 }
2115 if p.tok != token.LBRACE {
2116 condStmt, _ = p.parseSimpleStmt(basic)
2117 }
2118 } else {
2119 condStmt = init
2120 init = nil
2121 }
2122
2123 if condStmt != nil {
2124 cond = p.makeExpr(condStmt, "boolean expression")
2125 } else if semi.pos.IsValid() {
2126 if semi.lit == "\n" {
2127 p.error(semi.pos, "unexpected newline, expecting { after if clause")
2128 } else {
2129 p.error(semi.pos, "missing condition in if statement")
2130 }
2131 }
2132
2133
2134 if cond == nil {
2135 cond = &ast.BadExpr{From: p.pos, To: p.pos}
2136 }
2137
2138 p.exprLev = prevLev
2139 return
2140 }
2141
2142 func (p *parser) parseIfStmt() *ast.IfStmt {
2143 defer decNestLev(incNestLev(p))
2144
2145 if p.trace {
2146 defer un(trace(p, "IfStmt"))
2147 }
2148
2149 pos := p.expect(token.IF)
2150
2151 init, cond := p.parseIfHeader()
2152 body := p.parseBlockStmt()
2153
2154 var else_ ast.Stmt
2155 if p.tok == token.ELSE {
2156 p.next()
2157 switch p.tok {
2158 case token.IF:
2159 else_ = p.parseIfStmt()
2160 case token.LBRACE:
2161 else_ = p.parseBlockStmt()
2162 p.expectSemi()
2163 default:
2164 p.errorExpected(p.pos, "if statement or block")
2165 else_ = &ast.BadStmt{From: p.pos, To: p.pos}
2166 }
2167 } else {
2168 p.expectSemi()
2169 }
2170
2171 return &ast.IfStmt{If: pos, Init: init, Cond: cond, Body: body, Else: else_}
2172 }
2173
2174 func (p *parser) parseCaseClause() *ast.CaseClause {
2175 if p.trace {
2176 defer un(trace(p, "CaseClause"))
2177 }
2178
2179 pos := p.pos
2180 var list []ast.Expr
2181 if p.tok == token.CASE {
2182 p.next()
2183 list = p.parseList(true)
2184 } else {
2185 p.expect(token.DEFAULT)
2186 }
2187
2188 colon := p.expect(token.COLON)
2189 body := p.parseStmtList()
2190
2191 return &ast.CaseClause{Case: pos, List: list, Colon: colon, Body: body}
2192 }
2193
2194 func isTypeSwitchAssert(x ast.Expr) bool {
2195 a, ok := x.(*ast.TypeAssertExpr)
2196 return ok && a.Type == nil
2197 }
2198
2199 func (p *parser) isTypeSwitchGuard(s ast.Stmt) bool {
2200 switch t := s.(type) {
2201 case *ast.ExprStmt:
2202
2203 return isTypeSwitchAssert(t.X)
2204 case *ast.AssignStmt:
2205
2206 if len(t.Lhs) == 1 && len(t.Rhs) == 1 && isTypeSwitchAssert(t.Rhs[0]) {
2207 switch t.Tok {
2208 case token.ASSIGN:
2209
2210 p.error(t.TokPos, "expected ':=', found '='")
2211 fallthrough
2212 case token.DEFINE:
2213 return true
2214 }
2215 }
2216 }
2217 return false
2218 }
2219
2220 func (p *parser) parseSwitchStmt() ast.Stmt {
2221 if p.trace {
2222 defer un(trace(p, "SwitchStmt"))
2223 }
2224
2225 pos := p.expect(token.SWITCH)
2226
2227 var s1, s2 ast.Stmt
2228 if p.tok != token.LBRACE {
2229 prevLev := p.exprLev
2230 p.exprLev = -1
2231 if p.tok != token.SEMICOLON {
2232 s2, _ = p.parseSimpleStmt(basic)
2233 }
2234 if p.tok == token.SEMICOLON {
2235 p.next()
2236 s1 = s2
2237 s2 = nil
2238 if p.tok != token.LBRACE {
2239
2240
2241
2242
2243
2244
2245
2246
2247
2248
2249
2250
2251 s2, _ = p.parseSimpleStmt(basic)
2252 }
2253 }
2254 p.exprLev = prevLev
2255 }
2256
2257 typeSwitch := p.isTypeSwitchGuard(s2)
2258 lbrace := p.expect(token.LBRACE)
2259 var list []ast.Stmt
2260 for p.tok == token.CASE || p.tok == token.DEFAULT {
2261 list = append(list, p.parseCaseClause())
2262 }
2263 rbrace := p.expect(token.RBRACE)
2264 p.expectSemi()
2265 body := &ast.BlockStmt{Lbrace: lbrace, List: list, Rbrace: rbrace}
2266
2267 if typeSwitch {
2268 return &ast.TypeSwitchStmt{Switch: pos, Init: s1, Assign: s2, Body: body}
2269 }
2270
2271 return &ast.SwitchStmt{Switch: pos, Init: s1, Tag: p.makeExpr(s2, "switch expression"), Body: body}
2272 }
2273
2274 func (p *parser) parseCommClause() *ast.CommClause {
2275 if p.trace {
2276 defer un(trace(p, "CommClause"))
2277 }
2278
2279 pos := p.pos
2280 var comm ast.Stmt
2281 if p.tok == token.CASE {
2282 p.next()
2283 lhs := p.parseList(false)
2284 if p.tok == token.ARROW {
2285
2286 if len(lhs) > 1 {
2287 p.errorExpected(lhs[0].Pos(), "1 expression")
2288
2289 }
2290 arrow := p.pos
2291 p.next()
2292 rhs := p.parseRhs()
2293 comm = &ast.SendStmt{Chan: lhs[0], Arrow: arrow, Value: rhs}
2294 } else {
2295
2296 if tok := p.tok; tok == token.ASSIGN || tok == token.DEFINE {
2297
2298 if len(lhs) > 2 {
2299 p.errorExpected(lhs[0].Pos(), "1 or 2 expressions")
2300
2301 lhs = lhs[0:2]
2302 }
2303 pos := p.pos
2304 p.next()
2305 rhs := p.parseRhs()
2306 comm = &ast.AssignStmt{Lhs: lhs, TokPos: pos, Tok: tok, Rhs: []ast.Expr{rhs}}
2307 } else {
2308
2309 if len(lhs) > 1 {
2310 p.errorExpected(lhs[0].Pos(), "1 expression")
2311
2312 }
2313 comm = &ast.ExprStmt{X: lhs[0]}
2314 }
2315 }
2316 } else {
2317 p.expect(token.DEFAULT)
2318 }
2319
2320 colon := p.expect(token.COLON)
2321 body := p.parseStmtList()
2322
2323 return &ast.CommClause{Case: pos, Comm: comm, Colon: colon, Body: body}
2324 }
2325
2326 func (p *parser) parseSelectStmt() *ast.SelectStmt {
2327 if p.trace {
2328 defer un(trace(p, "SelectStmt"))
2329 }
2330
2331 pos := p.expect(token.SELECT)
2332 lbrace := p.expect(token.LBRACE)
2333 var list []ast.Stmt
2334 for p.tok == token.CASE || p.tok == token.DEFAULT {
2335 list = append(list, p.parseCommClause())
2336 }
2337 rbrace := p.expect(token.RBRACE)
2338 p.expectSemi()
2339 body := &ast.BlockStmt{Lbrace: lbrace, List: list, Rbrace: rbrace}
2340
2341 return &ast.SelectStmt{Select: pos, Body: body}
2342 }
2343
2344 func (p *parser) parseForStmt() ast.Stmt {
2345 if p.trace {
2346 defer un(trace(p, "ForStmt"))
2347 }
2348
2349 pos := p.expect(token.FOR)
2350
2351 var s1, s2, s3 ast.Stmt
2352 var isRange bool
2353 if p.tok != token.LBRACE {
2354 prevLev := p.exprLev
2355 p.exprLev = -1
2356 if p.tok != token.SEMICOLON {
2357 if p.tok == token.RANGE {
2358
2359 pos := p.pos
2360 p.next()
2361 y := []ast.Expr{&ast.UnaryExpr{OpPos: pos, Op: token.RANGE, X: p.parseRhs()}}
2362 s2 = &ast.AssignStmt{Rhs: y}
2363 isRange = true
2364 } else {
2365 s2, isRange = p.parseSimpleStmt(rangeOk)
2366 }
2367 }
2368 if !isRange && p.tok == token.SEMICOLON {
2369 p.next()
2370 s1 = s2
2371 s2 = nil
2372 if p.tok != token.SEMICOLON {
2373 s2, _ = p.parseSimpleStmt(basic)
2374 }
2375 p.expectSemi()
2376 if p.tok != token.LBRACE {
2377 s3, _ = p.parseSimpleStmt(basic)
2378 }
2379 }
2380 p.exprLev = prevLev
2381 }
2382
2383 body := p.parseBlockStmt()
2384 p.expectSemi()
2385
2386 if isRange {
2387 as := s2.(*ast.AssignStmt)
2388
2389 var key, value ast.Expr
2390 switch len(as.Lhs) {
2391 case 0:
2392
2393 case 1:
2394 key = as.Lhs[0]
2395 case 2:
2396 key, value = as.Lhs[0], as.Lhs[1]
2397 default:
2398 p.errorExpected(as.Lhs[len(as.Lhs)-1].Pos(), "at most 2 expressions")
2399 return &ast.BadStmt{From: pos, To: body.End()}
2400 }
2401
2402
2403 x := as.Rhs[0].(*ast.UnaryExpr).X
2404 return &ast.RangeStmt{
2405 For: pos,
2406 Key: key,
2407 Value: value,
2408 TokPos: as.TokPos,
2409 Tok: as.Tok,
2410 Range: as.Rhs[0].Pos(),
2411 X: x,
2412 Body: body,
2413 }
2414 }
2415
2416
2417 return &ast.ForStmt{
2418 For: pos,
2419 Init: s1,
2420 Cond: p.makeExpr(s2, "boolean or range expression"),
2421 Post: s3,
2422 Body: body,
2423 }
2424 }
2425
2426 func (p *parser) parseStmt() (s ast.Stmt) {
2427 defer decNestLev(incNestLev(p))
2428
2429 if p.trace {
2430 defer un(trace(p, "Statement"))
2431 }
2432
2433 switch p.tok {
2434 case token.CONST, token.TYPE, token.VAR:
2435 s = &ast.DeclStmt{Decl: p.parseDecl(stmtStart)}
2436 case
2437
2438 token.IDENT, token.INT, token.FLOAT, token.IMAG, token.CHAR, token.STRING, token.FUNC, token.LPAREN,
2439 token.LBRACK, token.STRUCT, token.MAP, token.CHAN, token.INTERFACE,
2440 token.ADD, token.SUB, token.MUL, token.AND, token.XOR, token.ARROW, token.NOT:
2441 s, _ = p.parseSimpleStmt(labelOk)
2442
2443
2444
2445 if _, isLabeledStmt := s.(*ast.LabeledStmt); !isLabeledStmt {
2446 p.expectSemi()
2447 }
2448 case token.GO:
2449 s = p.parseGoStmt()
2450 case token.DEFER:
2451 s = p.parseDeferStmt()
2452 case token.RETURN:
2453 s = p.parseReturnStmt()
2454 case token.BREAK, token.CONTINUE, token.GOTO, token.FALLTHROUGH:
2455 s = p.parseBranchStmt(p.tok)
2456 case token.LBRACE:
2457 s = p.parseBlockStmt()
2458 p.expectSemi()
2459 case token.IF:
2460 s = p.parseIfStmt()
2461 case token.SWITCH:
2462 s = p.parseSwitchStmt()
2463 case token.SELECT:
2464 s = p.parseSelectStmt()
2465 case token.FOR:
2466 s = p.parseForStmt()
2467 case token.SEMICOLON:
2468
2469
2470
2471 s = &ast.EmptyStmt{Semicolon: p.pos, Implicit: p.lit == "\n"}
2472 p.next()
2473 case token.RBRACE:
2474
2475 s = &ast.EmptyStmt{Semicolon: p.pos, Implicit: true}
2476 default:
2477
2478 pos := p.pos
2479 p.errorExpected(pos, "statement")
2480 p.advance(stmtStart)
2481 s = &ast.BadStmt{From: pos, To: p.pos}
2482 }
2483
2484 return
2485 }
2486
2487
2488
2489
2490 type parseSpecFunction func(doc *ast.CommentGroup, keyword token.Token, iota int) ast.Spec
2491
2492 func (p *parser) parseImportSpec(doc *ast.CommentGroup, _ token.Token, _ int) ast.Spec {
2493 if p.trace {
2494 defer un(trace(p, "ImportSpec"))
2495 }
2496
2497 var ident *ast.Ident
2498 switch p.tok {
2499 case token.IDENT:
2500 ident = p.parseIdent()
2501 case token.PERIOD:
2502 ident = &ast.Ident{NamePos: p.pos, Name: "."}
2503 p.next()
2504 }
2505
2506 pos := p.pos
2507 end := p.pos
2508 var path string
2509 if p.tok == token.STRING {
2510 path = p.lit
2511 end = p.end()
2512 p.next()
2513 } else if p.tok.IsLiteral() {
2514 p.error(pos, "import path must be a string")
2515 p.next()
2516 } else {
2517 p.error(pos, "missing import path")
2518 p.advance(exprEnd)
2519 }
2520 comment := p.expectSemi()
2521
2522
2523 spec := &ast.ImportSpec{
2524 Doc: doc,
2525 Name: ident,
2526 Path: &ast.BasicLit{ValuePos: pos, ValueEnd: end, Kind: token.STRING, Value: path},
2527 Comment: comment,
2528 }
2529 p.imports = append(p.imports, spec)
2530
2531 return spec
2532 }
2533
2534 func (p *parser) parseValueSpec(doc *ast.CommentGroup, keyword token.Token, iota int) ast.Spec {
2535 if p.trace {
2536 defer un(trace(p, keyword.String()+"Spec"))
2537 }
2538
2539 idents := p.parseIdentList()
2540 var typ ast.Expr
2541 var values []ast.Expr
2542 switch keyword {
2543 case token.CONST:
2544
2545 if p.tok != token.EOF && p.tok != token.SEMICOLON && p.tok != token.RPAREN {
2546 typ = p.tryIdentOrType()
2547 if p.tok == token.ASSIGN {
2548 p.next()
2549 values = p.parseList(true)
2550 }
2551 }
2552 case token.VAR:
2553 if p.tok != token.ASSIGN {
2554 typ = p.parseType()
2555 }
2556 if p.tok == token.ASSIGN {
2557 p.next()
2558 values = p.parseList(true)
2559 }
2560 default:
2561 panic("unreachable")
2562 }
2563 comment := p.expectSemi()
2564
2565 spec := &ast.ValueSpec{
2566 Doc: doc,
2567 Names: idents,
2568 Type: typ,
2569 Values: values,
2570 Comment: comment,
2571 }
2572 return spec
2573 }
2574
2575 func (p *parser) parseGenericType(spec *ast.TypeSpec, openPos token.Pos, name0 *ast.Ident, typ0 ast.Expr) {
2576 if p.trace {
2577 defer un(trace(p, "parseGenericType"))
2578 }
2579
2580 list := p.parseParameterList(name0, typ0, token.RBRACK, false)
2581 closePos := p.expect(token.RBRACK)
2582 spec.TypeParams = &ast.FieldList{Opening: openPos, List: list, Closing: closePos}
2583 if p.tok == token.ASSIGN {
2584
2585 spec.Assign = p.pos
2586 p.next()
2587 }
2588 spec.Type = p.parseType()
2589 }
2590
2591 func (p *parser) parseTypeSpec(doc *ast.CommentGroup, _ token.Token, _ int) ast.Spec {
2592 if p.trace {
2593 defer un(trace(p, "TypeSpec"))
2594 }
2595
2596 name := p.parseIdent()
2597 spec := &ast.TypeSpec{Doc: doc, Name: name}
2598
2599 if p.tok == token.LBRACK {
2600
2601
2602 lbrack := p.pos
2603 p.next()
2604 if p.tok == token.IDENT {
2605
2606
2607
2608
2609
2610
2611
2612
2613
2614
2615
2616
2617
2618
2619
2620 var x ast.Expr = p.parseIdent()
2621 if p.tok != token.LBRACK {
2622
2623
2624
2625 p.exprLev++
2626 lhs := p.parsePrimaryExpr(x)
2627 x = p.parseBinaryExpr(lhs, token.LowestPrec+1)
2628 p.exprLev--
2629 }
2630
2631
2632
2633
2634
2635
2636
2637 if pname, ptype := extractName(x, p.tok == token.COMMA); pname != nil && (ptype != nil || p.tok != token.RBRACK) {
2638
2639
2640
2641 p.parseGenericType(spec, lbrack, pname, ptype)
2642 } else {
2643
2644
2645 spec.Type = p.parseArrayType(lbrack, x)
2646 }
2647 } else {
2648
2649 spec.Type = p.parseArrayType(lbrack, nil)
2650 }
2651 } else {
2652
2653 if p.tok == token.ASSIGN {
2654
2655 spec.Assign = p.pos
2656 p.next()
2657 }
2658 spec.Type = p.parseType()
2659 }
2660
2661 spec.Comment = p.expectSemi()
2662
2663 return spec
2664 }
2665
2666
2667
2668
2669
2670
2671
2672
2673
2674
2675
2676
2677
2678
2679
2680
2681
2682
2683
2684 func extractName(x ast.Expr, force bool) (*ast.Ident, ast.Expr) {
2685 switch x := x.(type) {
2686 case *ast.Ident:
2687 return x, nil
2688 case *ast.BinaryExpr:
2689 switch x.Op {
2690 case token.MUL:
2691 if name, _ := x.X.(*ast.Ident); name != nil && (force || isTypeElem(x.Y)) {
2692
2693 return name, &ast.StarExpr{Star: x.OpPos, X: x.Y}
2694 }
2695 case token.OR:
2696 if name, lhs := extractName(x.X, force || isTypeElem(x.Y)); name != nil && lhs != nil {
2697
2698 op := *x
2699 op.X = lhs
2700 return name, &op
2701 }
2702 }
2703 case *ast.CallExpr:
2704 if name, _ := x.Fun.(*ast.Ident); name != nil {
2705 if len(x.Args) == 1 && x.Ellipsis == token.NoPos && (force || isTypeElem(x.Args[0])) {
2706
2707
2708
2709 return name, &ast.ParenExpr{
2710 Lparen: x.Lparen,
2711 X: x.Args[0],
2712 Rparen: x.Rparen,
2713 }
2714 }
2715 }
2716 }
2717 return nil, x
2718 }
2719
2720
2721
2722 func isTypeElem(x ast.Expr) bool {
2723 switch x := x.(type) {
2724 case *ast.ArrayType, *ast.StructType, *ast.FuncType, *ast.InterfaceType, *ast.MapType, *ast.ChanType:
2725 return true
2726 case *ast.BinaryExpr:
2727 return isTypeElem(x.X) || isTypeElem(x.Y)
2728 case *ast.UnaryExpr:
2729 return x.Op == token.TILDE
2730 case *ast.ParenExpr:
2731 return isTypeElem(x.X)
2732 }
2733 return false
2734 }
2735
2736 func (p *parser) parseGenDecl(keyword token.Token, f parseSpecFunction) *ast.GenDecl {
2737 if p.trace {
2738 defer un(trace(p, "GenDecl("+keyword.String()+")"))
2739 }
2740
2741 doc := p.leadComment
2742 pos := p.expect(keyword)
2743 var lparen, rparen token.Pos
2744 var list []ast.Spec
2745 if p.tok == token.LPAREN {
2746 lparen = p.pos
2747 p.next()
2748 for iota := 0; p.tok != token.RPAREN && p.tok != token.EOF; iota++ {
2749 list = append(list, f(p.leadComment, keyword, iota))
2750 }
2751 rparen = p.expect(token.RPAREN)
2752 p.expectSemi()
2753 } else {
2754 list = append(list, f(nil, keyword, 0))
2755 }
2756
2757 return &ast.GenDecl{
2758 Doc: doc,
2759 TokPos: pos,
2760 Tok: keyword,
2761 Lparen: lparen,
2762 Specs: list,
2763 Rparen: rparen,
2764 }
2765 }
2766
2767 func (p *parser) parseFuncDecl() *ast.FuncDecl {
2768 if p.trace {
2769 defer un(trace(p, "FunctionDecl"))
2770 }
2771
2772 doc := p.leadComment
2773 pos := p.expect(token.FUNC)
2774
2775 var recv *ast.FieldList
2776 if p.tok == token.LPAREN {
2777 recv = p.parseParameters(false)
2778 }
2779
2780 ident := p.parseIdent()
2781
2782 var tparams *ast.FieldList
2783 if p.tok == token.LBRACK {
2784 tparams = p.parseTypeParameters()
2785 }
2786 params := p.parseParameters(false)
2787 results := p.parseParameters(true)
2788
2789 var body *ast.BlockStmt
2790 switch p.tok {
2791 case token.LBRACE:
2792 body = p.parseBody()
2793 p.expectSemi()
2794 case token.SEMICOLON:
2795 p.next()
2796 if p.tok == token.LBRACE {
2797
2798 p.error(p.pos, "unexpected semicolon or newline before {")
2799 body = p.parseBody()
2800 p.expectSemi()
2801 }
2802 default:
2803 p.expectSemi()
2804 }
2805
2806 decl := &ast.FuncDecl{
2807 Doc: doc,
2808 Recv: recv,
2809 Name: ident,
2810 Type: &ast.FuncType{
2811 Func: pos,
2812 TypeParams: tparams,
2813 Params: params,
2814 Results: results,
2815 },
2816 Body: body,
2817 }
2818 return decl
2819 }
2820
2821 func (p *parser) parseDecl(sync map[token.Token]bool) ast.Decl {
2822 if p.trace {
2823 defer un(trace(p, "Declaration"))
2824 }
2825
2826 var f parseSpecFunction
2827 switch p.tok {
2828 case token.IMPORT:
2829 f = p.parseImportSpec
2830
2831 case token.CONST, token.VAR:
2832 f = p.parseValueSpec
2833
2834 case token.TYPE:
2835 f = p.parseTypeSpec
2836
2837 case token.FUNC:
2838 return p.parseFuncDecl()
2839
2840 default:
2841 pos := p.pos
2842 p.errorExpected(pos, "declaration")
2843 p.advance(sync)
2844 return &ast.BadDecl{From: pos, To: p.pos}
2845 }
2846
2847 return p.parseGenDecl(p.tok, f)
2848 }
2849
2850
2851
2852
2853 func (p *parser) parseFile() *ast.File {
2854 if p.trace {
2855 defer un(trace(p, "File"))
2856 }
2857
2858
2859
2860 if p.errors.Len() != 0 {
2861 return nil
2862 }
2863
2864
2865 doc := p.leadComment
2866 pos := p.expect(token.PACKAGE)
2867
2868
2869 ident := p.parseIdent()
2870 if ident.Name == "_" && p.mode&DeclarationErrors != 0 {
2871 p.error(p.pos, "invalid package name _")
2872 }
2873 p.expectSemi()
2874
2875
2876
2877 if p.errors.Len() != 0 {
2878 return nil
2879 }
2880
2881 var decls []ast.Decl
2882 if p.mode&PackageClauseOnly == 0 {
2883
2884 for p.tok == token.IMPORT {
2885 decls = append(decls, p.parseGenDecl(token.IMPORT, p.parseImportSpec))
2886 }
2887
2888 if p.mode&ImportsOnly == 0 {
2889
2890 prev := token.IMPORT
2891 for p.tok != token.EOF {
2892
2893 if p.tok == token.IMPORT && prev != token.IMPORT {
2894 p.error(p.pos, "imports must appear before other declarations")
2895 }
2896 prev = p.tok
2897
2898 decls = append(decls, p.parseDecl(declStart))
2899 }
2900 }
2901 }
2902
2903 f := &ast.File{
2904 Doc: doc,
2905 Package: pos,
2906 Name: ident,
2907 Decls: decls,
2908
2909 Imports: p.imports,
2910 Comments: p.comments,
2911 GoVersion: p.goVersion,
2912 }
2913 var declErr func(token.Pos, string)
2914 if p.mode&DeclarationErrors != 0 {
2915 declErr = p.error
2916 }
2917 if p.mode&SkipObjectResolution == 0 {
2918 resolveFile(f, p.file, declErr)
2919 }
2920
2921 return f
2922 }
2923
2924
2925 func packIndexExpr(x ast.Expr, lbrack token.Pos, exprs []ast.Expr, rbrack token.Pos) ast.Expr {
2926 switch len(exprs) {
2927 case 0:
2928 panic("internal error: packIndexExpr with empty expr slice")
2929 case 1:
2930 return &ast.IndexExpr{
2931 X: x,
2932 Lbrack: lbrack,
2933 Index: exprs[0],
2934 Rbrack: rbrack,
2935 }
2936 default:
2937 return &ast.IndexListExpr{
2938 X: x,
2939 Lbrack: lbrack,
2940 Indices: exprs,
2941 Rbrack: rbrack,
2942 }
2943 }
2944 }
2945
View as plain text