From a83a010dcbd0a1aeb1828d1d3551f8ea84e4da83 Mon Sep 17 00:00:00 2001 From: rk Date: Wed, 4 Nov 2026 23:29:38 +0500 Subject: [PATCH 1/2] fix(core): keep enum var names unique after renaming duplicates --- .../org/openapitools/codegen/DefaultCodegen.java | 4 ++++ .../openapitools/codegen/DefaultCodegenTest.java | 16 ++++++++++++++++ 2 files changed, 20 insertions(+) diff --git a/modules/openapi-generator/src/main/java/org/openapitools/codegen/DefaultCodegen.java b/modules/openapi-generator/src/main/java/org/openapitools/codegen/DefaultCodegen.java index 4f52010d72b1..042f3bf844c3 100644 --- a/modules/openapi-generator/src/main/java/org/openapitools/codegen/DefaultCodegen.java +++ b/modules/openapi-generator/src/main/java/org/openapitools/codegen/DefaultCodegen.java @@ -7303,6 +7303,10 @@ protected void postProcessEnumVars(List enumVars) { } }); Collections.reverse(enumVars); + // a new name can already be taken ("EtcGmt1" + "2" is "EtcGmt12"), so repeat until names are unique + if (enumVars.stream().map(EnumVarMap::getEnumName).distinct().count() < enumVars.size()) { + postProcessEnumVars(enumVars); + } } private String getUniqueEnumName(String name, List enumVars) { diff --git a/modules/openapi-generator/src/test/java/org/openapitools/codegen/DefaultCodegenTest.java b/modules/openapi-generator/src/test/java/org/openapitools/codegen/DefaultCodegenTest.java index 1a7f3780eb88..be8a61aef5ff 100644 --- a/modules/openapi-generator/src/test/java/org/openapitools/codegen/DefaultCodegenTest.java +++ b/modules/openapi-generator/src/test/java/org/openapitools/codegen/DefaultCodegenTest.java @@ -84,6 +84,22 @@ public void testBuildEnumVarsPreservesRawValueAlignmentAcrossNulls() { Assert.assertEquals(enumVars.get(1).getEnumValue(), "\"_42\""); } + @Test + public void testPostProcessEnumVarsKeepsRenamedEntriesUnique() { + // typescript names of "Etc/GMT+12", "Etc/GMT+1", "Etc/GMT0", "Etc/GMT-1" and "Etc/GMT-12" + List enumVars = new ArrayList<>(); + for (String name : Arrays.asList("EtcGmt12", "EtcGmt1", "EtcGmt0", "EtcGmt1", "EtcGmt12")) { + EnumVarMap enumVar = new EnumVarMap(); + enumVar.setEnumName(name); + enumVars.add(enumVar); + } + + new DefaultCodegen().postProcessEnumVars(enumVars); + + assertThat(enumVars).extracting(EnumVarMap::getEnumName) + .containsExactly("EtcGmt122", "EtcGmt1", "EtcGmt0", "EtcGmt12", "EtcGmt1222"); + } + @Test(expectedExceptions = IllegalArgumentException.class) public void testBuildEnumVarsRejectsMismatchedRawValues() { new DefaultCodegen().buildEnumVars(Collections.singletonList("value"), "string", Collections.emptyList()); From 991fa3bee753f79a326af61b942d7da0d55156f1 Mon Sep 17 00:00:00 2001 From: rk Date: Thu, 5 Nov 2026 00:19:05 +0500 Subject: [PATCH 2/2] fix(core): repeat enum dedupe in a loop --- .../openapitools/codegen/DefaultCodegen.java | 27 +++++++++---------- 1 file changed, 13 insertions(+), 14 deletions(-) diff --git a/modules/openapi-generator/src/main/java/org/openapitools/codegen/DefaultCodegen.java b/modules/openapi-generator/src/main/java/org/openapitools/codegen/DefaultCodegen.java index 042f3bf844c3..4ffb0a4bd810 100644 --- a/modules/openapi-generator/src/main/java/org/openapitools/codegen/DefaultCodegen.java +++ b/modules/openapi-generator/src/main/java/org/openapitools/codegen/DefaultCodegen.java @@ -7292,21 +7292,20 @@ protected void removeEnumUnknownDefaultCase(CodegenOperation operation) { } protected void postProcessEnumVars(List enumVars) { - Collections.reverse(enumVars); - enumVars.forEach(v -> { - String name = (String) v.getEnumName(); - long count = enumVars.stream().filter(v1 -> v1.getEnumName().equals(name)).count(); - if (count > 1) { - String uniqueEnumName = getUniqueEnumName(name, enumVars); - LOGGER.debug("Changing duplicate enumeration name from {} to {}", v.getEnumName(), uniqueEnumName); - v.setEnumName(uniqueEnumName); - } - }); - Collections.reverse(enumVars); // a new name can already be taken ("EtcGmt1" + "2" is "EtcGmt12"), so repeat until names are unique - if (enumVars.stream().map(EnumVarMap::getEnumName).distinct().count() < enumVars.size()) { - postProcessEnumVars(enumVars); - } + do { + Collections.reverse(enumVars); + enumVars.forEach(v -> { + String name = (String) v.getEnumName(); + long count = enumVars.stream().filter(v1 -> v1.getEnumName().equals(name)).count(); + if (count > 1) { + String uniqueEnumName = getUniqueEnumName(name, enumVars); + LOGGER.debug("Changing duplicate enumeration name from {} to {}", v.getEnumName(), uniqueEnumName); + v.setEnumName(uniqueEnumName); + } + }); + Collections.reverse(enumVars); + } while (enumVars.stream().map(EnumVarMap::getEnumName).distinct().count() < enumVars.size()); } private String getUniqueEnumName(String name, List enumVars) {