2017-05-23 15:05:44 +00:00
|
|
|
package zclsyntax
|
|
|
|
|
|
|
|
import (
|
|
|
|
"github.com/apparentlymart/go-cty/cty"
|
|
|
|
"github.com/apparentlymart/go-zcl/zcl"
|
|
|
|
)
|
|
|
|
|
|
|
|
// Expression is the abstract type for nodes that behave as zcl expressions.
|
|
|
|
type Expression interface {
|
|
|
|
Node
|
|
|
|
|
|
|
|
// The zcl.Expression methods are duplicated here, rather than simply
|
|
|
|
// embedded, because both Node and zcl.Expression have a Range method
|
|
|
|
// and so they conflict.
|
|
|
|
|
|
|
|
Value(ctx *zcl.EvalContext) (cty.Value, zcl.Diagnostics)
|
|
|
|
Variables() []zcl.Traversal
|
|
|
|
StartRange() zcl.Range
|
|
|
|
}
|
|
|
|
|
|
|
|
// Assert that Expression implements zcl.Expression
|
|
|
|
var assertExprImplExpr zcl.Expression = Expression(nil)
|
|
|
|
|
|
|
|
// LiteralValueExpr is an expression that just always returns a given value.
|
|
|
|
type LiteralValueExpr struct {
|
|
|
|
Val cty.Value
|
|
|
|
SrcRange zcl.Range
|
|
|
|
}
|
|
|
|
|
|
|
|
func (e *LiteralValueExpr) walkChildNodes(w internalWalkFunc) {
|
|
|
|
// Literal values have no child nodes
|
|
|
|
}
|
|
|
|
|
|
|
|
func (e *LiteralValueExpr) Value(ctx *zcl.EvalContext) (cty.Value, zcl.Diagnostics) {
|
|
|
|
return e.Val, nil
|
|
|
|
}
|
|
|
|
|
|
|
|
func (e *LiteralValueExpr) Range() zcl.Range {
|
|
|
|
return e.SrcRange
|
|
|
|
}
|
|
|
|
|
2017-05-24 15:05:52 +00:00
|
|
|
func (e *LiteralValueExpr) StartRange() zcl.Range {
|
|
|
|
return e.SrcRange
|
|
|
|
}
|
|
|
|
|
|
|
|
func (e *LiteralValueExpr) Variables() []zcl.Traversal {
|
|
|
|
return Variables(e)
|
|
|
|
}
|
|
|
|
|
|
|
|
// ScopeTraversalExpr is an Expression that retrieves a value from the scope
|
|
|
|
// using a traversal.
|
|
|
|
type ScopeTraversalExpr struct {
|
|
|
|
Traversal zcl.Traversal
|
|
|
|
SrcRange zcl.Range
|
|
|
|
}
|
|
|
|
|
|
|
|
func (e *ScopeTraversalExpr) walkChildNodes(w internalWalkFunc) {
|
|
|
|
// Scope traversals have no child nodes
|
|
|
|
}
|
|
|
|
|
|
|
|
func (e *ScopeTraversalExpr) Value(ctx *zcl.EvalContext) (cty.Value, zcl.Diagnostics) {
|
|
|
|
panic("ScopeTraversalExpr.Value not yet implemented")
|
|
|
|
}
|
|
|
|
|
|
|
|
func (e *ScopeTraversalExpr) Range() zcl.Range {
|
|
|
|
return e.SrcRange
|
|
|
|
}
|
|
|
|
|
|
|
|
func (e *ScopeTraversalExpr) StartRange() zcl.Range {
|
|
|
|
return e.SrcRange
|
2017-05-23 15:05:44 +00:00
|
|
|
}
|
|
|
|
|
2017-05-24 15:05:52 +00:00
|
|
|
func (e *ScopeTraversalExpr) Variables() []zcl.Traversal {
|
|
|
|
return Variables(e)
|
2017-05-23 15:05:44 +00:00
|
|
|
}
|