11package com.papsign.ktor.openapigen.schema.builder.provider
22
3- import com.papsign.ktor.openapigen.OpenAPIGen
4- import com.papsign.ktor.openapigen.OpenAPIGenModuleExtension
3+ import com.papsign.ktor.openapigen.*
54import com.papsign.ktor.openapigen.classLogger
6- import com.papsign.ktor.openapigen.getKType
75import com.papsign.ktor.openapigen.model.schema.SchemaModel
86import com.papsign.ktor.openapigen.modules.ModuleProvider
97import com.papsign.ktor.openapigen.modules.ofClass
8+ import com.papsign.ktor.openapigen.schema.builder.FinalSchemaBuilder
109import com.papsign.ktor.openapigen.schema.builder.SchemaBuilder
1110import com.papsign.ktor.openapigen.schema.namer.DefaultSchemaNamer
1211import com.papsign.ktor.openapigen.schema.namer.SchemaNamer
1312import kotlin.reflect.KType
14- import kotlin.reflect.KTypeParameter
1513import kotlin.reflect.KVisibility
16- import kotlin.reflect.full.declaredMemberProperties
17- import kotlin.reflect.full.memberProperties
1814import kotlin.reflect.full.starProjectedType
1915import kotlin.reflect.full.withNullability
2016import kotlin.reflect.jvm.jvmErasure
@@ -37,30 +33,28 @@ object DefaultObjectSchemaProvider : SchemaBuilderProviderModule, OpenAPIGenModu
3733
3834 private val refs = HashMap <KType , SchemaModel .SchemaModelRef <* >>()
3935
40- override fun build (type : KType , builder : SchemaBuilder ): SchemaModel <* > {
36+ override fun build (type : KType , builder : FinalSchemaBuilder ): SchemaModel <* > {
4137 checkType(type)
4238 val nonNullType = type.withNullability(false )
4339 return refs[nonNullType] ? : {
4440 val erasure = nonNullType.jvmErasure
4541 val name = namer[nonNullType]
4642 val ref = SchemaModel .SchemaModelRef <Any ?>(" #/components/schemas/$name " )
4743 refs[nonNullType] = ref // needed to prevent infinite recursion
48- val existing = apiGen.api.components.schemas[name]
4944 val new = if (erasure.isSealed) {
50- SchemaModel .OneSchemaModelOf (erasure.sealedSubclasses.map { builder.build(it.starProjectedType, builder ) })
45+ SchemaModel .OneSchemaModelOf (erasure.sealedSubclasses.map { builder.build(it.starProjectedType) })
5146 } else {
52- val typeParameters = erasure.typeParameters.zip(type.arguments).associate { Pair (it.first.name, it.second.type) }
53- val memberMap = erasure.declaredMemberProperties.filter { it.visibility == KVisibility .PUBLIC }.associateWith {
54- val retType = it.returnType
55- when (val classifier = retType.classifier) {
56- is KTypeParameter -> typeParameters[classifier.name] ? : it.returnType
57- else -> it.returnType
58- }
59- }.mapKeys { (key, _) -> key.name }
60- val required = memberMap.entries.filter { ! it.value.isMarkedNullable }.map { it.key }
61- val memberModels = memberMap.mapValues { (_, value) -> builder.build(value, builder) }
62- SchemaModel .SchemaModelObj <Any ?>(memberModels, required)
47+ val props = type.memberProperties.filter { it.source.visibility == KVisibility .PUBLIC }
48+ SchemaModel .SchemaModelObj <Any ?>(
49+ props.associate {
50+ Pair (it.name, builder.build(it.type, it.source.annotations))
51+ },
52+ props.filter {
53+ ! it.type.isMarkedNullable
54+ }.map { it.name }
55+ )
6356 }
57+ val existing = apiGen.api.components.schemas[name]
6458 if (existing != null && existing != new) log.error(" Schema with name $name already exists, and is not the same as the new one, replacing..." )
6559 apiGen.api.components.schemas[name] = new
6660 ref
0 commit comments