lang: EvalBlock should use ReferencesInBlock
Previously it was calling directly to hcldec.Variables, and thus missing the special fixups we do inside ReferencesInBlock to deal with Terraform-specific concerns such as our attribute-as-blocks preprocessing.
This commit is contained in:
parent
90b70bba08
commit
4d52999538
|
@ -47,8 +47,7 @@ func (s *Scope) ExpandBlock(body hcl.Body, schema *configschema.Block) (hcl.Body
|
||||||
func (s *Scope) EvalBlock(body hcl.Body, schema *configschema.Block) (cty.Value, tfdiags.Diagnostics) {
|
func (s *Scope) EvalBlock(body hcl.Body, schema *configschema.Block) (cty.Value, tfdiags.Diagnostics) {
|
||||||
spec := schema.DecoderSpec()
|
spec := schema.DecoderSpec()
|
||||||
|
|
||||||
traversals := hcldec.Variables(body, spec)
|
refs, diags := ReferencesInBlock(body, schema)
|
||||||
refs, diags := References(traversals)
|
|
||||||
|
|
||||||
ctx, ctxDiags := s.EvalContext(refs)
|
ctx, ctxDiags := s.EvalContext(refs)
|
||||||
diags = diags.Append(ctxDiags)
|
diags = diags.Append(ctxDiags)
|
||||||
|
|
|
@ -286,20 +286,20 @@ func TestScopeEvalContext(t *testing.T) {
|
||||||
}
|
}
|
||||||
|
|
||||||
func TestScopeExpandEvalBlock(t *testing.T) {
|
func TestScopeExpandEvalBlock(t *testing.T) {
|
||||||
|
nestedObjTy := cty.Object(map[string]cty.Type{
|
||||||
|
"boop": cty.String,
|
||||||
|
})
|
||||||
schema := &configschema.Block{
|
schema := &configschema.Block{
|
||||||
Attributes: map[string]*configschema.Attribute{
|
Attributes: map[string]*configschema.Attribute{
|
||||||
"foo": {
|
"foo": {Type: cty.String, Optional: true},
|
||||||
Type: cty.String,
|
"list_of_obj": {Type: cty.List(nestedObjTy), Optional: true},
|
||||||
},
|
|
||||||
},
|
},
|
||||||
BlockTypes: map[string]*configschema.NestedBlock{
|
BlockTypes: map[string]*configschema.NestedBlock{
|
||||||
"bar": {
|
"bar": {
|
||||||
Nesting: configschema.NestingMap,
|
Nesting: configschema.NestingMap,
|
||||||
Block: configschema.Block{
|
Block: configschema.Block{
|
||||||
Attributes: map[string]*configschema.Attribute{
|
Attributes: map[string]*configschema.Attribute{
|
||||||
"baz": {
|
"baz": {Type: cty.String, Optional: true},
|
||||||
Type: cty.String,
|
|
||||||
},
|
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
|
@ -328,6 +328,7 @@ func TestScopeExpandEvalBlock(t *testing.T) {
|
||||||
`,
|
`,
|
||||||
cty.ObjectVal(map[string]cty.Value{
|
cty.ObjectVal(map[string]cty.Value{
|
||||||
"foo": cty.NullVal(cty.String),
|
"foo": cty.NullVal(cty.String),
|
||||||
|
"list_of_obj": cty.NullVal(cty.List(nestedObjTy)),
|
||||||
"bar": cty.MapValEmpty(cty.Object(map[string]cty.Type{
|
"bar": cty.MapValEmpty(cty.Object(map[string]cty.Type{
|
||||||
"baz": cty.String,
|
"baz": cty.String,
|
||||||
})),
|
})),
|
||||||
|
@ -339,6 +340,7 @@ func TestScopeExpandEvalBlock(t *testing.T) {
|
||||||
`,
|
`,
|
||||||
cty.ObjectVal(map[string]cty.Value{
|
cty.ObjectVal(map[string]cty.Value{
|
||||||
"foo": cty.StringVal("hello"),
|
"foo": cty.StringVal("hello"),
|
||||||
|
"list_of_obj": cty.NullVal(cty.List(nestedObjTy)),
|
||||||
"bar": cty.MapValEmpty(cty.Object(map[string]cty.Type{
|
"bar": cty.MapValEmpty(cty.Object(map[string]cty.Type{
|
||||||
"baz": cty.String,
|
"baz": cty.String,
|
||||||
})),
|
})),
|
||||||
|
@ -350,6 +352,7 @@ func TestScopeExpandEvalBlock(t *testing.T) {
|
||||||
`,
|
`,
|
||||||
cty.ObjectVal(map[string]cty.Value{
|
cty.ObjectVal(map[string]cty.Value{
|
||||||
"foo": cty.StringVal("howdy"),
|
"foo": cty.StringVal("howdy"),
|
||||||
|
"list_of_obj": cty.NullVal(cty.List(nestedObjTy)),
|
||||||
"bar": cty.MapValEmpty(cty.Object(map[string]cty.Type{
|
"bar": cty.MapValEmpty(cty.Object(map[string]cty.Type{
|
||||||
"baz": cty.String,
|
"baz": cty.String,
|
||||||
})),
|
})),
|
||||||
|
@ -361,6 +364,7 @@ func TestScopeExpandEvalBlock(t *testing.T) {
|
||||||
`,
|
`,
|
||||||
cty.ObjectVal(map[string]cty.Value{
|
cty.ObjectVal(map[string]cty.Value{
|
||||||
"foo": cty.NullVal(cty.String),
|
"foo": cty.NullVal(cty.String),
|
||||||
|
"list_of_obj": cty.NullVal(cty.List(nestedObjTy)),
|
||||||
"bar": cty.MapVal(map[string]cty.Value{
|
"bar": cty.MapVal(map[string]cty.Value{
|
||||||
"static": cty.ObjectVal(map[string]cty.Value{
|
"static": cty.ObjectVal(map[string]cty.Value{
|
||||||
"baz": cty.NullVal(cty.String),
|
"baz": cty.NullVal(cty.String),
|
||||||
|
@ -379,6 +383,7 @@ func TestScopeExpandEvalBlock(t *testing.T) {
|
||||||
`,
|
`,
|
||||||
cty.ObjectVal(map[string]cty.Value{
|
cty.ObjectVal(map[string]cty.Value{
|
||||||
"foo": cty.NullVal(cty.String),
|
"foo": cty.NullVal(cty.String),
|
||||||
|
"list_of_obj": cty.NullVal(cty.List(nestedObjTy)),
|
||||||
"bar": cty.MapVal(map[string]cty.Value{
|
"bar": cty.MapVal(map[string]cty.Value{
|
||||||
"static0": cty.ObjectVal(map[string]cty.Value{
|
"static0": cty.ObjectVal(map[string]cty.Value{
|
||||||
"baz": cty.StringVal("0"),
|
"baz": cty.StringVal("0"),
|
||||||
|
@ -401,6 +406,7 @@ func TestScopeExpandEvalBlock(t *testing.T) {
|
||||||
`,
|
`,
|
||||||
cty.ObjectVal(map[string]cty.Value{
|
cty.ObjectVal(map[string]cty.Value{
|
||||||
"foo": cty.NullVal(cty.String),
|
"foo": cty.NullVal(cty.String),
|
||||||
|
"list_of_obj": cty.NullVal(cty.List(nestedObjTy)),
|
||||||
"bar": cty.MapVal(map[string]cty.Value{
|
"bar": cty.MapVal(map[string]cty.Value{
|
||||||
"elem0": cty.ObjectVal(map[string]cty.Value{
|
"elem0": cty.ObjectVal(map[string]cty.Value{
|
||||||
"baz": cty.StringVal("0"),
|
"baz": cty.StringVal("0"),
|
||||||
|
@ -423,6 +429,7 @@ func TestScopeExpandEvalBlock(t *testing.T) {
|
||||||
`,
|
`,
|
||||||
cty.ObjectVal(map[string]cty.Value{
|
cty.ObjectVal(map[string]cty.Value{
|
||||||
"foo": cty.NullVal(cty.String),
|
"foo": cty.NullVal(cty.String),
|
||||||
|
"list_of_obj": cty.NullVal(cty.List(nestedObjTy)),
|
||||||
"bar": cty.MapVal(map[string]cty.Value{
|
"bar": cty.MapVal(map[string]cty.Value{
|
||||||
"key1": cty.ObjectVal(map[string]cty.Value{
|
"key1": cty.ObjectVal(map[string]cty.Value{
|
||||||
"baz": cty.StringVal("val1"),
|
"baz": cty.StringVal("val1"),
|
||||||
|
@ -433,7 +440,45 @@ func TestScopeExpandEvalBlock(t *testing.T) {
|
||||||
}),
|
}),
|
||||||
}),
|
}),
|
||||||
},
|
},
|
||||||
"everything at once": {
|
"list-of-object attribute": {
|
||||||
|
`
|
||||||
|
list_of_obj = [
|
||||||
|
{
|
||||||
|
boop = local.greeting
|
||||||
|
},
|
||||||
|
]
|
||||||
|
`,
|
||||||
|
cty.ObjectVal(map[string]cty.Value{
|
||||||
|
"foo": cty.NullVal(cty.String),
|
||||||
|
"list_of_obj": cty.ListVal([]cty.Value{
|
||||||
|
cty.ObjectVal(map[string]cty.Value{
|
||||||
|
"boop": cty.StringVal("howdy"),
|
||||||
|
}),
|
||||||
|
}),
|
||||||
|
"bar": cty.MapValEmpty(cty.Object(map[string]cty.Type{
|
||||||
|
"baz": cty.String,
|
||||||
|
})),
|
||||||
|
}),
|
||||||
|
},
|
||||||
|
"list-of-object attribute as blocks": {
|
||||||
|
`
|
||||||
|
list_of_obj {
|
||||||
|
boop = local.greeting
|
||||||
|
}
|
||||||
|
`,
|
||||||
|
cty.ObjectVal(map[string]cty.Value{
|
||||||
|
"foo": cty.NullVal(cty.String),
|
||||||
|
"list_of_obj": cty.ListVal([]cty.Value{
|
||||||
|
cty.ObjectVal(map[string]cty.Value{
|
||||||
|
"boop": cty.StringVal("howdy"),
|
||||||
|
}),
|
||||||
|
}),
|
||||||
|
"bar": cty.MapValEmpty(cty.Object(map[string]cty.Type{
|
||||||
|
"baz": cty.String,
|
||||||
|
})),
|
||||||
|
}),
|
||||||
|
},
|
||||||
|
"lots of things at once": {
|
||||||
`
|
`
|
||||||
foo = "whoop"
|
foo = "whoop"
|
||||||
bar "static0" {
|
bar "static0" {
|
||||||
|
@ -462,6 +507,7 @@ func TestScopeExpandEvalBlock(t *testing.T) {
|
||||||
`,
|
`,
|
||||||
cty.ObjectVal(map[string]cty.Value{
|
cty.ObjectVal(map[string]cty.Value{
|
||||||
"foo": cty.StringVal("whoop"),
|
"foo": cty.StringVal("whoop"),
|
||||||
|
"list_of_obj": cty.NullVal(cty.List(nestedObjTy)),
|
||||||
"bar": cty.MapVal(map[string]cty.Value{
|
"bar": cty.MapVal(map[string]cty.Value{
|
||||||
"key1": cty.ObjectVal(map[string]cty.Value{
|
"key1": cty.ObjectVal(map[string]cty.Value{
|
||||||
"baz": cty.StringVal("val1"),
|
"baz": cty.StringVal("val1"),
|
||||||
|
|
Loading…
Reference in New Issue