diff --git a/e2e/binance/src/test/kotlin/BinanceTest.kt b/e2e/binance/src/test/kotlin/BinanceTest.kt index 5541dfb..ad1b24c 100644 --- a/e2e/binance/src/test/kotlin/BinanceTest.kt +++ b/e2e/binance/src/test/kotlin/BinanceTest.kt @@ -1,7 +1,6 @@ import binance.client.HttpResult import binance.client.api.v3.V3Client import binance.models.paths.api.v3.avgPrice.get.response.GetApiV3AvgPriceResponse400 -import binance.models.paths.api.v3.klines.get.parameters.i1.`1` import binance.models.paths.api.v3.klines.get.parameters.i1.Interval import io.ktor.client.engine.cio.* import io.ktor.client.engine.mock.* diff --git a/e2e/polymorphism/src/test/kotlin/ClientTest.kt b/e2e/polymorphism/src/test/kotlin/ClientTest.kt index 586e8f9..4e17fbe 100644 --- a/e2e/polymorphism/src/test/kotlin/ClientTest.kt +++ b/e2e/polymorphism/src/test/kotlin/ClientTest.kt @@ -5,7 +5,6 @@ import com.denisbrandi.netmock.engine.NetMockEngine import kotlinx.coroutines.test.runTest import sample.client.Client import sample.models.components.parameters.UserType -import sample.models.components.parameters.UserTypeParam import sample.models.components.schemas.AdminUser.AdminUser import sample.models.paths.users.get.response.GetUsersResponse200 import kotlin.test.Test diff --git a/e2e/polymorphism/src/test/resources/sample.yaml b/e2e/polymorphism/src/test/resources/sample.yaml index 405e390..b0715aa 100644 --- a/e2e/polymorphism/src/test/resources/sample.yaml +++ b/e2e/polymorphism/src/test/resources/sample.yaml @@ -48,6 +48,19 @@ components: enum: - value1 - value2 + Companion: + properties: + intId: + type: integer + description: + type: string + + CompanionList: + properties: + companions: + type: array + items: + "$ref": '#/components/schemas/Companion' User: nullable: true description: Normal user diff --git a/gradle-plugin/processor/src/main/kotlin/com/dshatz/openapi2ktor/generators/TypeStore.kt b/gradle-plugin/processor/src/main/kotlin/com/dshatz/openapi2ktor/generators/TypeStore.kt index 07c6327..1c0761d 100644 --- a/gradle-plugin/processor/src/main/kotlin/com/dshatz/openapi2ktor/generators/TypeStore.kt +++ b/gradle-plugin/processor/src/main/kotlin/com/dshatz/openapi2ktor/generators/TypeStore.kt @@ -1,5 +1,6 @@ package com.dshatz.openapi2ktor.generators +import com.dshatz.openapi2ktor.generators.Type.Companion.simpleType import com.dshatz.openapi2ktor.utils.* import com.squareup.kotlinpoet.ClassName import com.squareup.kotlinpoet.ParameterizedTypeName.Companion.parameterizedBy @@ -98,12 +99,14 @@ class TypeStore { } } - fun T.makeTypeName(): TypeName { - return when (this) { - is Type.WithTypeName -> typeName as ClassName - is Type.Reference -> resolveReference(jsonReference).makeTypeName() - is Type.List -> List::class.asTypeName().parameterizedBy(itemsType.makeTypeName()) - is Type.SimpleType -> this.kotlinType + fun T.makeTypeName(): TypeName = with (ReservedKeywords) { + escapeKeywords().run { + return when (this) { + is Type.WithTypeName -> typeName as ClassName + is Type.Reference -> resolveReference(jsonReference).makeTypeName() + is Type.List -> List::class.asTypeName().parameterizedBy(itemsType.makeTypeName()) + is Type.SimpleType -> this.kotlinType + } } } @@ -220,4 +223,13 @@ class TypeStore { return sb.toString() } -} \ No newline at end of file +} + +object ReservedKeywords { + private val reservedKeywords = setOf("Companion") + fun Type.escapeKeywords(): Type { + return if (this is Type.WithTypeName && this.simpleName() in reservedKeywords) { + this.withTypeName(this.typeName.updateSimpleName { it + "_" }) + } else this + } +} diff --git a/gradle-plugin/processor/src/main/kotlin/com/dshatz/openapi2ktor/generators/models/KotlinxCodeGenerator.kt b/gradle-plugin/processor/src/main/kotlin/com/dshatz/openapi2ktor/generators/models/KotlinxCodeGenerator.kt index c44e67a..5e2f3f6 100644 --- a/gradle-plugin/processor/src/main/kotlin/com/dshatz/openapi2ktor/generators/models/KotlinxCodeGenerator.kt +++ b/gradle-plugin/processor/src/main/kotlin/com/dshatz/openapi2ktor/generators/models/KotlinxCodeGenerator.kt @@ -1,6 +1,7 @@ package com.dshatz.openapi2ktor.generators.models import com.dshatz.openapi2ktor.GeneratorConfig +import com.dshatz.openapi2ktor.generators.ReservedKeywords import com.dshatz.openapi2ktor.generators.Type import com.dshatz.openapi2ktor.generators.TypeStore import com.dshatz.openapi2ktor.utils.* @@ -131,7 +132,7 @@ class KotlinxCodeGenerator(override val typeStore: TypeStore, private val packag val typeToSuperInterfaces = interfaceMappingForOneOf(typeStore) .mapKeys { it.key.makeTypeName() } return typeStore.getTypes().values.filterIsInstance().map { type -> - val className = type.typeName as ClassName + val className = with (ReservedKeywords) { type.escapeKeywords().makeTypeName() as ClassName } val fileSpec = FileSpec.builder(className) val interfacesForOneOf = typeToSuperInterfaces[type.typeName] @@ -382,9 +383,11 @@ class KotlinxCodeGenerator(override val typeStore: TypeStore, private val packag val prop = PropertySpec.builder(name, finalType) .apply { + // Add kdoc if (propInfo.doc != null) { addKdoc(propInfo.doc.toCodeBlock(::findConcreteType)) } + // Add serializable annotation. From a non-null type. val simpleTypeOrNull = (actualType as? Type.SimpleType)?.kotlinType?.copy(nullable = false) if (simpleTypeOrNull != null && isDate(simpleTypeOrNull)) { addAnnotation(AnnotationSpec.builder(Serializable::class.asClassName()).addMember(CodeBlock.of("%T::class", dateSerializers[simpleTypeOrNull]!!)).build())