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 fc98a969d14e6be6f74ea267e897e9fce5e215a6..4d0b35007fa17cd5ec560130ce9076c90a4b8fb8 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 @@ -256,6 +256,9 @@ public class DefaultCodegen implements CodegenConfig { // A cache to efficiently lookup a Schema instance based on the return value of `toModelName()`. private Map<String, Schema> modelNameToSchemaCache; + // A cache to efficiently lookup schema `toModelName()` based on the schema Key + private Map<String, String> schemaKeyToModelNameCache = new HashMap<>(); + @Override public List<CliOption> cliOptions() { return cliOptions; @@ -2322,7 +2325,13 @@ public class DefaultCodegen implements CodegenConfig { */ @Override public String toModelName(final String name) { - return camelize(modelNamePrefix + "_" + name + "_" + modelNameSuffix); + if (schemaKeyToModelNameCache.containsKey(name)) { + return schemaKeyToModelNameCache.get(name); + } + + String camelizedName = camelize(modelNamePrefix + "_" + name + "_" + modelNameSuffix); + schemaKeyToModelNameCache.put(name, camelizedName); + return camelizedName; } private static class NamedSchema { diff --git a/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/AbstractCSharpCodegen.java b/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/AbstractCSharpCodegen.java index fa09150e5557388db2c7b44b22be3372d5f84f42..7093997f0b923c3a893dcb9299575c1a71b55923 100644 --- a/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/AbstractCSharpCodegen.java +++ b/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/AbstractCSharpCodegen.java @@ -90,6 +90,9 @@ public abstract class AbstractCSharpCodegen extends DefaultCodegen implements Co // special property keywords not allowed as these are the function names in the model files protected Set<String> propertySpecialKeywords = new HashSet<>(Arrays.asList("ToString", "ToJson", "GetHashCode", "Equals", "ShouldSerializeToString")); + // A cache to efficiently lookup schema `toModelName()` based on the schema Key + private Map<String, String> schemaKeyToModelNameCache = new HashMap<>(); + public AbstractCSharpCodegen() { super(); @@ -1035,6 +1038,13 @@ public abstract class AbstractCSharpCodegen extends DefaultCodegen implements Co if (importMapping.containsKey(name)) { return importMapping.get(name); } + + // memoization + String origName = name; + if (schemaKeyToModelNameCache.containsKey(origName)) { + return schemaKeyToModelNameCache.get(origName); + } + if (!StringUtils.isEmpty(modelNamePrefix)) { name = modelNamePrefix + "_" + name; } @@ -1058,9 +1068,12 @@ public abstract class AbstractCSharpCodegen extends DefaultCodegen implements Co name = "model_" + name; // e.g. 200Response => Model200Response (after camelize) } + String camelizedName = camelize(name); + schemaKeyToModelNameCache.put(origName, camelizedName); + // camelize the model name // phone_number => PhoneNumber - return camelize(name); + return camelizedName; } @Override diff --git a/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/GoClientCodegen.java b/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/GoClientCodegen.java index 11861b579249db27513b0b4b3afda8af1d7eb37e..60c0d9117db89cbadeade4559cafbf2ffa5a3a03 100644 --- a/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/GoClientCodegen.java +++ b/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/GoClientCodegen.java @@ -49,6 +49,9 @@ public class GoClientCodegen extends AbstractGoCodegen { protected boolean isGoSubmodule = false; protected boolean useOneOfDiscriminatorLookup = false; // use oneOf discriminator's mapping for model lookup + // A cache to efficiently lookup schema `toModelName()` based on the schema Key + private Map<String, String> schemaKeyToModelNameCache = new HashMap<>(); + public GoClientCodegen() { super(); @@ -312,8 +315,14 @@ public class GoClientCodegen extends AbstractGoCodegen { @Override public String toModelName(String name) { + if (schemaKeyToModelNameCache.containsKey(name)) { + return schemaKeyToModelNameCache.get(name); + } + // underscoring would also lowercase the whole name, thus losing acronyms which are in capitals - return camelize(toModel(name, false)); + String camelizedName = camelize(toModel(name, false)); + schemaKeyToModelNameCache.put(name, camelizedName); + return camelizedName; } public String escapeReservedWord(String name) {