diff --git a/lang/blocktoattr/variables.go b/lang/blocktoattr/variables.go index e123b8aab..b172805a0 100644 --- a/lang/blocktoattr/variables.go +++ b/lang/blocktoattr/variables.go @@ -33,7 +33,7 @@ func walkVariables(node dynblock.WalkVariablesNode, body hcl.Body, schema *confi for _, child := range children { if blockS, exists := schema.BlockTypes[child.BlockTypeName]; exists { vars = append(vars, walkVariables(child.Node, child.Body(), &blockS.Block)...) - } else if attrS, exists := schema.Attributes[child.BlockTypeName]; exists { + } else if attrS, exists := schema.Attributes[child.BlockTypeName]; exists && attrS.Type.ElementType().IsObjectType() { synthSchema := SchemaForCtyElementType(attrS.Type.ElementType()) vars = append(vars, walkVariables(child.Node, child.Body(), synthSchema)...) } diff --git a/lang/blocktoattr/variables_test.go b/lang/blocktoattr/variables_test.go index ae469a064..9eaf5adb7 100644 --- a/lang/blocktoattr/variables_test.go +++ b/lang/blocktoattr/variables_test.go @@ -21,6 +21,10 @@ func TestExpandedVariables(t *testing.T) { })), Optional: true, }, + "bar": { + Type: cty.Map(cty.String), + Optional: true, + }, }, } @@ -143,6 +147,29 @@ dynamic "foo" { }, }, }, + "misplaced dynamic block": { + src: ` +dynamic "bar" { + for_each = beep + content { + key = val + } +} +`, + schema: fooSchema, + want: []hcl.Traversal{ + { + hcl.TraverseRoot{ + Name: "beep", + SrcRange: hcl.Range{ + Filename: "test.tf", + Start: hcl.Pos{Line: 3, Column: 14, Byte: 30}, + End: hcl.Pos{Line: 3, Column: 18, Byte: 34}, + }, + }, + }, + }, + }, } for name, test := range tests {