@@ -19,8 +19,14 @@ package org.ktorm.ksp.compiler.parser
1919import com.google.devtools.ksp.*
2020import com.google.devtools.ksp.processing.Resolver
2121import com.google.devtools.ksp.processing.SymbolProcessorEnvironment
22- import com.google.devtools.ksp.symbol.*
2322import com.google.devtools.ksp.symbol.ClassKind.*
23+ import com.google.devtools.ksp.symbol.KSClassDeclaration
24+ import com.google.devtools.ksp.symbol.KSPropertyDeclaration
25+ import com.google.devtools.ksp.symbol.KSType
26+ import com.squareup.kotlinpoet.ClassName
27+ import com.squareup.kotlinpoet.asClassName
28+ import com.squareup.kotlinpoet.ksp.KotlinPoetKspPreview
29+ import com.squareup.kotlinpoet.ksp.toClassName
2430import org.ktorm.entity.Entity
2531import org.ktorm.ksp.annotation.*
2632import org.ktorm.ksp.compiler.util.*
@@ -32,6 +38,7 @@ import org.ktorm.schema.BaseTable
3238import org.ktorm.schema.TypeReference
3339import java.lang.reflect.InvocationTargetException
3440import java.util.*
41+ import kotlin.reflect.KClass
3542import kotlin.reflect.jvm.jvmName
3643
3744@OptIn(KspExperimental ::class )
@@ -94,8 +101,19 @@ internal class MetadataParser(resolver: Resolver, environment: SymbolProcessorEn
94101
95102 _logger .info(" [ktorm-ksp-compiler] parse table metadata from entity: $className " )
96103 val table = cls.getAnnotationsByType(Table ::class ).first()
97- val superClass = table.superClass.takeIf { it != Nothing ::class }
98- ? : if (cls.classKind == INTERFACE ) org.ktorm.schema.Table ::class else BaseTable ::class
104+
105+ // due to the BUG of KSP, we cannot use `table.superClass` directly, so we use `parseAnnotationClassParameter` to get the value
106+ // https://github.com/google/ksp/issues/1038
107+ // TODO: remove the workaround after the bug is fixed
108+ val annotationSuperClass = parseAnnotationClassParameter(table)
109+ val superClass = if (annotationSuperClass != Nothing ::class .asClassName()) {
110+ annotationSuperClass
111+ } else if (cls.classKind == INTERFACE ) {
112+ org.ktorm.schema.Table ::class .asClassName()
113+ }else {
114+ BaseTable ::class .asClassName()
115+ }
116+
99117
100118 val tableMetadata = TableMetadata (
101119 entityClass = cls,
@@ -107,7 +125,7 @@ internal class MetadataParser(resolver: Resolver, environment: SymbolProcessorEn
107125 entitySequenceName = table.entitySequenceName.ifEmpty { _codingNamingStrategy .getEntitySequenceName(cls) },
108126 ignoreProperties = table.ignoreProperties.toSet(),
109127 columns = ArrayList (),
110- superClass = superClass
128+ superClassName = superClass
111129 )
112130
113131 val columns = tableMetadata.columns as MutableList
@@ -301,4 +319,17 @@ internal class MetadataParser(resolver: Resolver, environment: SymbolProcessorEn
301319
302320 stack.pop()
303321 }
322+
323+ @OptIn(KspExperimental ::class , KotlinPoetKspPreview ::class )
324+ private fun parseAnnotationClassParameter (table : Table ): ClassName {
325+ return try {
326+ ClassName (table.superClass.java.`package`.name, table.superClass.simpleName.orEmpty())
327+ } catch (e: KSTypeNotPresentException ) {
328+ if (e.ksType.declaration is KSClassDeclaration ){
329+ return (e.ksType.declaration as KSClassDeclaration ).toClassName()
330+ }else {
331+ throw e
332+ }
333+ }
334+ }
304335}
0 commit comments