()
| 2139 | } |
| 2140 | |
| 2141 | func (p *parser) recoverAfterBodyItem() { |
| 2142 | p.recovery = true |
| 2143 | var open []TokenType |
| 2144 | |
| 2145 | Token: |
| 2146 | for { |
| 2147 | tok := p.Read() |
| 2148 | |
| 2149 | switch tok.Type { |
| 2150 | |
| 2151 | case TokenNewline: |
| 2152 | if len(open) == 0 { |
| 2153 | break Token |
| 2154 | } |
| 2155 | |
| 2156 | case TokenEOF: |
| 2157 | break Token |
| 2158 | |
| 2159 | case TokenOBrace, TokenOBrack, TokenOParen, TokenOQuote, TokenOHeredoc, TokenTemplateInterp, TokenTemplateControl: |
| 2160 | open = append(open, tok.Type) |
| 2161 | |
| 2162 | case TokenCBrace, TokenCBrack, TokenCParen, TokenCQuote, TokenCHeredoc: |
| 2163 | opener := p.oppositeBracket(tok.Type) |
| 2164 | for len(open) > 0 && open[len(open)-1] != opener { |
| 2165 | open = open[:len(open)-1] |
| 2166 | } |
| 2167 | if len(open) > 0 { |
| 2168 | open = open[:len(open)-1] |
| 2169 | } |
| 2170 | |
| 2171 | case TokenTemplateSeqEnd: |
| 2172 | for len(open) > 0 && open[len(open)-1] != TokenTemplateInterp && open[len(open)-1] != TokenTemplateControl { |
| 2173 | open = open[:len(open)-1] |
| 2174 | } |
| 2175 | if len(open) > 0 { |
| 2176 | open = open[:len(open)-1] |
| 2177 | } |
| 2178 | |
| 2179 | } |
| 2180 | } |
| 2181 | } |
| 2182 | |
| 2183 | // oppositeBracket finds the bracket that opposes the given bracketer, or |
| 2184 | // NilToken if the given token isn't a bracketer. |
no test coverage detected