(ident Token)
| 295 | } |
| 296 | |
| 297 | func (p *parser) finishParsingBodyBlock(ident Token) (Node, hcl.Diagnostics) { |
| 298 | var blockType = string(ident.Bytes) |
| 299 | var diags hcl.Diagnostics |
| 300 | var labels []string |
| 301 | var labelRanges []hcl.Range |
| 302 | |
| 303 | var oBrace Token |
| 304 | |
| 305 | Token: |
| 306 | for { |
| 307 | tok := p.Peek() |
| 308 | |
| 309 | switch tok.Type { |
| 310 | |
| 311 | case TokenOBrace: |
| 312 | oBrace = p.Read() |
| 313 | break Token |
| 314 | |
| 315 | case TokenOQuote: |
| 316 | label, labelRange, labelDiags := p.parseQuotedStringLiteral() |
| 317 | diags = append(diags, labelDiags...) |
| 318 | labels = append(labels, label) |
| 319 | labelRanges = append(labelRanges, labelRange) |
| 320 | // parseQuoteStringLiteral recovers up to the closing quote |
| 321 | // if it encounters problems, so we can continue looking for |
| 322 | // more labels and eventually the block body even. |
| 323 | |
| 324 | case TokenIdent: |
| 325 | tok = p.Read() // eat token |
| 326 | label, labelRange := string(tok.Bytes), tok.Range |
| 327 | labels = append(labels, label) |
| 328 | labelRanges = append(labelRanges, labelRange) |
| 329 | |
| 330 | default: |
| 331 | switch tok.Type { |
| 332 | case TokenEqual: |
| 333 | diags = append(diags, &hcl.Diagnostic{ |
| 334 | Severity: hcl.DiagError, |
| 335 | Summary: "Invalid block definition", |
| 336 | Detail: "The equals sign \"=\" indicates an argument definition, and must not be used when defining a block.", |
| 337 | Subject: &tok.Range, |
| 338 | Context: hcl.RangeBetween(ident.Range, tok.Range).Ptr(), |
| 339 | }) |
| 340 | case TokenNewline: |
| 341 | diags = append(diags, &hcl.Diagnostic{ |
| 342 | Severity: hcl.DiagError, |
| 343 | Summary: "Invalid block definition", |
| 344 | Detail: "A block definition must have block content delimited by \"{\" and \"}\", starting on the same line as the block header.", |
| 345 | Subject: &tok.Range, |
| 346 | Context: hcl.RangeBetween(ident.Range, tok.Range).Ptr(), |
| 347 | }) |
| 348 | default: |
| 349 | if !p.recovery { |
| 350 | diags = append(diags, &hcl.Diagnostic{ |
| 351 | Severity: hcl.DiagError, |
| 352 | Summary: "Invalid block definition", |
| 353 | Detail: "Either a quoted string block label or an opening brace (\"{\") is expected here.", |
| 354 | Subject: &tok.Range, |
no test coverage detected