makeRelativeTraversal takes an expression and a traverser and returns a traversal expression that combines the two. If the given expression is already a traversal, it is extended in place (mutating it) and returned. If it isn't, a new RelativeTraversalExpr is created and returned.
(expr Expression, next hcl.Traverser, rng hcl.Range)
| 930 | // is already a traversal, it is extended in place (mutating it) and |
| 931 | // returned. If it isn't, a new RelativeTraversalExpr is created and returned. |
| 932 | func makeRelativeTraversal(expr Expression, next hcl.Traverser, rng hcl.Range) Expression { |
| 933 | switch texpr := expr.(type) { |
| 934 | case *ScopeTraversalExpr: |
| 935 | texpr.Traversal = append(texpr.Traversal, next) |
| 936 | texpr.SrcRange = hcl.RangeBetween(texpr.SrcRange, rng) |
| 937 | return texpr |
| 938 | case *RelativeTraversalExpr: |
| 939 | texpr.Traversal = append(texpr.Traversal, next) |
| 940 | texpr.SrcRange = hcl.RangeBetween(texpr.SrcRange, rng) |
| 941 | return texpr |
| 942 | default: |
| 943 | return &RelativeTraversalExpr{ |
| 944 | Source: expr, |
| 945 | Traversal: hcl.Traversal{next}, |
| 946 | SrcRange: hcl.RangeBetween(expr.Range(), rng), |
| 947 | } |
| 948 | } |
| 949 | } |
| 950 | |
| 951 | func (p *parser) parseExpressionTerm() (Expression, hcl.Diagnostics) { |
| 952 | start := p.Peek() |
no test coverage detected