From 894008e16374ea8de9ba6bb4574c2a597a9a74d6 Mon Sep 17 00:00:00 2001 From: Mattias-Sehlstedt <60173714+Mattias-Sehlstedt@users.noreply.github.com> Date: Sun, 17 May 2026 21:37:40 +0200 Subject: [PATCH] fix(kotlin-multiplatform) inline enum toString uses enum value instead of constant --- .../kotlin-client/data_class.mustache | 3 ++ .../libraries/multiplatform/api.mustache | 1 + .../kotlin/KotlinClientCodegenModelTest.java | 33 +++++++++++++++++++ .../org/openapitools/client/apis/PetApi.kt | 1 + .../org/openapitools/client/models/Order.kt | 1 + .../org/openapitools/client/models/Pet.kt | 1 + .../org/openapitools/client/apis/PetApi.kt | 1 + .../org/openapitools/client/models/Order.kt | 1 + .../org/openapitools/client/models/Pet.kt | 1 + 9 files changed, 43 insertions(+) diff --git a/modules/openapi-generator/src/main/resources/kotlin-client/data_class.mustache b/modules/openapi-generator/src/main/resources/kotlin-client/data_class.mustache index 2679b6f48881..119414e7c6bc 100644 --- a/modules/openapi-generator/src/main/resources/kotlin-client/data_class.mustache +++ b/modules/openapi-generator/src/main/resources/kotlin-client/data_class.mustache @@ -176,6 +176,9 @@ import {{packageName}}.infrastructure.ITransformForStorage {{/multiplatform}} {{/enumVars}} {{/allowableValues}} + {{#multiplatform}} + override fun toString(): kotlin.String = value{{^isString}}.toString(){{/isString}} + {{/multiplatform}} } {{#kotlinx_serialization}} {{#enumUnknownDefaultCase}} diff --git a/modules/openapi-generator/src/main/resources/kotlin-client/libraries/multiplatform/api.mustache b/modules/openapi-generator/src/main/resources/kotlin-client/libraries/multiplatform/api.mustache index e6bb2ebd9298..82f266017caf 100644 --- a/modules/openapi-generator/src/main/resources/kotlin-client/libraries/multiplatform/api.mustache +++ b/modules/openapi-generator/src/main/resources/kotlin-client/libraries/multiplatform/api.mustache @@ -47,6 +47,7 @@ import kotlinx.serialization.encoding.* @SerialName(value = {{^isString}}"{{/isString}}{{{value}}}{{^isString}}"{{/isString}}) {{&name}}({{{value}}}){{^-last}},{{/-last}}{{#-last}};{{/-last}} {{/enumVars}}{{/allowableValues}} + override fun toString(): kotlin.String = value{{^isString}}.toString(){{/isString}} } {{/isEnum}} diff --git a/modules/openapi-generator/src/test/java/org/openapitools/codegen/kotlin/KotlinClientCodegenModelTest.java b/modules/openapi-generator/src/test/java/org/openapitools/codegen/kotlin/KotlinClientCodegenModelTest.java index 462d3de1837b..fa2869926168 100644 --- a/modules/openapi-generator/src/test/java/org/openapitools/codegen/kotlin/KotlinClientCodegenModelTest.java +++ b/modules/openapi-generator/src/test/java/org/openapitools/codegen/kotlin/KotlinClientCodegenModelTest.java @@ -1064,6 +1064,39 @@ public void testMultiplatformInlineEnumDropsUnknownDefaultCase() throws IOExcept TestUtils.assertFileContains(apiKt, "ONE(\"1\");"); } + @Test + public void testMultiplatformEnumWithCustomVariableNamesOverridesToString() throws IOException { + File output = Files.createTempDirectory("test").toFile(); + output.deleteOnExit(); + + final CodegenConfigurator configurator = new CodegenConfigurator() + .setGeneratorName(KOTLIN_GENERATOR) + .setLibrary("multiplatform") + .setAdditionalProperties(new HashMap<>() {{ + put(CodegenConstants.SERIALIZATION_LIBRARY, "jackson"); + put(CodegenConstants.MODEL_PACKAGE, "model"); + put("dateLibrary", "kotlinx-datetime"); + }}) + .setInputSpec("src/test/resources/3_0/kotlin/multiplatform-inline-query-enum.yaml") + .setOutputDir(output.getAbsolutePath().replace("\\", "/")); + + final ClientOptInput clientOptInput = configurator.toClientOptInput(); + DefaultGenerator generator = new DefaultGenerator(); + + generator.opts(clientOptInput).generate(); + + final Path definedEnumKt = Paths.get(output + "/src/commonMain/kotlin/model/ApiError.kt"); + final Path inlineEnumKt = Paths.get(output + "/src/commonMain/kotlin/model/AllowFoo.kt"); + final Path headerEnumKt = Paths.get(output + "/src/commonMain/kotlin/org/openapitools/client/apis/DefaultApi.kt"); + + TestUtils.assertFileContains(definedEnumKt, "override fun toString(): kotlin.String = value.toString()"); + TestUtils.assertFileContains(definedEnumKt, "@SerialName(value = \"100\") ERROR(100);"); + TestUtils.assertFileContains(inlineEnumKt, "override fun toString(): kotlin.String = value"); + TestUtils.assertFileContains(inlineEnumKt, "ALLOW(\"1\");"); + TestUtils.assertFileContains(headerEnumKt, "override fun toString(): kotlin.String = value"); + TestUtils.assertFileContains(headerEnumKt, "ALLOW(\"1\");"); + } + @Test(description = "convert an empty model to object") public void emptyModelKotlinxSerializationTest() throws IOException { final Schema schema = new ObjectSchema() diff --git a/samples/client/petstore/kotlin-multiplatform-kotlinx-datetime/src/commonMain/kotlin/org/openapitools/client/apis/PetApi.kt b/samples/client/petstore/kotlin-multiplatform-kotlinx-datetime/src/commonMain/kotlin/org/openapitools/client/apis/PetApi.kt index 7532399c01b4..426caf13c53e 100644 --- a/samples/client/petstore/kotlin-multiplatform-kotlinx-datetime/src/commonMain/kotlin/org/openapitools/client/apis/PetApi.kt +++ b/samples/client/petstore/kotlin-multiplatform-kotlinx-datetime/src/commonMain/kotlin/org/openapitools/client/apis/PetApi.kt @@ -137,6 +137,7 @@ open class PetApi : ApiClient { @SerialName(value = "sold") sold("sold"); + override fun toString(): kotlin.String = value.toString() } /** diff --git a/samples/client/petstore/kotlin-multiplatform-kotlinx-datetime/src/commonMain/kotlin/org/openapitools/client/models/Order.kt b/samples/client/petstore/kotlin-multiplatform-kotlinx-datetime/src/commonMain/kotlin/org/openapitools/client/models/Order.kt index 36b2997c7f5a..63604f0bd855 100644 --- a/samples/client/petstore/kotlin-multiplatform-kotlinx-datetime/src/commonMain/kotlin/org/openapitools/client/models/Order.kt +++ b/samples/client/petstore/kotlin-multiplatform-kotlinx-datetime/src/commonMain/kotlin/org/openapitools/client/models/Order.kt @@ -67,6 +67,7 @@ data class Order ( @SerialName(value = "placed") placed("placed"), @SerialName(value = "approved") approved("approved"), @SerialName(value = "delivered") delivered("delivered"); + override fun toString(): kotlin.String = value } } diff --git a/samples/client/petstore/kotlin-multiplatform-kotlinx-datetime/src/commonMain/kotlin/org/openapitools/client/models/Pet.kt b/samples/client/petstore/kotlin-multiplatform-kotlinx-datetime/src/commonMain/kotlin/org/openapitools/client/models/Pet.kt index 3d2dc5408719..c12046564603 100644 --- a/samples/client/petstore/kotlin-multiplatform-kotlinx-datetime/src/commonMain/kotlin/org/openapitools/client/models/Pet.kt +++ b/samples/client/petstore/kotlin-multiplatform-kotlinx-datetime/src/commonMain/kotlin/org/openapitools/client/models/Pet.kt @@ -69,6 +69,7 @@ data class Pet ( @SerialName(value = "available") available("available"), @SerialName(value = "pending") pending("pending"), @SerialName(value = "sold") sold("sold"); + override fun toString(): kotlin.String = value } } diff --git a/samples/client/petstore/kotlin-multiplatform/src/commonMain/kotlin/org/openapitools/client/apis/PetApi.kt b/samples/client/petstore/kotlin-multiplatform/src/commonMain/kotlin/org/openapitools/client/apis/PetApi.kt index 7532399c01b4..426caf13c53e 100644 --- a/samples/client/petstore/kotlin-multiplatform/src/commonMain/kotlin/org/openapitools/client/apis/PetApi.kt +++ b/samples/client/petstore/kotlin-multiplatform/src/commonMain/kotlin/org/openapitools/client/apis/PetApi.kt @@ -137,6 +137,7 @@ open class PetApi : ApiClient { @SerialName(value = "sold") sold("sold"); + override fun toString(): kotlin.String = value.toString() } /** diff --git a/samples/client/petstore/kotlin-multiplatform/src/commonMain/kotlin/org/openapitools/client/models/Order.kt b/samples/client/petstore/kotlin-multiplatform/src/commonMain/kotlin/org/openapitools/client/models/Order.kt index 36b2997c7f5a..63604f0bd855 100644 --- a/samples/client/petstore/kotlin-multiplatform/src/commonMain/kotlin/org/openapitools/client/models/Order.kt +++ b/samples/client/petstore/kotlin-multiplatform/src/commonMain/kotlin/org/openapitools/client/models/Order.kt @@ -67,6 +67,7 @@ data class Order ( @SerialName(value = "placed") placed("placed"), @SerialName(value = "approved") approved("approved"), @SerialName(value = "delivered") delivered("delivered"); + override fun toString(): kotlin.String = value } } diff --git a/samples/client/petstore/kotlin-multiplatform/src/commonMain/kotlin/org/openapitools/client/models/Pet.kt b/samples/client/petstore/kotlin-multiplatform/src/commonMain/kotlin/org/openapitools/client/models/Pet.kt index 3d2dc5408719..c12046564603 100644 --- a/samples/client/petstore/kotlin-multiplatform/src/commonMain/kotlin/org/openapitools/client/models/Pet.kt +++ b/samples/client/petstore/kotlin-multiplatform/src/commonMain/kotlin/org/openapitools/client/models/Pet.kt @@ -69,6 +69,7 @@ data class Pet ( @SerialName(value = "available") available("available"), @SerialName(value = "pending") pending("pending"), @SerialName(value = "sold") sold("sold"); + override fun toString(): kotlin.String = value } }