Skip to content

Commit 0de216f

Browse files
committed
started fixing multiple issues
1 parent b7fb3b2 commit 0de216f

3 files changed

Lines changed: 97 additions & 28 deletions

File tree

modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/AbstractCSharpCodegen.java

Lines changed: 83 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -629,7 +629,7 @@ public Map<String, ModelsMap> postProcessAllModels(Map<String, ModelsMap> objs)
629629
List<CodegenProperty> allOf = composedSchemas.getAllOf();
630630
if (allOf != null) {
631631
for (CodegenProperty property : allOf) {
632-
property.name = patchPropertyName(model, camelize(property.baseType), composedPropertyNames);
632+
property.name = patchPropertyName(model, property, camelize(property.baseType), composedPropertyNames);
633633
patchPropertyVendorExtensions(property);
634634
}
635635
}
@@ -638,7 +638,7 @@ public Map<String, ModelsMap> postProcessAllModels(Map<String, ModelsMap> objs)
638638
if (anyOf != null) {
639639
removePropertiesDeclaredInComposedTypes(objs, model, anyOf);
640640
for (CodegenProperty property : anyOf) {
641-
property.name = patchPropertyName(model, camelize(property.baseType), composedPropertyNames);
641+
property.name = patchPropertyName(model, property, camelize(property.baseType), composedPropertyNames);
642642
property.isNullable = true;
643643
patchPropertyVendorExtensions(property);
644644
property.vendorExtensions.put("x-base-name", model.name.substring(model.name.lastIndexOf('_') + 1));
@@ -649,10 +649,18 @@ public Map<String, ModelsMap> postProcessAllModels(Map<String, ModelsMap> objs)
649649
if (oneOf != null) {
650650
removePropertiesDeclaredInComposedTypes(objs, model, oneOf);
651651
for (CodegenProperty property : oneOf) {
652-
property.name = patchPropertyName(model, camelize(property.baseType), composedPropertyNames);
652+
property.name = patchPropertyName(model, property, camelize(property.baseType), composedPropertyNames);
653653
property.isNullable = true;
654654
patchPropertyVendorExtensions(property);
655655
property.vendorExtensions.put("x-base-name", model.name.substring(model.name.lastIndexOf('_') + 1));
656+
657+
if (!property.isEnum) {
658+
CodegenModel composedOf = ModelUtils.getModelByName(property.name, processed);
659+
if (composedOf != null) {
660+
property.isEnum = composedOf.isEnum;
661+
patchPropertyVendorExtensions(property);
662+
}
663+
}
656664
}
657665
}
658666
}
@@ -716,7 +724,47 @@ private boolean modelIsMutable(CodegenModel model, Set<String> processed) {
716724
protected void removePropertiesDeclaredInComposedTypes(Map<String, ModelsMap> objs, CodegenModel model, List<CodegenProperty> composedProperties) {
717725
}
718726

719-
private String patchPropertyName(CodegenModel model, String value, Set<String> composedPropertyNames) {
727+
/**
728+
* If the model has duplicate proprety names, just make it unique
729+
* This can happen for base names like "id" and "@id"
730+
* @param model
731+
* @param property
732+
* @param value
733+
* @return
734+
*/
735+
private String setUniquePropertyName(CodegenModel model, CodegenProperty property, String value) {
736+
if (property.name.equalsIgnoreCase(property.baseName)) {
737+
return value;
738+
}
739+
740+
Optional<CodegenProperty> alreadyUpdatedProperty = model.allVars.stream()
741+
.filter(p -> !p.name.equals(property.name) && p.baseName.equals(property.baseName))
742+
.collect(Collectors.toList())
743+
.stream()
744+
.findFirst();
745+
746+
if (alreadyUpdatedProperty.isPresent()) {
747+
// above iterates allVars, which may have already been corrected
748+
return alreadyUpdatedProperty.get().name;
749+
}
750+
751+
final String tmp = value;
752+
753+
long count = model.allVars.stream()
754+
.filter(v -> v.name.equalsIgnoreCase(tmp))
755+
.count();
756+
757+
if (count > 1) {
758+
value = value + count;
759+
value = setUniquePropertyName(model, property, value);
760+
}
761+
762+
return value;
763+
}
764+
765+
private String patchPropertyName(CodegenModel model, CodegenProperty property, String value, Set<String> composedPropertyNames) {
766+
value = setUniquePropertyName(model, property, value);
767+
720768
String name = escapeReservedWord(model, value);
721769

722770
if (name.startsWith(AbstractCSharpCodegen.invalidParameterNamePrefix)) {
@@ -768,26 +816,44 @@ protected void patchProperty(Map<String, CodegenModel> enumRefs, CodegenModel mo
768816

769817
patchPropertyVendorExtensions(property);
770818

771-
property.name = patchPropertyName(model, property.name, null);
819+
property.name = patchPropertyName(model, property, property.name, null);
820+
821+
patchNestedMaps(property);
822+
823+
// HOTFIX: https://github.com/OpenAPITools/openapi-generator/issues/14944
824+
if (property.datatypeWithEnum.equals("decimal")) {
825+
property.isDecimal = true;
826+
}
827+
}
828+
829+
private void patchNestedMaps(CodegenProperty property) {
830+
// Process nested types before making any replacements to ensure we have the correct inner type
831+
if (property.items != null) {
832+
patchNestedMaps(property.items);
833+
}
772834

773835
String[] nestedTypes = {"List", "Collection", "ICollection", "Dictionary"};
836+
837+
if (property.datatypeWithEnum != null) {
838+
String originalType = property.datatypeWithEnum;
839+
840+
for (String nestedType : nestedTypes) {
841+
// fix incorrect data types for maps of maps
842+
if (property.items != null) {
843+
if (property.datatypeWithEnum.contains(", " + nestedType + ">")) {
844+
property.datatypeWithEnum = property.datatypeWithEnum.replace(", " + nestedType + ">", ", " + property.items.datatypeWithEnum + ">");
845+
}
774846

775-
Arrays.stream(nestedTypes).forEach(nestedType -> {
776-
// fix incorrect data types for maps of maps
777-
if (property.datatypeWithEnum.contains(", " + nestedType + ">") && property.items != null) {
778-
property.datatypeWithEnum = property.datatypeWithEnum.replace(", " + nestedType + ">", ", " + property.items.datatypeWithEnum + ">");
779-
property.dataType = property.datatypeWithEnum;
847+
if (property.datatypeWithEnum.contains("<" + nestedType + ">")) {
848+
property.datatypeWithEnum = property.datatypeWithEnum.replace("<" + nestedType + ">", "<" + property.items.datatypeWithEnum + ">");
849+
}
850+
}
780851
}
781852

782-
if (property.datatypeWithEnum.contains("<" + nestedType + ">") && property.items != null) {
783-
property.datatypeWithEnum = property.datatypeWithEnum.replace("<" + nestedType + ">", "<" + property.items.datatypeWithEnum + ">");
853+
// Only update dataType if we actually made changes
854+
if (!originalType.equals(property.datatypeWithEnum)) {
784855
property.dataType = property.datatypeWithEnum;
785856
}
786-
});
787-
788-
// HOTFIX: https://github.com/OpenAPITools/openapi-generator/issues/14944
789-
if (property.datatypeWithEnum.equals("decimal")) {
790-
property.isDecimal = true;
791857
}
792858
}
793859

modules/openapi-generator/src/main/resources/csharp/libraries/generichost/JsonConverter.mustache

Lines changed: 9 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -287,7 +287,7 @@
287287
{{^model.composedSchemas.anyOf}}
288288
{{#mappedModels}}
289289
if ({{#lambda.camelcase_sanitize_param}}{{model.classname}}{{/lambda.camelcase_sanitize_param}} != null)
290-
return new {{classname}}({{#lambda.joinWithComma}}{{#lambda.camelcase_sanitize_param}}{{model.classname}}{{/lambda.camelcase_sanitize_param}}{{#vendorExtensions.x-is-value-type}}{{^isNullable}}.Value{{/isNullable}}{{/vendorExtensions.x-is-value-type}} {{#model.composedSchemas.anyOf}}{{#lambda.camelcase_sanitize_param}}{{name}}{{/lambda.camelcase_sanitize_param}}{{#vendorExtensions.x-is-value-type}}{{^isNullable}}.Value{{/isNullable}}{{/vendorExtensions.x-is-value-type}} {{/model.composedSchemas.anyOf}}{{#allVars}}{{^isDiscriminator}}{{#lambda.camelcase_sanitize_param}}{{name}}{{/lambda.camelcase_sanitize_param}}{{#required}}.Value{{nrt!}}{{^isNullable}}{{#vendorExtensions.x-is-value-type}}.Value{{/vendorExtensions.x-is-value-type}}{{/isNullable}}{{/required}} {{/isDiscriminator}}{{/allVars}}{{/lambda.joinWithComma}});
290+
return new {{classname}}({{#lambda.joinWithComma}}{{#lambda.camelcase_sanitize_param}}{{model.classname}}{{/lambda.camelcase_sanitize_param}}{{#vendorExtensions.x-is-value-type}}{{^isNullable}}.Value{{/isNullable}}{{/vendorExtensions.x-is-value-type}} {{#model.composedSchemas.anyOf}}{{#lambda.camelcase_sanitize_param}}{{name}}{{/lambda.camelcase_sanitize_param}}{{#vendorExtensions.x-is-value-type}}{{^isNullable}}.Value{{/isNullable}}{{/vendorExtensions.x-is-value-type}} {{/model.composedSchemas.anyOf}}{{#allVars}}{{^isDiscriminator}}{{#lambda.camelcase_sanitize_param}}{{name}}{{/lambda.camelcase_sanitize_param}}{{#required}}.Value{{nrt!}}{{^isNullable}}{{#vendorExtensions.x-is-value-type}}.Value{{/vendorExtensions.x-is-value-type}}{{/isNullable}}{{/required}} {{/isDiscriminator}}{{/allVars}}{{/lambda.joinWithComma}}); // a
291291

292292
{{#-last}}
293293
throw new JsonException();
@@ -299,22 +299,22 @@
299299
{{^composedSchemas.oneOf}}
300300
{{^required}}
301301
{{#model.composedSchemas.anyOf}}
302-
Option<{{baseType}}{{>NullConditionalProperty}}> {{#lambda.camelcase_sanitize_param}}{{name}}{{/lambda.camelcase_sanitize_param}}ParsedValue = {{#lambda.camelcase_sanitize_param}}{{name}}{{/lambda.camelcase_sanitize_param}} == null
302+
Option<{{{datatypeWithEnum}}}{{>NullConditionalProperty}}> {{#lambda.camelcase_sanitize_param}}{{name}}{{/lambda.camelcase_sanitize_param}}ParsedValue = {{#lambda.camelcase_sanitize_param}}{{name}}{{/lambda.camelcase_sanitize_param}} == null
303303
? default
304-
: new Option<{{baseType}}{{>NullConditionalProperty}}>({{#lambda.camelcase_sanitize_param}}{{name}}{{/lambda.camelcase_sanitize_param}});
304+
: new Option<{{{datatypeWithEnum}}}{{>NullConditionalProperty}}>({{#lambda.camelcase_sanitize_param}}{{name}}{{/lambda.camelcase_sanitize_param}});
305305
{{/model.composedSchemas.anyOf}}
306306
{{#-last}}
307307

308308
{{/-last}}
309309
{{/required}}
310-
return new {{classname}}({{#lambda.joinWithComma}}{{#model.composedSchemas.anyOf}}{{#lambda.camelcase_sanitize_param}}{{name}}{{/lambda.camelcase_sanitize_param}}ParsedValue{{#required}}.Value{{#vendorExtensions.x-is-value-type}}{{nrt!}}.Value{{nrt!}}{{/vendorExtensions.x-is-value-type}}{{/required}} {{/model.composedSchemas.anyOf}}{{#allVars}}{{^isDiscriminator}}{{#lambda.camelcase_sanitize_param}}{{name}}{{/lambda.camelcase_sanitize_param}}{{#required}}.Value{{nrt!}}{{^isNullable}}{{#vendorExtensions.x-is-value-type}}.Value{{nrt!}}{{/vendorExtensions.x-is-value-type}}{{/isNullable}}{{/required}} {{/isDiscriminator}}{{/allVars}}{{/lambda.joinWithComma}});
310+
return new {{classname}}({{#lambda.joinWithComma}}{{#model.composedSchemas.anyOf}}{{#lambda.camelcase_sanitize_param}}{{name}}{{/lambda.camelcase_sanitize_param}}ParsedValue{{#required}}.Value{{#vendorExtensions.x-is-value-type}}{{nrt!}}.Value{{nrt!}}{{/vendorExtensions.x-is-value-type}}{{/required}} {{/model.composedSchemas.anyOf}}{{#allVars}}{{^isDiscriminator}}{{#lambda.camelcase_sanitize_param}}{{name}}{{/lambda.camelcase_sanitize_param}}{{#required}}.Value{{nrt!}}{{^isNullable}}{{#vendorExtensions.x-is-value-type}}.Value{{nrt!}}{{/vendorExtensions.x-is-value-type}}{{/isNullable}}{{/required}} {{/isDiscriminator}}{{/allVars}}{{/lambda.joinWithComma}}); // b
311311
{{/composedSchemas.oneOf}}
312312
{{^model.discriminator}}
313313
{{#composedSchemas}}
314314
{{#oneOf}}
315315
{{^vendorExtensions.x-duplicated-data-type}}
316316
if ({{#lambda.camelcase_sanitize_param}}{{name}}{{/lambda.camelcase_sanitize_param}} != null)
317-
return new {{classname}}({{#lambda.joinWithComma}}{{#lambda.camelcase_sanitize_param}}{{name}}{{/lambda.camelcase_sanitize_param}}{{#vendorExtensions.x-is-value-type}}.Value{{/vendorExtensions.x-is-value-type}} {{#model.composedSchemas.anyOf}}{{#lambda.camelcase_sanitize_param}}{{name}}{{/lambda.camelcase_sanitize_param}}{{#vendorExtensions.x-is-value-type}}{{^isNullable}}.Value{{/isNullable}}{{/vendorExtensions.x-is-value-type}} {{/model.composedSchemas.anyOf}}{{#allVars}}{{^isDiscriminator}}{{#lambda.camelcase_sanitize_param}}{{name}}{{/lambda.camelcase_sanitize_param}}{{#required}}ParsedValue{{/required}} {{/isDiscriminator}}{{/allVars}}{{/lambda.joinWithComma}});
317+
return new {{classname}}({{#lambda.joinWithComma}}{{#lambda.camelcase_sanitize_param}}{{name}}{{/lambda.camelcase_sanitize_param}}{{#vendorExtensions.x-is-value-type}}.Value{{/vendorExtensions.x-is-value-type}}/**{{isEnum}}**/ {{#model.composedSchemas.anyOf}}{{#lambda.camelcase_sanitize_param}}{{name}}{{/lambda.camelcase_sanitize_param}}{{#vendorExtensions.x-is-value-type}}{{^isNullable}}.Value{{/isNullable}}{{/vendorExtensions.x-is-value-type}} {{/model.composedSchemas.anyOf}}{{#allVars}}{{^isDiscriminator}}{{#lambda.camelcase_sanitize_param}}{{name}}{{/lambda.camelcase_sanitize_param}}{{#required}}ParsedValue{{/required}} {{/isDiscriminator}}{{/allVars}}{{/lambda.joinWithComma}}); // c
318318

319319
{{/vendorExtensions.x-duplicated-data-type}}
320320
{{#-last}}
@@ -337,6 +337,7 @@
337337
/// <exception cref="NotImplementedException"></exception>
338338
public override void Write(Utf8JsonWriter writer, {{classname}} {{#lambda.camelcase_sanitize_param}}{{classname}}{{/lambda.camelcase_sanitize_param}}, JsonSerializerOptions jsonSerializerOptions)
339339
{
340+
// b
340341
{{#lambda.trimLineBreaks}}
341342
{{#lambda.copyText}}
342343
{{#lambda.camelcase_sanitize_param}}{{classname}}{{/lambda.camelcase_sanitize_param}}
@@ -397,7 +398,7 @@
397398
{{^isPrimitiveType}}
398399
{
399400
{{datatypeWithEnum}}JsonConverter {{datatypeWithEnum}}JsonConverter = ({{datatypeWithEnum}}JsonConverter) jsonSerializerOptions.Converters.First(c => c.CanConvert({{#lambda.camelcase_sanitize_param}}{{model.classname}}{{/lambda.camelcase_sanitize_param}}.{{name}}{{^required}}Option.Value{{/required}}.GetType()));
400-
{{datatypeWithEnum}}JsonConverter.WriteProperties(writer, {{#lambda.camelcase_sanitize_param}}{{model.classname}}{{/lambda.camelcase_sanitize_param}}.{{name}}{{^required}}Option.Value{{/required}}, jsonSerializerOptions);
401+
{{datatypeWithEnum}}JsonConverter.WriteProperties(writer, {{#lambda.camelcase_sanitize_param}}{{model.classname}}{{/lambda.camelcase_sanitize_param}}.{{name}}{{^required}}Option.Value{{/required}}, jsonSerializerOptions); //here {{isEnum}}
401402
}
402403
{{/isPrimitiveType}}
403404

@@ -407,8 +408,10 @@
407408
WriteProperties(writer, {{#lambda.camelcase_sanitize_param}}{{classname}}{{/lambda.camelcase_sanitize_param}}, jsonSerializerOptions);
408409
writer.WriteEndObject();
409410
{{/lambda.trimLineBreaks}}
411+
// hi
410412
}
411413

414+
// a
412415
/// <summary>
413416
/// Serializes the properties of <see cref="{{classname}}" />
414417
/// </summary>

0 commit comments

Comments
 (0)