diff --git a/changelog/pending/20221108--pkg--allow-case-insensitive-prop-typecheck-on-traversal.yaml b/changelog/pending/20221108--pkg--allow-case-insensitive-prop-typecheck-on-traversal.yaml new file mode 100644 index 000000000000..78bf40f7831b --- /dev/null +++ b/changelog/pending/20221108--pkg--allow-case-insensitive-prop-typecheck-on-traversal.yaml @@ -0,0 +1,4 @@ +changes: +- type: feat + scope: pkg + description: Allow case insensitive prop typecheck on traversal diff --git a/pkg/codegen/hcl2/model/type_object.go b/pkg/codegen/hcl2/model/type_object.go index f30bd4799c7f..5ddb0eb6bc3b 100644 --- a/pkg/codegen/hcl2/model/type_object.go +++ b/pkg/codegen/hcl2/model/type_object.go @@ -72,9 +72,27 @@ func (t *ObjectType) Traverse(traverser hcl.Traverser) (Traversable, hcl.Diagnos keyString, err := convert.Convert(key, cty.String) contract.Assert(err == nil) + propertiesLower := make(map[string]string) + for p := range t.Properties { + propertiesLower[strings.ToLower(p)] = p + } + propertyName := keyString.AsString() propertyType, hasProperty := t.Properties[propertyName] if !hasProperty { + propertyNameLower := strings.ToLower(propertyName) + if propertyNameOrig, ok := propertiesLower[propertyNameLower]; ok { + propertyType = t.Properties[propertyNameOrig] + rng := traverser.SourceRange() + return propertyType, hcl.Diagnostics{ + { + Severity: hcl.DiagWarning, + Subject: &rng, + Summary: "Found matching case-insensitive property", + Detail: fmt.Sprintf("Matched %s with %s", propertyName, propertyNameOrig), + }, + } + } props := make([]string, 0, len(t.Properties)) for k := range t.Properties { props = append(props, k) diff --git a/pkg/codegen/hcl2/model/type_test.go b/pkg/codegen/hcl2/model/type_test.go index 2306dc4a3202..b03db6b99196 100644 --- a/pkg/codegen/hcl2/model/type_test.go +++ b/pkg/codegen/hcl2/model/type_test.go @@ -508,6 +508,8 @@ func TestObjectType(t *testing.T) { testTraverse(t, typ, hcl.TraverseAttr{Name: "bar"}, IntType, false) testTraverse(t, typ, hcl.TraverseAttr{Name: "baz"}, NumberType, false) testTraverse(t, typ, hcl.TraverseAttr{Name: "qux"}, NewOptionalType(BoolType), false) + // test case-insensitive attribute + testTraverse(t, typ, hcl.TraverseAttr{Name: "Qux"}, NewOptionalType(BoolType), true) testTraverse(t, typ, hcl.TraverseIndex{Key: cty.StringVal("foo")}, BoolType, false) testTraverse(t, typ, hcl.TraverseIndex{Key: cty.StringVal("bar")}, IntType, false) testTraverse(t, typ, hcl.TraverseIndex{Key: cty.StringVal("baz")}, NumberType, false)