core: BuiltinEvalContext constructs evaluationStateData itself
Previously our evaluationStateData object was constructed inside Evaluator.Scope, but this was awkward because all of the fields inside it need to be populated from BuiltinEvalContext fields, and so the signature of Evaluator.Scope kept growing new arguments over time. Instead, we reassign the responsibilities here so that Evaluator.Scope takes an already-constructed lang.Data, and then teach BuiltinEvalContext to build this object itself from its own internal values.
This commit is contained in:
parent
b0435cd533
commit
4b5868f653
|
@ -294,7 +294,8 @@ func (ctx *BuiltinEvalContext) CloseProvisioner(n string) error {
|
|||
|
||||
func (ctx *BuiltinEvalContext) EvaluateBlock(body hcl.Body, schema *configschema.Block, self addrs.Referenceable, key addrs.InstanceKey) (cty.Value, hcl.Body, tfdiags.Diagnostics) {
|
||||
var diags tfdiags.Diagnostics
|
||||
scope := ctx.Evaluator.Scope(ctx.PathValue, self, key)
|
||||
evalData := ctx.evaluationStateData(key)
|
||||
scope := ctx.Evaluator.Scope(evalData, self)
|
||||
body, evalDiags := scope.ExpandBlock(body, schema)
|
||||
diags = diags.Append(evalDiags)
|
||||
val, evalDiags := scope.EvalBlock(body, schema)
|
||||
|
@ -303,10 +304,19 @@ func (ctx *BuiltinEvalContext) EvaluateBlock(body hcl.Body, schema *configschema
|
|||
}
|
||||
|
||||
func (ctx *BuiltinEvalContext) EvaluateExpr(expr hcl.Expression, wantType cty.Type, self addrs.Referenceable) (cty.Value, tfdiags.Diagnostics) {
|
||||
scope := ctx.Evaluator.Scope(ctx.PathValue, self, addrs.NoKey)
|
||||
evalData := ctx.evaluationStateData(addrs.NoKey)
|
||||
scope := ctx.Evaluator.Scope(evalData, self)
|
||||
return scope.EvalExpr(expr, wantType)
|
||||
}
|
||||
|
||||
func (ctx *BuiltinEvalContext) evaluationStateData(key addrs.InstanceKey) *evaluationStateData {
|
||||
return &evaluationStateData{
|
||||
Evaluator: ctx.Evaluator,
|
||||
ModulePath: ctx.PathValue,
|
||||
InstanceKey: key,
|
||||
}
|
||||
}
|
||||
|
||||
func (ctx *BuiltinEvalContext) Path() addrs.ModuleInstance {
|
||||
return ctx.PathValue
|
||||
}
|
||||
|
|
|
@ -42,12 +42,9 @@ type Evaluator struct {
|
|||
// If the "self" argument is nil then the "self" object is not available
|
||||
// in evaluated expressions. Otherwise, it behaves as an alias for the given
|
||||
// address.
|
||||
func (e *Evaluator) Scope(modulePath addrs.ModuleInstance, self addrs.Referenceable) *lang.Scope {
|
||||
func (e *Evaluator) Scope(data lang.Data, self addrs.Referenceable) *lang.Scope {
|
||||
return &lang.Scope{
|
||||
Data: &evaluationStateData{
|
||||
Evaluator: e,
|
||||
ModulePath: modulePath,
|
||||
},
|
||||
Data: data,
|
||||
SelfAddr: self,
|
||||
PureOnly: e.Operation != walkApply && e.Operation != walkDestroy,
|
||||
BaseDir: ".", // Always current working directory for now.
|
||||
|
|
Loading…
Reference in New Issue