From 3144d0e6c9119fde14661fd4c8b1638ed435f14c Mon Sep 17 00:00:00 2001 From: Hannes Hayashi Date: Wed, 3 Jun 2026 11:38:54 +0200 Subject: [PATCH] fix: preserve leading underscores in ToPascalCase to avoid field collisions MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Properties like _id and id both normalized to Id in PascalCase, causing Go struct field redeclaration errors. Now _id produces UnderscoreId while id remains Id. This is a targeted fix — only identifiers starting with underscore are affected. The tfsdk tags still use the original attribute name. --- internal/schema/framework_identifier.go | 12 +++++++++++- internal/schema/framework_identifier_test.go | 8 ++++---- 2 files changed, 15 insertions(+), 5 deletions(-) diff --git a/internal/schema/framework_identifier.go b/internal/schema/framework_identifier.go index 51a3837b..d9858e49 100644 --- a/internal/schema/framework_identifier.go +++ b/internal/schema/framework_identifier.go @@ -78,10 +78,20 @@ func (identifier FrameworkIdentifier) ToPrefixCamelCase(prefix string) string { // ToPascalCase will return a pascal case formatted string of the identifier. // Example: // - example_resource_thing -> ExampleResourceThing +// - _id -> UnderscoreId func (identifier FrameworkIdentifier) ToPascalCase() string { - return snakeLetters.ReplaceAllStringFunc(string(identifier), func(s string) string { + input := string(identifier) + + result := snakeLetters.ReplaceAllStringFunc(input, func(s string) string { return strings.ToUpper(strings.Replace(s, "_", "", -1)) }) + + // Preserve leading underscore to avoid collisions (e.g., _id vs id). + if strings.HasPrefix(input, "_") { + result = "Underscore" + result + } + + return result } // ToPrefixPascalCase will return a pascal case formatted string of the identifier, diff --git a/internal/schema/framework_identifier_test.go b/internal/schema/framework_identifier_test.go index 43e97988..bb2fea03 100644 --- a/internal/schema/framework_identifier_test.go +++ b/internal/schema/framework_identifier_test.go @@ -79,7 +79,7 @@ func TestFrameworkIdentifier_ToCamelCase(t *testing.T) { }, "leading underscore": { identifier: "_thing", - want: "thing", + want: "underscoreThing", }, "middle underscore": { identifier: "fake_thing", @@ -120,7 +120,7 @@ func TestFrameworkIdentifier_ToPrefixCamelCase(t *testing.T) { }, "leading underscore": { identifier: "_thing", - want: "thing", + want: "underscoreThing", }, "middle underscore": { identifier: "fake_thing", @@ -193,7 +193,7 @@ func TestFrameworkIdentifier_ToPascalCase(t *testing.T) { }, "leading underscore": { identifier: "_thing", - want: "Thing", + want: "UnderscoreThing", }, "middle underscore": { identifier: "fake_thing", @@ -234,7 +234,7 @@ func TestFrameworkIdentifier_ToPrefixPascalCase(t *testing.T) { }, "leading underscore": { identifier: "_thing", - want: "Thing", + want: "UnderscoreThing", }, "middle underscore": { identifier: "fake_thing",