(ident Token, singleLine bool)
| 238 | } |
| 239 | |
| 240 | func (p *parser) finishParsingBodyAttribute(ident Token, singleLine bool) (Node, hcl.Diagnostics) { |
| 241 | eqTok := p.Read() // eat equals token |
| 242 | if eqTok.Type != TokenEqual { |
| 243 | // should never happen if caller behaves |
| 244 | panic("finishParsingBodyAttribute called with next not equals") |
| 245 | } |
| 246 | |
| 247 | var endRange hcl.Range |
| 248 | |
| 249 | expr, diags := p.ParseExpression() |
| 250 | if p.recovery && diags.HasErrors() { |
| 251 | // recovery within expressions tends to be tricky, so we've probably |
| 252 | // landed somewhere weird. We'll try to reset to the start of a body |
| 253 | // item so parsing can continue. |
| 254 | endRange = p.PrevRange() |
| 255 | p.recoverAfterBodyItem() |
| 256 | } else { |
| 257 | endRange = p.PrevRange() |
| 258 | if !singleLine { |
| 259 | end := p.Peek() |
| 260 | if end.Type != TokenNewline && end.Type != TokenEOF { |
| 261 | if !p.recovery { |
| 262 | summary := "Missing newline after argument" |
| 263 | detail := "An argument definition must end with a newline." |
| 264 | |
| 265 | if end.Type == TokenComma { |
| 266 | summary = "Unexpected comma after argument" |
| 267 | detail = "Argument definitions must be separated by newlines, not commas. " + detail |
| 268 | } |
| 269 | |
| 270 | diags = append(diags, &hcl.Diagnostic{ |
| 271 | Severity: hcl.DiagError, |
| 272 | Summary: summary, |
| 273 | Detail: detail, |
| 274 | Subject: &end.Range, |
| 275 | Context: hcl.RangeBetween(ident.Range, end.Range).Ptr(), |
| 276 | }) |
| 277 | } |
| 278 | endRange = p.PrevRange() |
| 279 | p.recoverAfterBodyItem() |
| 280 | } else { |
| 281 | endRange = p.PrevRange() |
| 282 | p.Read() // eat newline |
| 283 | } |
| 284 | } |
| 285 | } |
| 286 | |
| 287 | return &Attribute{ |
| 288 | Name: string(ident.Bytes), |
| 289 | Expr: expr, |
| 290 | |
| 291 | SrcRange: hcl.RangeBetween(ident.Range, endRange), |
| 292 | NameRange: ident.Range, |
| 293 | EqualsRange: eqTok.Range, |
| 294 | }, diags |
| 295 | } |
| 296 | |
| 297 | func (p *parser) finishParsingBodyBlock(ident Token) (Node, hcl.Diagnostics) { |
no test coverage detected