@@ -19,8 +19,14 @@ package org.ktorm.ksp.compiler.parser
19
19
import com.google.devtools.ksp.*
20
20
import com.google.devtools.ksp.processing.Resolver
21
21
import com.google.devtools.ksp.processing.SymbolProcessorEnvironment
22
- import com.google.devtools.ksp.symbol.*
23
22
import 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
24
30
import org.ktorm.entity.Entity
25
31
import org.ktorm.ksp.annotation.*
26
32
import org.ktorm.ksp.compiler.util.*
@@ -32,6 +38,7 @@ import org.ktorm.schema.BaseTable
32
38
import org.ktorm.schema.TypeReference
33
39
import java.lang.reflect.InvocationTargetException
34
40
import java.util.*
41
+ import kotlin.reflect.KClass
35
42
import kotlin.reflect.jvm.jvmName
36
43
37
44
@OptIn(KspExperimental ::class )
@@ -94,8 +101,19 @@ internal class MetadataParser(resolver: Resolver, environment: SymbolProcessorEn
94
101
95
102
_logger .info(" [ktorm-ksp-compiler] parse table metadata from entity: $className " )
96
103
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
+
99
117
100
118
val tableMetadata = TableMetadata (
101
119
entityClass = cls,
@@ -107,7 +125,7 @@ internal class MetadataParser(resolver: Resolver, environment: SymbolProcessorEn
107
125
entitySequenceName = table.entitySequenceName.ifEmpty { _codingNamingStrategy .getEntitySequenceName(cls) },
108
126
ignoreProperties = table.ignoreProperties.toSet(),
109
127
columns = ArrayList (),
110
- superClass = superClass
128
+ superClassName = superClass
111
129
)
112
130
113
131
val columns = tableMetadata.columns as MutableList
@@ -301,4 +319,17 @@ internal class MetadataParser(resolver: Resolver, environment: SymbolProcessorEn
301
319
302
320
stack.pop()
303
321
}
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
+ }
304
335
}
0 commit comments