From f0b2dc3bd3286c29e7610bb313433004280ca33b Mon Sep 17 00:00:00 2001 From: ivan_leb Date: Thu, 9 Oct 2025 12:07:25 +0200 Subject: [PATCH] add cache to efficiently lookup CodegenModel in csharp codegen --- .../codegen/languages/AbstractCSharpCodegen.java | 14 ++++++++++++++ .../codegen/languages/CSharpClientCodegen.java | 2 +- .../languages/CSharpReducedClientCodegen.java | 2 +- 3 files changed, 16 insertions(+), 2 deletions(-) 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 1c81b4bbcdd9..fed415f5bf79 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 @@ -116,6 +116,9 @@ public abstract class AbstractCSharpCodegen extends DefaultCodegen { // A cache to efficiently lookup schema `toModelName()` based on the schema Key private final Map schemaKeyToModelNameCache = new HashMap<>(); + // A cache to efficiently lookup CodegenModel `fromModel(codegenModelName, parentModelSchema)` based on the pair of model name and schema + private final Map, CodegenModel> codegenModelNameAndSchemaKeyToCodegenModelCache = new HashMap<>(); + public AbstractCSharpCodegen() { super(); @@ -1703,6 +1706,17 @@ public String toModelTestFilename(String name) { return toModelName(name) + "Tests"; } + protected CodegenModel getCodegenModel(String codegenModelName, Schema schema){ + var key = new AbstractMap.SimpleEntry<>(codegenModelName, schema); + if(codegenModelNameAndSchemaKeyToCodegenModelCache.containsKey(key)){ + return codegenModelNameAndSchemaKeyToCodegenModelCache.get(key); + } + + CodegenModel model = super.fromModel(codegenModelName, schema); + codegenModelNameAndSchemaKeyToCodegenModelCache.put(key, model); + return model; + } + public void setNullableReferenceTypes(final Boolean nullReferenceTypesFlag) { this.nullReferenceTypesFlag = nullReferenceTypesFlag; additionalProperties.put("nullableReferenceTypes", nullReferenceTypesFlag); diff --git a/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/CSharpClientCodegen.java b/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/CSharpClientCodegen.java index 68ec6d47313d..6af57450ad9d 100644 --- a/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/CSharpClientCodegen.java +++ b/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/CSharpClientCodegen.java @@ -436,7 +436,7 @@ public CodegenModel fromModel(String name, Schema model) { if (allDefinitions != null && codegenModel != null && codegenModel.parent != null) { final Schema parentModel = allDefinitions.get(toModelName(codegenModel.parent)); if (parentModel != null) { - final CodegenModel parentCodegenModel = super.fromModel(codegenModel.parent, parentModel); + final CodegenModel parentCodegenModel = getCodegenModel(codegenModel.parent, parentModel); if (codegenModel.hasEnums) { codegenModel = this.reconcileInlineEnums(codegenModel, parentCodegenModel); } diff --git a/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/CSharpReducedClientCodegen.java b/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/CSharpReducedClientCodegen.java index 60d8a9956f8c..8d1becf8e3be 100644 --- a/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/CSharpReducedClientCodegen.java +++ b/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/CSharpReducedClientCodegen.java @@ -380,7 +380,7 @@ public CodegenModel fromModel(String name, Schema model) { if (allDefinitions != null && codegenModel != null && codegenModel.parent != null) { final Schema parentModel = allDefinitions.get(toModelName(codegenModel.parent)); if (parentModel != null) { - final CodegenModel parentCodegenModel = super.fromModel(codegenModel.parent, parentModel); + final CodegenModel parentCodegenModel = getCodegenModel(codegenModel.parent, parentModel); if (codegenModel.hasEnums) { codegenModel = this.reconcileInlineEnums(codegenModel, parentCodegenModel); }