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 610322f0cf4..33a13db3351 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 @@ -468,12 +468,15 @@ public abstract class AbstractCSharpCodegen extends DefaultCodegen implements Co @Override public Map postProcessAllModels(Map objs) { final Map processed = super.postProcessAllModels(objs); + + // TODO: move the logic of these three methods into patchProperty so all CodegenProperty instances get the same treatment postProcessEnumRefs(processed); updateValueTypeProperty(processed); updateNullableTypeProperty(processed); for (Map.Entry entry : objs.entrySet()) { CodegenModel model = ModelUtils.getModelByName(entry.getKey(), objs); + removeCircularReferencesInComposedSchemas(model); // https://github.com/OpenAPITools/openapi-generator/issues/12324 // TODO: why do these collections contain different instances? @@ -534,6 +537,31 @@ public abstract class AbstractCSharpCodegen extends DefaultCodegen implements Co } } + /** Mitigates https://github.com/OpenAPITools/openapi-generator/issues/13709 */ + private void removeCircularReferencesInComposedSchemas(CodegenModel cm) { + cm.anyOf.removeIf(anyOf -> anyOf.equals(cm.classname)); + cm.oneOf.removeIf(oneOf -> oneOf.equals(cm.classname)); + cm.allOf.removeIf(allOf -> allOf.equals(cm.classname)); + + CodegenComposedSchemas composedSchemas = cm.getComposedSchemas(); + if (composedSchemas != null){ + List anyOf = composedSchemas.getAnyOf(); + if (anyOf != null) { + anyOf.removeIf(p -> p.dataType.equals(cm.classname)); + } + + List oneOf = composedSchemas.getOneOf(); + if (oneOf != null){ + oneOf.removeIf(p -> p.dataType.equals(cm.classname)); + } + + List allOf = composedSchemas.getAllOf(); + if (allOf != null){ + allOf.removeIf(p -> p.dataType.equals(cm.classname)); + } + } + } + @Override protected List> buildEnumVars(List values, String dataType) { List> enumVars = super.buildEnumVars(values, dataType);