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..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,17 +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 + 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) { 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());