()
| 1061 | } |
| 1062 | |
| 1063 | func (p *codeParser) parseImplicitExpression() *nodeGoStrExpr { |
| 1064 | if p.peek().tok != token.IDENT { |
| 1065 | panic("internal error: expected Go identifier start implicit expression") |
| 1066 | } |
| 1067 | result := new(nodeGoStrExpr) |
| 1068 | end := p.tokenOffset(p.peek()) |
| 1069 | result.pos.start = end |
| 1070 | identLen := len(p.peek().String()) |
| 1071 | end += identLen |
| 1072 | p.advance() |
| 1073 | if !unicode.IsSpace(rune(p.charAt(result.pos.start + identLen))) { |
| 1074 | Loop: |
| 1075 | for { |
| 1076 | if p.peek().tok == token.LPAREN { |
| 1077 | nested := 1 |
| 1078 | end++ |
| 1079 | p.advance() |
| 1080 | for { |
| 1081 | if p.peek().tok == token.RPAREN { |
| 1082 | end++ |
| 1083 | p.advance() |
| 1084 | nested-- |
| 1085 | if nested == 0 { |
| 1086 | goto Loop |
| 1087 | } |
| 1088 | } else if p.peek().tok == token.ILLEGAL { |
| 1089 | p.errorf("illegal Go token %q", p.peek().String()) |
| 1090 | } else if p.peek().tok == token.EOF { |
| 1091 | p.errorf("unexpected EOF, want ')'") |
| 1092 | } |
| 1093 | end = p.tokenOffset(p.peek()) + len(p.peek().String()) |
| 1094 | p.advance() |
| 1095 | } |
| 1096 | } else if p.peek().tok == token.LBRACK { // '[' |
| 1097 | nested := 1 |
| 1098 | end++ |
| 1099 | p.advance() |
| 1100 | for { |
| 1101 | if p.peek().tok == token.RBRACK { |
| 1102 | end++ |
| 1103 | p.advance() |
| 1104 | nested-- |
| 1105 | if nested == 0 { |
| 1106 | goto Loop |
| 1107 | } |
| 1108 | } else if p.peek().tok == token.ILLEGAL { |
| 1109 | p.errorf("illegal Go token %q", p.peek().String()) |
| 1110 | } else if p.peek().tok == token.EOF { |
| 1111 | p.errorf("unexpected EOF, want ')'") |
| 1112 | } |
| 1113 | end = p.tokenOffset(p.peek()) + len(p.peek().String()) |
| 1114 | p.advance() |
| 1115 | } |
| 1116 | } else if p.peek().tok == token.PERIOD { |
| 1117 | last := p.peek().pos |
| 1118 | p.advance() |
| 1119 | end++ |
| 1120 | // if space between period and next token, regardless of what |
no test coverage detected