MCPcopy
hub / github.com/hashicorp/hcl / parseTraversal

Method parseTraversal

hclsyntax/parser_traversal.go:36–211  ·  view source on GitHub ↗
(allowSplats bool)

Source from the content-addressed store, hash-verified

34}
35
36func (p *parser) parseTraversal(allowSplats bool) (hcl.Traversal, hcl.Diagnostics) {
37 var ret hcl.Traversal
38 var diags hcl.Diagnostics
39
40 // Absolute traversal must always begin with a variable name
41 varTok := p.Read()
42 if varTok.Type != TokenIdent {
43 diags = append(diags, &hcl.Diagnostic{
44 Severity: hcl.DiagError,
45 Summary: "Variable name required",
46 Detail: "Must begin with a variable name.",
47 Subject: &varTok.Range,
48 })
49 return ret, diags
50 }
51
52 varName := string(varTok.Bytes)
53 ret = append(ret, hcl.TraverseRoot{
54 Name: varName,
55 SrcRange: varTok.Range,
56 })
57
58 for {
59 next := p.Peek()
60
61 if next.Type == TokenEOF {
62 return ret, diags
63 }
64
65 switch next.Type {
66 case TokenDot:
67 // Attribute access
68 dot := p.Read() // eat dot
69 nameTok := p.Read()
70 if nameTok.Type != TokenIdent {
71 if nameTok.Type == TokenStar {
72 diags = append(diags, &hcl.Diagnostic{
73 Severity: hcl.DiagError,
74 Summary: "Attribute name required",
75 Detail: "Splat expressions (.*) may not be used here.",
76 Subject: &nameTok.Range,
77 Context: hcl.RangeBetween(varTok.Range, nameTok.Range).Ptr(),
78 })
79 } else {
80 diags = append(diags, &hcl.Diagnostic{
81 Severity: hcl.DiagError,
82 Summary: "Attribute name required",
83 Detail: "Dot must be followed by attribute name.",
84 Subject: &nameTok.Range,
85 Context: hcl.RangeBetween(varTok.Range, nameTok.Range).Ptr(),
86 })
87 }
88 return ret, diags
89 }
90
91 attrName := string(nameTok.Bytes)
92 ret = append(ret, hcl.TraverseAttr{
93 Name: attrName,

Callers 2

ParseTraversalAbsMethod · 0.95
ParseTraversalPartialMethod · 0.95

Calls 6

numberLitValueMethod · 0.95
HasErrorsMethod · 0.95
PtrMethod · 0.80
ReadMethod · 0.45
PeekMethod · 0.45

Tested by

no test coverage detected