Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions .github/workflows/openapi-generator.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -144,6 +144,7 @@ jobs:
run: |
rm -rf samples/client/petstore/csharp/generichost/latest/HelloWorld
rm -rf samples/client/petstore/csharp/generichost/latest/Tags
rm -rf samples/client/petstore/csharp/generichost/latest/OneOfList

rm -rf samples/client/petstore/csharp/generichost/net8/AllOf
rm -rf samples/client/petstore/csharp/generichost/net8/AnyOf
Expand Down
1 change: 1 addition & 0 deletions .github/workflows/samples-dotnet9.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -25,6 +25,7 @@ jobs:
sample:
- samples/client/petstore/csharp/generichost/latest/Tags
- samples/client/petstore/csharp/generichost/latest/HelloWorld
- samples/client/petstore/csharp/generichost/latest/OneOfList
- samples/client/petstore/csharp/generichost/net9/AllOf
- samples/client/petstore/csharp/generichost/net9/AnyOf
- samples/client/petstore/csharp/generichost/net9/AnyOfNoCompare
Expand Down
1 change: 1 addition & 0 deletions appveyor.yml
Original file line number Diff line number Diff line change
Expand Up @@ -45,6 +45,7 @@ build_script:
test_script:
- dotnet test samples\client\petstore\csharp\generichost\latest\Tags\src\Org.OpenAPITools.Test\Org.OpenAPITools.Test.csproj
- dotnet test samples\client\petstore\csharp\generichost\latest\HelloWorld\src\Org.OpenAPITools.Test\Org.OpenAPITools.Test.csproj
- dotnet test samples\client\petstore\csharp\generichost\latest\OneOfList\src\Org.OpenAPITools.Test\Org.OpenAPITools.Test.csproj

- dotnet test samples\client\petstore\csharp\generichost\net9\AllOf\src\Org.OpenAPITools.Test\Org.OpenAPITools.Test.csproj
- dotnet test samples\client\petstore\csharp\generichost\net9\AnyOf\src\Org.OpenAPITools.Test\Org.OpenAPITools.Test.csproj
Expand Down
8 changes: 8 additions & 0 deletions bin/configs/csharp-generichost-latest-oneOfList.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
generatorName: csharp
outputDir: samples/client/petstore/csharp/generichost/latest/OneOfList
inputSpec: modules/openapi-generator/src/test/resources/bugs/issue_20739.yaml
templateDir: modules/openapi-generator/src/main/resources/csharp
additionalProperties:
packageGuid: '{321C8C3F-0156-40C1-AE42-D59761FB9B6C}'
modelPropertySorting: alphabetical
operationParameterSorting: alphabetical
Original file line number Diff line number Diff line change
Expand Up @@ -625,10 +625,11 @@ public Map<String, ModelsMap> postProcessAllModels(Map<String, ModelsMap> objs)

CodegenComposedSchemas composedSchemas = model.getComposedSchemas();
if (composedSchemas != null) {
Set<String> composedPropertyNames = new HashSet<String>();
List<CodegenProperty> allOf = composedSchemas.getAllOf();
if (allOf != null) {
for (CodegenProperty property : allOf) {
property.name = patchPropertyName(model, camelize(property.baseType));
property.name = patchPropertyName(model, camelize(property.baseType), composedPropertyNames);
patchPropertyVendorExtensions(property);
}
}
Expand All @@ -637,7 +638,7 @@ public Map<String, ModelsMap> postProcessAllModels(Map<String, ModelsMap> objs)
if (anyOf != null) {
removePropertiesDeclaredInComposedTypes(objs, model, anyOf);
for (CodegenProperty property : anyOf) {
property.name = patchPropertyName(model, camelize(property.baseType));
property.name = patchPropertyName(model, camelize(property.baseType), composedPropertyNames);
property.isNullable = true;
patchPropertyVendorExtensions(property);
property.vendorExtensions.put("x-base-name", model.name.substring(model.name.lastIndexOf('_') + 1));
Expand All @@ -648,7 +649,7 @@ public Map<String, ModelsMap> postProcessAllModels(Map<String, ModelsMap> objs)
if (oneOf != null) {
removePropertiesDeclaredInComposedTypes(objs, model, oneOf);
for (CodegenProperty property : oneOf) {
property.name = patchPropertyName(model, camelize(property.baseType));
property.name = patchPropertyName(model, camelize(property.baseType), composedPropertyNames);
property.isNullable = true;
patchPropertyVendorExtensions(property);
property.vendorExtensions.put("x-base-name", model.name.substring(model.name.lastIndexOf('_') + 1));
Expand Down Expand Up @@ -715,13 +716,27 @@ private boolean modelIsMutable(CodegenModel model, Set<String> processed) {
protected void removePropertiesDeclaredInComposedTypes(Map<String, ModelsMap> objs, CodegenModel model, List<CodegenProperty> composedProperties) {
}

private String patchPropertyName(CodegenModel model, String value) {
private String patchPropertyName(CodegenModel model, String value, Set<String> composedPropertyNames) {
String name = escapeReservedWord(model, value);

if (name.startsWith(AbstractCSharpCodegen.invalidParameterNamePrefix)) {
name = AbstractCSharpCodegen.invalidPropertyNamePrefix + name.substring(AbstractCSharpCodegen.invalidParameterNamePrefix.length());
}

// ensure the name we use for a composed property does not already exist as a property or composed property
// only do this if the set of composed property names was provided to ensure this method is idempotent
// we would not calling this method multiple times to result in different values
if (composedPropertyNames != null) {
String tmpName = name;
long count = model.allVars.stream().map(v -> v.name).filter(n -> n.equals(tmpName)).count() + composedPropertyNames.stream().filter(n -> n.equals(tmpName)).count();

if (count > 0) {
name = name + count++;
}

composedPropertyNames.add(name);
}

return name;
}

Expand Down Expand Up @@ -753,7 +768,7 @@ protected void patchProperty(Map<String, CodegenModel> enumRefs, CodegenModel mo

patchPropertyVendorExtensions(property);

property.name = patchPropertyName(model, property.name);
property.name = patchPropertyName(model, property.name, null);

String[] nestedTypes = {"List", "Collection", "ICollection", "Dictionary"};

Expand Down
32 changes: 32 additions & 0 deletions modules/openapi-generator/src/test/resources/bugs/issue_20739.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,32 @@
openapi: 3.0.1
info:
title: Oneof array test
version: 1.0.0
servers:
- url: /
paths:
/one-of-array:
post:
description: Oneof array test
operationId: oneOfArray
requestBody:
content:
application/json:
schema:
oneOf:
- items:
type: string
type: array
- items:
$ref: '#/components/schemas/TestObject'
type: array
responses:
"204":
description: Successful operation
components:
schemas:
TestObject:
properties:
name:
type: string
type: object
Loading
Loading