diff --git a/terraform/eval_context_builtin.go b/terraform/eval_context_builtin.go index 4b1ce9b18..8dedcc716 100644 --- a/terraform/eval_context_builtin.go +++ b/terraform/eval_context_builtin.go @@ -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 } diff --git a/terraform/evaluate.go b/terraform/evaluate.go index ae732cd14..288d2c39b 100644 --- a/terraform/evaluate.go +++ b/terraform/evaluate.go @@ -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.