diff --git a/docs/generators/kotlin-server.md b/docs/generators/kotlin-server.md index f474fbc7415..58852a97ccf 100644 --- a/docs/generators/kotlin-server.md +++ b/docs/generators/kotlin-server.md @@ -47,7 +47,7 @@ These options may be applied as additional-properties (cli) or configOptions (pl | Type/Alias | Instantiated By | | ---------- | --------------- | -|array|kotlin.Array| +|array|kotlin.collections.ArrayList| |list|kotlin.collections.ArrayList| |map|kotlin.collections.HashMap| diff --git a/docs/generators/kotlin-spring.md b/docs/generators/kotlin-spring.md index 4a0353d7899..3c62035e71e 100644 --- a/docs/generators/kotlin-spring.md +++ b/docs/generators/kotlin-spring.md @@ -57,7 +57,7 @@ These options may be applied as additional-properties (cli) or configOptions (pl | Type/Alias | Instantiated By | | ---------- | --------------- | -|array|kotlin.Array| +|array|kotlin.collections.ArrayList| |list|kotlin.collections.ArrayList| |map|kotlin.collections.HashMap| diff --git a/docs/generators/kotlin-vertx.md b/docs/generators/kotlin-vertx.md index cb0dbfe41cc..56539f00d46 100644 --- a/docs/generators/kotlin-vertx.md +++ b/docs/generators/kotlin-vertx.md @@ -41,7 +41,7 @@ These options may be applied as additional-properties (cli) or configOptions (pl | Type/Alias | Instantiated By | | ---------- | --------------- | -|array|kotlin.Array| +|array|kotlin.collections.ArrayList| |list|kotlin.collections.ArrayList| |map|kotlin.collections.HashMap| diff --git a/docs/generators/kotlin.md b/docs/generators/kotlin.md index e37648a9d6a..cdf4968400b 100644 --- a/docs/generators/kotlin.md +++ b/docs/generators/kotlin.md @@ -49,7 +49,7 @@ These options may be applied as additional-properties (cli) or configOptions (pl | Type/Alias | Instantiated By | | ---------- | --------------- | -|array|kotlin.Array| +|array|kotlin.collections.ArrayList| |list|kotlin.collections.ArrayList| |map|kotlin.collections.HashMap| diff --git a/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/AbstractKotlinCodegen.java b/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/AbstractKotlinCodegen.java index a8e8f24feb4..3fc32ec10fb 100644 --- a/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/AbstractKotlinCodegen.java +++ b/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/AbstractKotlinCodegen.java @@ -19,6 +19,7 @@ package org.openapitools.codegen.languages; import io.swagger.v3.oas.models.media.ArraySchema; import io.swagger.v3.oas.models.media.Schema; +import io.swagger.v3.oas.models.media.StringSchema; import org.apache.commons.io.FilenameUtils; import org.apache.commons.lang3.StringUtils; import org.openapitools.codegen.CliOption; @@ -163,7 +164,7 @@ public abstract class AbstractKotlinCodegen extends DefaultCodegen implements Co typeMapping.put("Date", "java.time.LocalDate"); typeMapping.put("DateTime", "java.time.LocalDateTime"); - instantiationTypes.put("array", "kotlin.Array"); + instantiationTypes.put("array", "kotlin.collections.ArrayList"); instantiationTypes.put("list", "kotlin.collections.ArrayList"); instantiationTypes.put("map", "kotlin.collections.HashMap"); @@ -308,15 +309,23 @@ public abstract class AbstractKotlinCodegen extends DefaultCodegen implements Co */ @Override public String getTypeDeclaration(Schema p) { - if (ModelUtils.isArraySchema(p)) { - return getArrayTypeDeclaration((ArraySchema) p); - } else if (ModelUtils.isMapSchema(p)) { - Schema inner = getAdditionalProperties(p); - - // Maps will be keyed only by primitive Kotlin string - return getSchemaType(p) + ""; + Schema schema = ModelUtils.unaliasSchema(this.openAPI, p, importMapping); + Schema target = ModelUtils.isGenerateAliasAsModel() ? p : schema; + if (ModelUtils.isArraySchema(target)) { + Schema items = getSchemaItems((ArraySchema) schema); + return getSchemaType(target) + "<" + getTypeDeclaration(items) + ">"; + } else if (ModelUtils.isMapSchema(target)) { + // Note: ModelUtils.isMapSchema(p) returns true when p is a composed schema that also defines + // additionalproperties: true + Schema inner = getAdditionalProperties(target); + if (inner == null) { + LOGGER.error("`{}` (map property) does not have a proper inner type defined. Default to type:string", p.getName()); + inner = new StringSchema().description("TODO default missing map inner type to string"); + p.setAdditionalProperties(inner); + } + return getSchemaType(target) + ""; } - return super.getTypeDeclaration(p); + return super.getTypeDeclaration(target); } @Override @@ -548,14 +557,6 @@ public abstract class AbstractKotlinCodegen extends DefaultCodegen implements Co return sanitizeKotlinSpecificNames(modified); } - @Override - public String toInstantiationType(Schema p) { - if (ModelUtils.isArraySchema(p)) { - return getArrayTypeDeclaration((ArraySchema) p); - } - return super.toInstantiationType(p); - } - @Override public String toApiName(String name) { if (name.length() == 0) { @@ -671,30 +672,6 @@ public abstract class AbstractKotlinCodegen extends DefaultCodegen implements Co return toModelName(name); } - /** - * Provides a strongly typed declaration for simple arrays of some type and arrays of arrays of some type. - * - * @param arr Array schema - * @return type declaration of array - */ - private String getArrayTypeDeclaration(ArraySchema arr) { - // TODO: collection type here should be fully qualified namespace to avoid model conflicts - // This supports arrays of arrays. - String arrayType; - if (ModelUtils.isSet(arr)) { - arrayType = typeMapping.get("set"); - } else { - arrayType = typeMapping.get("array"); - } - StringBuilder instantiationType = new StringBuilder(arrayType); - Schema items = arr.getItems(); - String nestedType = getTypeDeclaration(items); - additionalProperties.put("nestedType", nestedType); - // TODO: We may want to differentiate here between generics and primitive arrays. - instantiationType.append("<").append(nestedType).append(">"); - return instantiationType.toString(); - } - /** * Sanitize against Kotlin specific naming conventions, which may differ from those required by {@link DefaultCodegen#sanitizeName}. * diff --git a/modules/openapi-generator/src/main/resources/kotlin-spring/dataClass.mustache b/modules/openapi-generator/src/main/resources/kotlin-spring/dataClass.mustache index a06f6689bba..38281765a4d 100644 --- a/modules/openapi-generator/src/main/resources/kotlin-spring/dataClass.mustache +++ b/modules/openapi-generator/src/main/resources/kotlin-spring/dataClass.mustache @@ -5,13 +5,13 @@ {{/vars}} */{{#discriminator}} {{>typeInfoAnnotation}}{{/discriminator}} -{{#discriminator}}interface {{classname}}{{/discriminator}}{{^discriminator}}data class {{classname}}( +{{#discriminator}}interface {{classname}}{{/discriminator}}{{^discriminator}}{{#hasVars}}data {{/hasVars}}class {{classname}}( {{#requiredVars}} {{>dataClassReqVar}}{{^-last}}, {{/-last}}{{/requiredVars}}{{#hasRequired}}{{#hasOptional}}, {{/hasOptional}}{{/hasRequired}}{{#optionalVars}}{{>dataClassOptVar}}{{^-last}}, {{/-last}}{{/optionalVars}} -) {{/discriminator}}{{#parent}}: {{{parent}}}{{/parent}}{ +) {{/discriminator}}{{#parent}}: {{{parent}}}(){{/parent}}{ {{#discriminator}} {{#requiredVars}} {{>interfaceReqVar}} diff --git a/modules/openapi-generator/src/main/resources/kotlin-spring/generatedAnnotation.mustache b/modules/openapi-generator/src/main/resources/kotlin-spring/generatedAnnotation.mustache index 875d7b97afe..6a604a1f7a7 100644 --- a/modules/openapi-generator/src/main/resources/kotlin-spring/generatedAnnotation.mustache +++ b/modules/openapi-generator/src/main/resources/kotlin-spring/generatedAnnotation.mustache @@ -1 +1 @@ -@javax.annotation.Generated(value = "{{generatorClass}}"{{^hideGenerationTimestamp}}, date = "{{generatedDate}}"{{/hideGenerationTimestamp}}) \ No newline at end of file +@javax.annotation.Generated(value = ["{{generatorClass}}"]{{^hideGenerationTimestamp}}, date = "{{generatedDate}}"{{/hideGenerationTimestamp}})