-
-
Notifications
You must be signed in to change notification settings - Fork 6.7k
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
[csharp-netcore] Fixed handling of nullable enum values #6112
Changes from 2 commits
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -417,6 +417,7 @@ public Map<String, Object> postProcessAllModels(Map<String, Object> objs) { | |
final Map<String, Object> processed = super.postProcessAllModels(objs); | ||
postProcessEnumRefs(processed); | ||
updateValueTypeProperty(processed); | ||
updateNullableTypeProperty(processed); | ||
return processed; | ||
} | ||
|
||
|
@@ -603,6 +604,25 @@ protected void updateValueTypeProperty(Map<String, Object> models) { | |
} | ||
} | ||
|
||
/** | ||
* Update property if it is a C# nullable type | ||
* | ||
* @param models list of all models | ||
*/ | ||
protected void updateNullableTypeProperty(Map<String, Object> models) { | ||
for (Map.Entry<String, Object> entry : models.entrySet()) { | ||
String openAPIName = entry.getKey(); | ||
CodegenModel model = ModelUtils.getModelByName(openAPIName, models); | ||
if (model != null) { | ||
for (CodegenProperty var : model.vars) { | ||
if (!var.isContainer && (nullableType.contains(var.dataType) || var.isEnum)) { | ||
var.vendorExtensions.put("x-csharp-value-type", true); | ||
} | ||
} | ||
} | ||
} | ||
} | ||
|
||
@Override | ||
public Map<String, Object> postProcessOperationsWithModels(Map<String, Object> objs, List<Object> allModels) { | ||
super.postProcessOperationsWithModels(objs, allModels); | ||
|
@@ -678,6 +698,13 @@ public Map<String, Object> postProcessOperationsWithModels(Map<String, Object> o | |
} | ||
} | ||
} | ||
} else { | ||
// Effectively mark enum models as enums | ||
updateCodegenParametersEnum(operation.allParams, allModels); | ||
updateCodegenParametersEnum(operation.pathParams, allModels); | ||
updateCodegenParametersEnum(operation.queryParams, allModels); | ||
updateCodegenParametersEnum(operation.headerParams, allModels); | ||
updateCodegenParametersEnum(operation.formParams, allModels); | ||
} | ||
|
||
processOperation(operation); | ||
|
@@ -692,6 +719,37 @@ protected void processOperation(CodegenOperation operation) { | |
// default noop | ||
} | ||
|
||
private void updateCodegenParametersEnum(List<CodegenParameter> parameters, List<Object> allModels) { | ||
for (CodegenParameter parameter : parameters) { | ||
CodegenModel model = null; | ||
for (Object modelHashMap : allModels) { | ||
CodegenModel codegenModel = ((HashMap<String, CodegenModel>) modelHashMap).get("model"); | ||
if (codegenModel.getClassname().equals(parameter.dataType)) { | ||
model = codegenModel; | ||
break; | ||
} | ||
} | ||
|
||
if (model != null) { | ||
// Effectively mark enum models as enums and non-nullable | ||
if (model.isEnum) { | ||
parameter.isEnum = true; | ||
parameter.allowableValues = model.allowableValues; | ||
parameter.isPrimitiveType = true; | ||
parameter.vendorExtensions.put("x-csharp-value-type", true); | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Only an enum with type generation can be determined here. |
||
} | ||
} | ||
|
||
if (!parameter.isContainer && nullableType.contains(parameter.dataType)) { | ||
parameter.vendorExtensions.put("x-csharp-value-type", true); | ||
} | ||
|
||
if (!parameter.required && parameter.vendorExtensions.get("x-csharp-value-type") != null) { //optional | ||
parameter.dataType = parameter.dataType + "?"; | ||
} | ||
} | ||
} | ||
|
||
@Override | ||
public String apiFileFolder() { | ||
return outputFolder + File.separator + sourceFolder + File.separator + packageName + File.separator + apiPackage(); | ||
|
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -423,10 +423,6 @@ public void postProcessModelProperty(CodegenModel model, CodegenProperty propert | |
postProcessEmitDefaultValue(property.vendorExtensions); | ||
|
||
super.postProcessModelProperty(model, property); | ||
|
||
if (!property.isContainer && (nullableType.contains(property.dataType) || property.isEnum)) { | ||
property.vendorExtensions.put("x-csharp-value-type", true); | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more.
|
||
} | ||
} | ||
|
||
@Override | ||
|
@@ -461,14 +457,6 @@ public void postProcessParameter(CodegenParameter parameter) { | |
postProcessPattern(parameter.pattern, parameter.vendorExtensions); | ||
postProcessEmitDefaultValue(parameter.vendorExtensions); | ||
super.postProcessParameter(parameter); | ||
|
||
if (nullableType.contains(parameter.dataType)) { | ||
if (!parameter.required) { //optional | ||
parameter.dataType = parameter.dataType + "?"; | ||
} else { | ||
parameter.vendorExtensions.put("x-csharp-value-type", true); | ||
} | ||
} | ||
} | ||
|
||
/* | ||
|
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -256,36 +256,48 @@ namespace {{packageName}}.{{apiPackage}} | |
if (localVarAccept != null) localVarRequestOptions.HeaderParameters.Add("Accept", localVarAccept); | ||
|
||
{{#pathParams}} | ||
{{^vendorExtensions.x-csharp-value-type}} | ||
{{#required}} | ||
localVarRequestOptions.PathParameters.Add("{{baseName}}", {{packageName}}.Client.ClientUtils.ParameterToString({{paramName}})); // path parameter | ||
{{/required}} | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. It has been confirmed that required parameters have values at the beginning of the method regardless of whether they are nullable. |
||
{{^required}} | ||
if ({{paramName}} != null) | ||
{ | ||
localVarRequestOptions.PathParameters.Add("{{baseName}}", {{packageName}}.Client.ClientUtils.ParameterToString({{paramName}})); // path parameter | ||
{{/vendorExtensions.x-csharp-value-type}} | ||
{{#vendorExtensions.x-csharp-value-type}} | ||
localVarRequestOptions.PathParameters.Add("{{baseName}}", {{packageName}}.Client.ClientUtils.ParameterToString({{paramName}})); // path parameter | ||
{{/vendorExtensions.x-csharp-value-type}} | ||
} | ||
{{/required}} | ||
{{/pathParams}} | ||
{{#queryParams}} | ||
{{^vendorExtensions.x-csharp-value-type}} | ||
{{#required}} | ||
localVarRequestOptions.QueryParameters.Add({{packageName}}.Client.ClientUtils.ParameterToMultiMap("{{#collectionFormat}}{{collectionFormat}}{{/collectionFormat}}", "{{baseName}}", {{paramName}})); | ||
{{/required}} | ||
{{^required}} | ||
if ({{paramName}} != null) | ||
{ | ||
localVarRequestOptions.QueryParameters.Add({{packageName}}.Client.ClientUtils.ParameterToMultiMap("{{#collectionFormat}}{{collectionFormat}}{{/collectionFormat}}", "{{baseName}}", {{paramName}})); | ||
} | ||
{{/vendorExtensions.x-csharp-value-type}} | ||
{{#vendorExtensions.x-csharp-value-type}} | ||
localVarRequestOptions.QueryParameters.Add({{packageName}}.Client.ClientUtils.ParameterToMultiMap("{{#collectionFormat}}{{collectionFormat}}{{/collectionFormat}}", "{{baseName}}", {{paramName}})); | ||
{{/vendorExtensions.x-csharp-value-type}} | ||
{{/required}} | ||
{{/queryParams}} | ||
{{#headerParams}} | ||
{{^vendorExtensions.x-csharp-value-type}} | ||
{{#required}} | ||
localVarRequestOptions.HeaderParameters.Add("{{baseName}}", {{packageName}}.Client.ClientUtils.ParameterToString({{paramName}})); // header parameter | ||
{{/required}} | ||
{{^required}} | ||
if ({{paramName}} != null) | ||
{ | ||
localVarRequestOptions.HeaderParameters.Add("{{baseName}}", {{packageName}}.Client.ClientUtils.ParameterToString({{paramName}})); // header parameter | ||
{{/vendorExtensions.x-csharp-value-type}} | ||
{{#vendorExtensions.x-csharp-value-type}} | ||
localVarRequestOptions.HeaderParameters.Add("{{baseName}}", {{packageName}}.Client.ClientUtils.ParameterToString({{paramName}})); // header parameter | ||
{{/vendorExtensions.x-csharp-value-type}} | ||
} | ||
{{/required}} | ||
{{/headerParams}} | ||
{{#formParams}} | ||
{{^vendorExtensions.x-csharp-value-type}} | ||
{{#required}} | ||
{{#isFile}} | ||
localVarRequestOptions.FileParameters.Add("{{baseName}}", {{paramName}}); | ||
{{/isFile}} | ||
{{^isFile}} | ||
localVarRequestOptions.FormParameters.Add("{{baseName}}", {{packageName}}.Client.ClientUtils.ParameterToString({{paramName}})); // form parameter | ||
{{/isFile}} | ||
{{/required}} | ||
{{^required}} | ||
if ({{paramName}} != null) | ||
{ | ||
{{#isFile}} | ||
|
@@ -295,15 +307,7 @@ namespace {{packageName}}.{{apiPackage}} | |
localVarRequestOptions.FormParameters.Add("{{baseName}}", {{packageName}}.Client.ClientUtils.ParameterToString({{paramName}})); // form parameter | ||
{{/isFile}} | ||
} | ||
{{/vendorExtensions.x-csharp-value-type}} | ||
{{#vendorExtensions.x-csharp-value-type}} | ||
{{#isFile}} | ||
localVarRequestOptions.FileParameters.Add("{{baseName}}", {{paramName}}); | ||
{{/isFile}} | ||
{{^isFile}} | ||
localVarRequestOptions.FormParameters.Add("{{baseName}}", {{packageName}}.Client.ClientUtils.ParameterToString({{paramName}})); // form parameter | ||
{{/isFile}} | ||
{{/vendorExtensions.x-csharp-value-type}} | ||
{{/required}} | ||
{{/formParams}} | ||
{{#bodyParam}} | ||
localVarRequestOptions.Data = {{paramName}}; | ||
|
@@ -415,36 +419,48 @@ namespace {{packageName}}.{{apiPackage}} | |
localVarRequestOptions.HeaderParameters.Add("Accept", _accept); | ||
|
||
{{#pathParams}} | ||
{{^vendorExtensions.x-csharp-value-type}} | ||
{{#required}} | ||
localVarRequestOptions.PathParameters.Add("{{baseName}}", {{packageName}}.Client.ClientUtils.ParameterToString({{paramName}})); // path parameter | ||
{{/required}} | ||
{{^required}} | ||
if ({{paramName}} != null) | ||
{ | ||
localVarRequestOptions.PathParameters.Add("{{baseName}}", {{packageName}}.Client.ClientUtils.ParameterToString({{paramName}})); // path parameter | ||
{{/vendorExtensions.x-csharp-value-type}} | ||
{{#vendorExtensions.x-csharp-value-type}} | ||
localVarRequestOptions.PathParameters.Add("{{baseName}}", {{packageName}}.Client.ClientUtils.ParameterToString({{paramName}})); // path parameter | ||
{{/vendorExtensions.x-csharp-value-type}} | ||
} | ||
{{/required}} | ||
{{/pathParams}} | ||
{{#queryParams}} | ||
{{^vendorExtensions.x-csharp-value-type}} | ||
{{#required}} | ||
localVarRequestOptions.QueryParameters.Add({{packageName}}.Client.ClientUtils.ParameterToMultiMap("{{#collectionFormat}}{{collectionFormat}}{{/collectionFormat}}", "{{baseName}}", {{paramName}})); | ||
{{/required}} | ||
{{^required}} | ||
if ({{paramName}} != null) | ||
{ | ||
localVarRequestOptions.QueryParameters.Add({{packageName}}.Client.ClientUtils.ParameterToMultiMap("{{#collectionFormat}}{{collectionFormat}}{{/collectionFormat}}", "{{baseName}}", {{paramName}})); | ||
} | ||
{{/vendorExtensions.x-csharp-value-type}} | ||
{{#vendorExtensions.x-csharp-value-type}} | ||
localVarRequestOptions.QueryParameters.Add({{packageName}}.Client.ClientUtils.ParameterToMultiMap("{{#collectionFormat}}{{collectionFormat}}{{/collectionFormat}}", "{{baseName}}", {{paramName}})); | ||
{{/vendorExtensions.x-csharp-value-type}} | ||
{{/required}} | ||
{{/queryParams}} | ||
{{#headerParams}} | ||
{{^vendorExtensions.x-csharp-value-type}} | ||
{{#required}} | ||
localVarRequestOptions.HeaderParameters.Add("{{baseName}}", {{packageName}}.Client.ClientUtils.ParameterToString({{paramName}})); // header parameter | ||
{{/required}} | ||
{{^required}} | ||
if ({{paramName}} != null) | ||
{ | ||
localVarRequestOptions.HeaderParameters.Add("{{baseName}}", {{packageName}}.Client.ClientUtils.ParameterToString({{paramName}})); // header parameter | ||
{{/vendorExtensions.x-csharp-value-type}} | ||
{{#vendorExtensions.x-csharp-value-type}} | ||
localVarRequestOptions.HeaderParameters.Add("{{baseName}}", {{packageName}}.Client.ClientUtils.ParameterToString({{paramName}})); // header parameter | ||
{{/vendorExtensions.x-csharp-value-type}} | ||
} | ||
{{/required}} | ||
{{/headerParams}} | ||
{{#formParams}} | ||
{{^vendorExtensions.x-csharp-value-type}} | ||
{{#required}} | ||
{{#isFile}} | ||
localVarRequestOptions.FileParameters.Add("{{baseName}}", {{paramName}}); | ||
{{/isFile}} | ||
{{^isFile}} | ||
localVarRequestOptions.FormParameters.Add("{{baseName}}", {{packageName}}.Client.ClientUtils.ParameterToString({{paramName}})); // form parameter | ||
{{/isFile}} | ||
{{/required}} | ||
{{^required}} | ||
if ({{paramName}} != null) | ||
{ | ||
{{#isFile}} | ||
|
@@ -454,15 +470,7 @@ namespace {{packageName}}.{{apiPackage}} | |
localVarRequestOptions.FormParameters.Add("{{baseName}}", {{packageName}}.Client.ClientUtils.ParameterToString({{paramName}})); // form parameter | ||
{{/isFile}} | ||
} | ||
{{/vendorExtensions.x-csharp-value-type}} | ||
{{#vendorExtensions.x-csharp-value-type}} | ||
{{#isFile}} | ||
localVarRequestOptions.FileParameters.Add("{{baseName}}", {{paramName}}); | ||
{{/isFile}} | ||
{{^isFile}} | ||
localVarRequestOptions.FormParameters.Add("{{baseName}}", {{packageName}}.Client.ClientUtils.ParameterToString({{paramName}})); // form parameter | ||
{{/isFile}} | ||
{{/vendorExtensions.x-csharp-value-type}} | ||
{{/required}} | ||
{{/formParams}} | ||
{{#bodyParam}} | ||
localVarRequestOptions.Data = {{paramName}}; | ||
|
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Only at this timing
isEnum
is set to the correct value