[abstract-csharp] Make data types overridable (#15814)

* added new vendor extenion

* moved code to methods to enable overriding

* fixed tests

* renamed method to setTypeMapping

* removed commented code

* moved code to make diff easier to understand

* removed commented code
This commit is contained in:
devhl-labs
2023-06-13 22:47:46 -04:00
committed by GitHub
parent 3b832c9fd4
commit 6a1626c8e7
8 changed files with 294 additions and 156 deletions

View File

@@ -95,11 +95,6 @@ public abstract class AbstractCSharpCodegen extends DefaultCodegen implements Co
protected Boolean zeroBasedEnums = null;
protected static final String zeroBasedEnumVendorExtension = "x-zero-based-enum";
// nullable type
protected Set<String> nullableType = new HashSet<>();
protected Set<String> valueTypes = new HashSet<>();
private final Logger LOGGER = LoggerFactory.getLogger(AbstractCSharpCodegen.class);
// special property keywords not allowed as these are the function names in the model files
@@ -201,42 +196,6 @@ public abstract class AbstractCSharpCodegen extends DefaultCodegen implements Co
instantiationTypes.put("list", "List");
instantiationTypes.put("map", "Dictionary");
// Nullable types here assume C# 2 support is not part of base
typeMapping = new HashMap<>();
typeMapping.put("string", "string");
typeMapping.put("binary", "byte[]");
typeMapping.put("ByteArray", "byte[]");
typeMapping.put("boolean", "bool?");
typeMapping.put("integer", "int?");
typeMapping.put("UnsignedInteger", "uint?");
typeMapping.put("UnsignedLong", "ulong?");
typeMapping.put("long", "long?");
typeMapping.put("float", "float?");
typeMapping.put("double", "double?");
typeMapping.put("number", "decimal?");
typeMapping.put("BigDecimal", "decimal?");
typeMapping.put("DateTime", "DateTime?");
typeMapping.put("date", "DateTime?");
typeMapping.put("file", "System.IO.Stream");
typeMapping.put("array", "List");
typeMapping.put("list", "List");
typeMapping.put("map", "Dictionary");
typeMapping.put("object", "Object");
typeMapping.put("UUID", "Guid?");
typeMapping.put("URI", "string");
typeMapping.put("AnyType", "Object");
// nullable type
nullableType = new HashSet<>(
Arrays.asList("decimal", "bool", "int", "uint", "long", "ulong", "float", "double",
"DateTime", "DateTimeOffset", "Guid")
);
// value Types
valueTypes = new HashSet<>(
Arrays.asList("decimal", "bool", "int", "uint", "long", "ulong", "float", "double")
);
this.setSortParamsByRequiredFlag(true);
// do it only on newer libraries to avoid breaking changes
@@ -449,6 +408,8 @@ public abstract class AbstractCSharpCodegen extends DefaultCodegen implements Co
writer.write(content);
}
});
this.setTypeMapping();
}
@Override
@@ -578,13 +539,13 @@ public abstract class AbstractCSharpCodegen extends DefaultCodegen implements Co
property.isPrimitiveType = true;
}
if (!property.isContainer && (nullableType.contains(property.dataType) || property.isEnum)) {
if (!property.isContainer && (this.getNullableTypes().contains(property.dataType) || property.isEnum)) {
property.vendorExtensions.put("x-csharp-value-type", true);
}
property.vendorExtensions.put("x-is-value-type", isValueType(property));
if (property.isNullable && !property.isContainer && (nullableType.contains(property.dataType) || property.isEnum)) {
if (property.isNullable && !property.isContainer && (this.getNullableTypes().contains(property.dataType) || property.isEnum)) {
property.vendorExtensions.put("x-nullable-value-type", true);
}
@@ -851,7 +812,7 @@ public abstract class AbstractCSharpCodegen extends DefaultCodegen implements Co
private void patchParameter(CodegenParameter parameter) {
parameter.paramName = escapeReservedWord(parameter.paramName);
if (parameter.isNullable && !parameter.isContainer && (nullableType.contains(parameter.dataType) || parameter.isEnum)) {
if (parameter.isNullable && !parameter.isContainer && (this.getNullableTypes().contains(parameter.dataType) || parameter.isEnum)) {
parameter.vendorExtensions.put("x-nullable-value-type", true);
}
@@ -865,7 +826,7 @@ public abstract class AbstractCSharpCodegen extends DefaultCodegen implements Co
}
// TODO: move this into patchParamter
private void updateCodegenParametersEnum(List<CodegenParameter> parameters, List<ModelMap> allModels) {
protected void updateCodegenParametersEnum(List<CodegenParameter> parameters, List<ModelMap> allModels) {
for (CodegenParameter parameter : parameters) {
CodegenModel model = null;
for (ModelMap modelHashMap : allModels) {
@@ -886,13 +847,9 @@ public abstract class AbstractCSharpCodegen extends DefaultCodegen implements Co
}
}
if (!parameter.isContainer && nullableType.contains(parameter.dataType)) {
if (!parameter.isContainer && this.getNullableTypes().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 + "?";
}
}
}
@@ -1380,7 +1337,7 @@ public abstract class AbstractCSharpCodegen extends DefaultCodegen implements Co
*/
protected boolean isValueType(CodegenProperty var) {
return (valueTypes.contains(var.dataType) || var.isEnum);
return (this.getValueTypes().contains(var.dataType) || var.isEnum);
}
@Override
@@ -1511,19 +1468,6 @@ public abstract class AbstractCSharpCodegen extends DefaultCodegen implements Co
p.example = example;
}
@Override
public void postProcessParameter(CodegenParameter parameter) {
super.postProcessParameter(parameter);
// TODO: instead of appending the ?
// use isNullable, OptionalParameterLambda, or RequiredParameterLambda
if (!parameter.required && (nullReferenceTypesFlag || nullableType.contains(parameter.dataType))) {
parameter.dataType = parameter.dataType.endsWith("?")
? parameter.dataType
: parameter.dataType + "?";
}
}
@Override
public void postProcessFile(File file, String fileType) {
if (file == null) {
@@ -1577,4 +1521,38 @@ public abstract class AbstractCSharpCodegen extends DefaultCodegen implements Co
return pattern;
}
@Deprecated
protected Set<String> getNullableTypes() {
throw new RuntimeException("This method should no longer be used.");
}
protected Set<String> getValueTypes() {
return new HashSet<>(Arrays.asList("decimal", "bool", "int", "uint", "long", "ulong", "float", "double", "DateTime", "DateTimeOffset", "Guid"));
}
protected void setTypeMapping() {
typeMapping = new HashMap<>();
typeMapping.put("string", "string");
typeMapping.put("binary", "byte[]");
typeMapping.put("ByteArray", "byte[]");
typeMapping.put("boolean", "bool");
typeMapping.put("integer", "int");
typeMapping.put("UnsignedInteger", "uint");
typeMapping.put("UnsignedLong", "ulong");
typeMapping.put("long", "long");
typeMapping.put("float", "float");
typeMapping.put("double", "double");
typeMapping.put("number", "decimal");
typeMapping.put("BigDecimal", "decimal");
typeMapping.put("DateTime", "DateTime");
typeMapping.put("date", "DateTime");
typeMapping.put("file", "System.IO.Stream");
typeMapping.put("array", "List");
typeMapping.put("list", "List");
typeMapping.put("map", "Dictionary");
typeMapping.put("object", "Object");
typeMapping.put("UUID", "Guid");
typeMapping.put("URI", "string");
typeMapping.put("AnyType", "Object");
}
}

View File

@@ -33,11 +33,7 @@ import org.slf4j.LoggerFactory;
import java.io.File;
import java.net.URL;
import java.util.Arrays;
import java.util.EnumSet;
import java.util.List;
import java.util.Locale;
import java.util.Map;
import java.util.*;
import static java.util.UUID.randomUUID;
@@ -136,17 +132,6 @@ public class AspNetServerCodegen extends AbstractCSharpCodegen {
cliOptions.clear();
typeMapping.put("boolean", "bool");
typeMapping.put("integer", "int");
typeMapping.put("float", "float");
typeMapping.put("long", "long");
typeMapping.put("double", "double");
typeMapping.put("number", "decimal");
typeMapping.put("DateTime", "DateTime");
typeMapping.put("date", "DateTime");
typeMapping.put("UUID", "Guid");
typeMapping.put("URI", "string");
setSupportNullable(Boolean.TRUE);
// CLI options
@@ -310,11 +295,58 @@ public class AspNetServerCodegen extends AbstractCSharpCodegen {
addOption(modelClassModifier.getOpt(), modelClassModifier.getDescription(), modelClassModifier.getOptValue());
}
@Deprecated
@Override
protected Set<String> getNullableTypes() {
return new HashSet<>(Arrays.asList("decimal", "bool", "int", "uint", "long", "ulong", "float", "double",
"DateTime", "DateTimeOffset", "Guid"));
}
@Override
protected Set<String> getValueTypes() {
return new HashSet<>(Arrays.asList("decimal", "bool", "int", "uint", "long", "ulong", "float", "double"));
}
@Override
public CodegenType getTag() {
return CodegenType.SERVER;
}
@Override
protected void setTypeMapping() {
super.setTypeMapping();
typeMapping.put("boolean", "bool");
typeMapping.put("integer", "int");
typeMapping.put("float", "float");
typeMapping.put("long", "long");
typeMapping.put("double", "double");
typeMapping.put("number", "decimal");
typeMapping.put("DateTime", "DateTime");
typeMapping.put("date", "DateTime");
typeMapping.put("UUID", "Guid");
typeMapping.put("URI", "string");
}
@Override
public void postProcessParameter(CodegenParameter parameter) {
super.postProcessParameter(parameter);
if (!parameter.dataType.endsWith("?") && !parameter.required && (nullReferenceTypesFlag || this.getNullableTypes().contains(parameter.dataType))) {
parameter.dataType = parameter.dataType + "?";
}
}
@Override
protected void updateCodegenParametersEnum(List<CodegenParameter> parameters, List<ModelMap> allModels) {
super.updateCodegenParametersEnum(parameters, allModels);
for (CodegenParameter parameter : parameters) {
if (!parameter.required && parameter.vendorExtensions.get("x-csharp-value-type") != null) { //optional
parameter.dataType = parameter.dataType + "?";
}
}
}
@Override
public String getName() {
return "aspnetcore";
@@ -443,6 +475,8 @@ public class AspNetServerCodegen extends AbstractCSharpCodegen {
supportingFiles.add(new SupportingFile("Authentication" + File.separator + "ApiAuthentication.mustache", packageFolder + File.separator + "Authentication", "ApiAuthentication.cs"));
supportingFiles.add(new SupportingFile("Formatters" + File.separator + "InputFormatterStream.mustache", packageFolder + File.separator + "Formatters", "InputFormatterStream.cs"));
this.setTypeMapping();
}
public void setPackageGuid(String packageGuid) {
@@ -562,7 +596,7 @@ public class AspNetServerCodegen extends AbstractCSharpCodegen {
@Override
public String getNullableType(Schema p, String type) {
if (languageSpecificPrimitives.contains(type)) {
if (isSupportNullable() && ModelUtils.isNullable(p) && (nullableType.contains(type) || nullReferenceTypesFlag)) {
if (isSupportNullable() && ModelUtils.isNullable(p) && (this.getNullableTypes().contains(type) || nullReferenceTypesFlag)) {
return type + "?";
} else {
return type;

View File

@@ -157,31 +157,6 @@ public class CSharpClientCodegen extends AbstractCSharpCodegen {
)
);
// mapped non-nullable type without ?
typeMapping = new HashMap<String, String>();
typeMapping.put("string", "string");
typeMapping.put("binary", "byte[]");
typeMapping.put("ByteArray", "byte[]");
typeMapping.put("boolean", "bool");
typeMapping.put("integer", "int");
typeMapping.put("long", "long");
typeMapping.put("UnsignedInteger", "uint");
typeMapping.put("UnsignedLong", "ulong");
typeMapping.put("float", "float");
typeMapping.put("double", "double");
typeMapping.put("number", "decimal");
typeMapping.put("decimal", "decimal");
typeMapping.put("DateTime", "DateTime");
typeMapping.put("date", "DateTime");
typeMapping.put("file", "System.IO.Stream");
typeMapping.put("array", "List");
typeMapping.put("list", "List");
typeMapping.put("map", "Dictionary");
typeMapping.put("object", "Object");
typeMapping.put("UUID", "Guid");
typeMapping.put("URI", "string");
typeMapping.put("AnyType", "Object");
setSupportNullable(Boolean.TRUE);
hideGenerationTimestamp = Boolean.TRUE;
supportsInheritance = true;
@@ -364,6 +339,62 @@ public class CSharpClientCodegen extends AbstractCSharpCodegen {
setLibrary(RESTSHARP);
}
@Deprecated
@Override
protected Set<String> getNullableTypes() {
return new HashSet<>(Arrays.asList("decimal", "bool", "int", "uint", "long", "ulong", "float", "double",
"DateTime", "DateTimeOffset", "Guid"));
}
@Override
protected Set<String> getValueTypes() {
return new HashSet<>(Arrays.asList("decimal", "bool", "int", "uint", "long", "ulong", "float", "double"));
}
@Override
protected void setTypeMapping() {
typeMapping = new HashMap<>();
// mapped non-nullable type without ?
typeMapping = new HashMap<String, String>();
typeMapping.put("string", "string");
typeMapping.put("binary", "byte[]");
typeMapping.put("ByteArray", "byte[]");
typeMapping.put("boolean", "bool");
typeMapping.put("integer", "int");
typeMapping.put("long", "long");
typeMapping.put("UnsignedInteger", "uint");
typeMapping.put("UnsignedLong", "ulong");
typeMapping.put("float", "float");
typeMapping.put("double", "double");
typeMapping.put("number", "decimal");
typeMapping.put("decimal", "decimal");
typeMapping.put("DateTime", "DateTime");
typeMapping.put("date", "DateTime");
typeMapping.put("file", "System.IO.Stream");
typeMapping.put("array", "List");
typeMapping.put("list", "List");
typeMapping.put("map", "Dictionary");
typeMapping.put("object", "Object");
typeMapping.put("UUID", "Guid");
typeMapping.put("URI", "string");
typeMapping.put("AnyType", "Object");
if (HTTPCLIENT.equals(getLibrary())) {
typeMapping.put("file", "FileParameter");
}
}
@Override
protected void updateCodegenParametersEnum(List<CodegenParameter> parameters, List<ModelMap> allModels) {
super.updateCodegenParametersEnum(parameters, allModels);
for (CodegenParameter parameter : parameters) {
if (!parameter.required && parameter.vendorExtensions.get("x-csharp-value-type") != null) { //optional
parameter.dataType = parameter.dataType + "?";
}
}
}
@Override
public String apiDocFileFolder() {
if (GENERICHOST.equals(getLibrary())) {
@@ -558,7 +589,7 @@ public class CSharpClientCodegen extends AbstractCSharpCodegen {
@Override
public String getNullableType(Schema p, String type) {
if (languageSpecificPrimitives.contains(type)) {
if (isSupportNullable() && ModelUtils.isNullable(p) && nullableType.contains(type)) {
if (isSupportNullable() && ModelUtils.isNullable(p) && this.getNullableTypes().contains(type)) {
return type + "?";
} else {
return type;
@@ -607,6 +638,11 @@ public class CSharpClientCodegen extends AbstractCSharpCodegen {
public void postProcessParameter(CodegenParameter parameter) {
postProcessPattern(parameter.pattern, parameter.vendorExtensions);
postProcessEmitDefaultValue(parameter.vendorExtensions);
if (!parameter.dataType.endsWith("?") && !parameter.required && (nullReferenceTypesFlag || this.getNullableTypes().contains(parameter.dataType))) {
parameter.dataType = parameter.dataType + "?";
}
super.postProcessParameter(parameter);
}
@@ -832,7 +868,6 @@ public class CSharpClientCodegen extends AbstractCSharpCodegen {
if (HTTPCLIENT.equals(getLibrary())) {
supportingFiles.add(new SupportingFile("FileParameter.mustache", clientPackageDir, "FileParameter.cs"));
typeMapping.put("file", "FileParameter");
addSupportingFiles(clientPackageDir, packageFolder, excludeTests, testPackageFolder, testPackageName, modelPackageDir, authPackageDir);
additionalProperties.put("apiDocPath", apiDocPath);
additionalProperties.put("modelDocPath", modelDocPath);
@@ -869,6 +904,7 @@ public class CSharpClientCodegen extends AbstractCSharpCodegen {
// include the spec in the output
supportingFiles.add(new SupportingFile("openapi.mustache", "api", "openapi.yaml"));
this.setTypeMapping();
}
public void setClientPackage(String clientPackage) {
@@ -1609,8 +1645,8 @@ public class CSharpClientCodegen extends AbstractCSharpCodegen {
protected boolean isValueType(CodegenProperty var) {
// this is temporary until x-csharp-value-type is removed
return this.getLibrary().equals("generichost")
? nullableType.contains(var.dataType) || var.isEnum
: valueTypes.contains(var.dataType) || var.isEnum;
? this.getNullableTypes().contains(var.dataType) || var.isEnum
: this.getValueTypes().contains(var.dataType) || var.isEnum;
}
/**

View File

@@ -32,11 +32,7 @@ import org.slf4j.LoggerFactory;
import java.io.File;
import java.net.URL;
import java.util.Arrays;
import java.util.EnumSet;
import java.util.List;
import java.util.Locale;
import java.util.Map;
import java.util.*;
import static java.util.UUID.randomUUID;
@@ -122,17 +118,6 @@ public class CSharpFunctionsServerCodegen extends AbstractCSharpCodegen {
cliOptions.clear();
typeMapping.put("boolean", "bool");
typeMapping.put("integer", "int");
typeMapping.put("float", "float");
typeMapping.put("long", "long");
typeMapping.put("double", "double");
typeMapping.put("number", "decimal");
typeMapping.put("DateTime", "DateTime");
typeMapping.put("date", "DateTime");
typeMapping.put("UUID", "Guid");
typeMapping.put("URI", "string");
setSupportNullable(Boolean.TRUE);
// CLI options
@@ -265,6 +250,53 @@ public class CSharpFunctionsServerCodegen extends AbstractCSharpCodegen {
addOption(modelClassModifier.getOpt(), modelClassModifier.getDescription(), modelClassModifier.getOptValue());
}
@Deprecated
@Override
protected Set<String> getNullableTypes() {
return new HashSet<>(Arrays.asList("decimal", "bool", "int", "uint", "long", "ulong", "float", "double",
"DateTime", "DateTimeOffset", "Guid"));
}
@Override
protected Set<String> getValueTypes() {
return new HashSet<>(Arrays.asList("decimal", "bool", "int", "uint", "long", "ulong", "float", "double"));
}
@Override
protected void setTypeMapping() {
super.setTypeMapping();
typeMapping.put("boolean", "bool");
typeMapping.put("integer", "int");
typeMapping.put("float", "float");
typeMapping.put("long", "long");
typeMapping.put("double", "double");
typeMapping.put("number", "decimal");
typeMapping.put("DateTime", "DateTime");
typeMapping.put("date", "DateTime");
typeMapping.put("UUID", "Guid");
typeMapping.put("URI", "string");
}
@Override
public void postProcessParameter(CodegenParameter parameter) {
super.postProcessParameter(parameter);
if (!parameter.dataType.endsWith("?") && !parameter.required && (nullReferenceTypesFlag || this.getNullableTypes().contains(parameter.dataType))) {
parameter.dataType = parameter.dataType + "?";
}
}
@Override
protected void updateCodegenParametersEnum(List<CodegenParameter> parameters, List<ModelMap> allModels) {
super.updateCodegenParametersEnum(parameters, allModels);
for (CodegenParameter parameter : parameters) {
if (!parameter.required && parameter.vendorExtensions.get("x-csharp-value-type") != null) { //optional
parameter.dataType = parameter.dataType + "?";
}
}
}
@Override
public CodegenType getTag() {
return CodegenType.SERVER;
@@ -350,6 +382,8 @@ public class CSharpFunctionsServerCodegen extends AbstractCSharpCodegen {
supportingFiles.add(new SupportingFile("typeConverter.mustache", packageFolder + File.separator + "Converters", "CustomEnumConverter.cs"));
supportingFiles.add(new SupportingFile("host.json.mustache", packageFolder, "host.json"));
supportingFiles.add(new SupportingFile("local.settings.json.mustache", packageFolder, "local.settings.json"));
this.setTypeMapping();
}
public void setPackageGuid(String packageGuid) {
@@ -468,7 +502,7 @@ public class CSharpFunctionsServerCodegen extends AbstractCSharpCodegen {
@Override
public String getNullableType(Schema p, String type) {
if (languageSpecificPrimitives.contains(type)) {
if (isSupportNullable() && ModelUtils.isNullable(p) && (nullableType.contains(type) || nullReferenceTypesFlag)) {
if (isSupportNullable() && ModelUtils.isNullable(p) && (this.getNullableTypes().contains(type) || nullReferenceTypesFlag)) {
return type + "?";
} else {
return type;

View File

@@ -135,29 +135,6 @@ public class CSharpReducedClientCodegen extends AbstractCSharpCodegen {
)
);
// mapped non-nullable type without ?
typeMapping = new HashMap<String, String>();
typeMapping.put("string", "string");
typeMapping.put("binary", "byte[]");
typeMapping.put("ByteArray", "byte[]");
typeMapping.put("boolean", "bool");
typeMapping.put("integer", "int");
typeMapping.put("float", "float");
typeMapping.put("long", "long");
typeMapping.put("double", "double");
typeMapping.put("number", "decimal");
typeMapping.put("decimal", "decimal");
typeMapping.put("DateTime", "DateTime");
typeMapping.put("date", "DateTime");
typeMapping.put("file", "System.IO.Stream");
typeMapping.put("array", "List");
typeMapping.put("list", "List");
typeMapping.put("map", "Dictionary");
typeMapping.put("object", "Object");
typeMapping.put("UUID", "Guid");
typeMapping.put("URI", "string");
typeMapping.put("AnyType", "Object");
setSupportNullable(Boolean.TRUE);
hideGenerationTimestamp = Boolean.TRUE;
supportsInheritance = true;
@@ -324,6 +301,60 @@ public class CSharpReducedClientCodegen extends AbstractCSharpCodegen {
setLibrary(RESTSHARP);
}
@Deprecated
@Override
protected Set<String> getNullableTypes() {
return new HashSet<>(Arrays.asList("decimal", "bool", "int", "uint", "long", "ulong", "float", "double",
"DateTime", "DateTimeOffset", "Guid"));
}
@Override
protected Set<String> getValueTypes() {
return new HashSet<>(Arrays.asList("decimal", "bool", "int", "uint", "long", "ulong", "float", "double"));
}
@Override
protected void setTypeMapping() {
super.setTypeMapping();
// mapped non-nullable type without ?
typeMapping = new HashMap<String, String>();
typeMapping.put("string", "string");
typeMapping.put("binary", "byte[]");
typeMapping.put("ByteArray", "byte[]");
typeMapping.put("boolean", "bool");
typeMapping.put("integer", "int");
typeMapping.put("float", "float");
typeMapping.put("long", "long");
typeMapping.put("double", "double");
typeMapping.put("number", "decimal");
typeMapping.put("decimal", "decimal");
typeMapping.put("DateTime", "DateTime");
typeMapping.put("date", "DateTime");
typeMapping.put("file", "System.IO.Stream");
typeMapping.put("array", "List");
typeMapping.put("list", "List");
typeMapping.put("map", "Dictionary");
typeMapping.put("object", "Object");
typeMapping.put("UUID", "Guid");
typeMapping.put("URI", "string");
typeMapping.put("AnyType", "Object");
if (HTTPCLIENT.equals(getLibrary())) {
typeMapping.put("file", "FileParameter");
}
}
@Override
protected void updateCodegenParametersEnum(List<CodegenParameter> parameters, List<ModelMap> allModels) {
super.updateCodegenParametersEnum(parameters, allModels);
for (CodegenParameter parameter : parameters) {
if (!parameter.required && parameter.vendorExtensions.get("x-csharp-value-type") != null) { //optional
parameter.dataType = parameter.dataType + "?";
}
}
}
@Override
public String apiDocFileFolder() {
return (outputFolder + "/" + apiDocPath).replace('/', File.separatorChar);
@@ -431,7 +462,7 @@ public class CSharpReducedClientCodegen extends AbstractCSharpCodegen {
@Override
public String getNullableType(Schema p, String type) {
if (languageSpecificPrimitives.contains(type)) {
if (isSupportNullable() && ModelUtils.isNullable(p) && nullableType.contains(type)) {
if (isSupportNullable() && ModelUtils.isNullable(p) && this.getNullableTypes().contains(type)) {
return type + "?";
} else {
return type;
@@ -476,6 +507,11 @@ public class CSharpReducedClientCodegen extends AbstractCSharpCodegen {
public void postProcessParameter(CodegenParameter parameter) {
postProcessPattern(parameter.pattern, parameter.vendorExtensions);
postProcessEmitDefaultValue(parameter.vendorExtensions);
if (!parameter.dataType.endsWith("?") && !parameter.required && (nullReferenceTypesFlag || this.getNullableTypes().contains(parameter.dataType))) {
parameter.dataType = parameter.dataType + "?";
}
super.postProcessParameter(parameter);
}
@@ -674,7 +710,6 @@ public class CSharpReducedClientCodegen extends AbstractCSharpCodegen {
if (HTTPCLIENT.equals(getLibrary())) {
supportingFiles.add(new SupportingFile("FileParameter.mustache", clientPackageDir, "FileParameter.cs"));
typeMapping.put("file", "FileParameter");
}
supportingFiles.add(new SupportingFile("IApiAccessor.mustache", clientPackageDir, "IApiAccessor.cs"));
@@ -725,6 +760,8 @@ public class CSharpReducedClientCodegen extends AbstractCSharpCodegen {
additionalProperties.put("apiDocPath", apiDocPath);
additionalProperties.put("modelDocPath", modelDocPath);
this.setTypeMapping();
}
public void setNetStandard(Boolean netStandard) {

View File

@@ -52,6 +52,7 @@ public class CSharpClientCodegenTest {
Schema test1 = openAPI.getComponents().getSchemas().get("format_test");
codegen.setOpenAPI(openAPI);
codegen.processOpts();
CodegenModel cm1 = codegen.fromModel("format_test", test1);
Assert.assertEquals(cm1.getClassname(), "FormatTest");

View File

@@ -54,6 +54,7 @@ public class CSharpModelTest {
final OpenAPI openAPI = TestUtils.parseFlattenSpec("src/test/resources/" + openApiVersion + "_0/petstore-with-fake-endpoints-models-for-testing-with-http-signature.yaml");
codegen.setNullableReferenceTypes(nullableReferenceTypes);
codegen.setOpenAPI(openAPI);
codegen.processOpts();
Schema schema = openAPI.getComponents().getSchemas().get("Enum_Test");
final CodegenModel generated = codegen.fromModel("OuterEnum", schema);
@@ -68,6 +69,7 @@ public class CSharpModelTest {
final DefaultCodegen codegen = new CSharpClientCodegen();
OpenAPI openAPI = TestUtils.createOpenAPIWithOneSchema("sample", schema);
codegen.setOpenAPI(openAPI);
codegen.processOpts();
final CodegenModel generated = codegen.fromModel("sample", schema);
Assert.assertEquals(generated.name, "sample");
@@ -93,10 +95,11 @@ public class CSharpModelTest {
final Schema schema = getArrayTestSchema();
final CSharpClientCodegen codegen = new CSharpClientCodegen();
codegen.setUseCollection(true);
OpenAPI openAPI = TestUtils.createOpenAPIWithOneSchema("sample", schema);
codegen.setOpenAPI(openAPI);
codegen.processOpts();
codegen.setUseCollection(true);
final CodegenModel generated = codegen.fromModel("sample", schema);
Assert.assertEquals(generated.name, "sample");
@@ -118,11 +121,13 @@ public class CSharpModelTest {
final Schema schema = getArrayTestSchema();
final CSharpClientCodegen codegen = new CSharpClientCodegen();
codegen.setUseCollection(true);
codegen.setReturnICollection(true);
OpenAPI openAPI = TestUtils.createOpenAPIWithOneSchema("sample", schema);
codegen.setOpenAPI(openAPI);
codegen.processOpts();
codegen.setUseCollection(true);
codegen.setReturnICollection(true);
final CodegenModel generated = codegen.fromModel("sample", schema);
Assert.assertEquals(generated.name, "sample");
@@ -161,6 +166,7 @@ public class CSharpModelTest {
final DefaultCodegen codegen = new CSharpClientCodegen();
OpenAPI openAPI = TestUtils.createOpenAPIWithOneSchema("sample", model);
codegen.setOpenAPI(openAPI);
codegen.processOpts();
final CodegenModel cm = codegen.fromModel("sample", model);
Assert.assertEquals(cm.name, "sample");
@@ -207,6 +213,7 @@ public class CSharpModelTest {
final DefaultCodegen codegen = new CSharpClientCodegen();
OpenAPI openAPI = TestUtils.createOpenAPIWithOneSchema("sample", model);
codegen.setOpenAPI(openAPI);
codegen.processOpts();
final CodegenModel cm = codegen.fromModel("sample", model);
Assert.assertEquals(cm.name, "sample");
@@ -256,6 +263,7 @@ public class CSharpModelTest {
final DefaultCodegen codegen = new CSharpClientCodegen();
OpenAPI openAPI = TestUtils.createOpenAPIWithOneSchema("sample", model);
codegen.setOpenAPI(openAPI);
codegen.processOpts();
final CodegenModel cm = codegen.fromModel("sample", model);
Assert.assertEquals(cm.name, "sample");
@@ -306,6 +314,7 @@ public class CSharpModelTest {
final DefaultCodegen codegen = new AspNetServerCodegen();
OpenAPI openAPI = TestUtils.createOpenAPIWithOneSchema("sample", model);
codegen.setOpenAPI(openAPI);
codegen.processOpts();
final CodegenModel cm = codegen.fromModel("sample", model);
Assert.assertEquals(cm.name, "sample");
@@ -363,10 +372,11 @@ public class CSharpModelTest {
.addProperties("subObject", new Schema().addProperties("name", new StringSchema()).nullable(true))
.addRequiredItem("id");
final DefaultCodegen codegen = new AspNetServerCodegen();
codegen.additionalProperties().put(CodegenConstants.NULLABLE_REFERENCE_TYPES, true);
codegen.processOpts();
codegen.additionalProperties().put(CodegenConstants.NULLABLE_REFERENCE_TYPES, true);
OpenAPI openAPI = TestUtils.createOpenAPIWithOneSchema("sample", model);
codegen.setOpenAPI(openAPI);
codegen.processOpts();
final CodegenModel cm = codegen.fromModel("sample", model);
Assert.assertEquals(cm.name, "sample");
@@ -424,6 +434,7 @@ public class CSharpModelTest {
final DefaultCodegen codegen = new CSharpClientCodegen();
OpenAPI openAPI = TestUtils.createOpenAPIWithOneSchema("sample", model);
codegen.setOpenAPI(openAPI);
codegen.processOpts();
final CodegenModel cm = codegen.fromModel("sample", model);
Assert.assertEquals(cm.name, "sample");
@@ -462,6 +473,7 @@ public class CSharpModelTest {
final DefaultCodegen codegen = new CSharpClientCodegen();
OpenAPI openAPI = TestUtils.createOpenAPIWithOneSchema("sample", schema);
codegen.setOpenAPI(openAPI);
codegen.processOpts();
final CodegenModel cm = codegen.fromModel("sample", schema);
Assert.assertEquals(cm.name, "sample");
@@ -488,6 +500,7 @@ public class CSharpModelTest {
final DefaultCodegen codegen = new CSharpClientCodegen();
OpenAPI openAPI = TestUtils.createOpenAPIWithOneSchema("sample", schema);
codegen.setOpenAPI(openAPI);
codegen.processOpts();
final CodegenModel cm = codegen.fromModel("sample", schema);
Assert.assertEquals(cm.name, "sample");
@@ -512,6 +525,7 @@ public class CSharpModelTest {
.items(new Schema().$ref("#/components/schemas/Children")));
final DefaultCodegen codegen = new CSharpClientCodegen();
codegen.setOpenAPI(openAPI);
codegen.processOpts();
final CodegenModel cm = codegen.fromModel("sample", schema);
Assert.assertEquals(cm.name, "sample");
@@ -539,6 +553,7 @@ public class CSharpModelTest {
final DefaultCodegen codegen = new CSharpClientCodegen();
OpenAPI openAPI = TestUtils.createOpenAPIWithOneSchema("sample", schema);
codegen.setOpenAPI(openAPI);
codegen.processOpts();
final CodegenModel cm = codegen.fromModel("sample", schema);
Assert.assertEquals(cm.name, "sample");
@@ -566,6 +581,7 @@ public class CSharpModelTest {
final DefaultCodegen codegen = new CSharpClientCodegen();
OpenAPI openAPI = TestUtils.createOpenAPIWithOneSchema("sample", schema);
codegen.setOpenAPI(openAPI);
codegen.processOpts();
final CodegenModel cm = codegen.fromModel("sample", schema);
Assert.assertEquals(cm.name, "sample");
@@ -585,6 +601,7 @@ public class CSharpModelTest {
final DefaultCodegen codegen = new CSharpClientCodegen();
OpenAPI openAPI = TestUtils.createOpenAPIWithOneSchema("sample", schema);
codegen.setOpenAPI(openAPI);
codegen.processOpts();
final CodegenModel cm = codegen.fromModel("sample", schema);
Assert.assertEquals(cm.name, "sample");

View File

@@ -46,6 +46,7 @@ public class CSharpOperationTest {
public String getOperationOptionalParameterDataType(final AbstractCSharpCodegen codegen, final int openApiVersion, final Boolean nullableReferenceTypes){
final OpenAPI openAPI = TestUtils.parseFlattenSpec("src/test/resources/" + openApiVersion + "_0/petstore-with-fake-endpoints-models-for-testing.yaml");
codegen.processOpts();
codegen.setNullableReferenceTypes(nullableReferenceTypes);
codegen.setOpenAPI(openAPI);