Skip to content

Commit 513f06d

Browse files
committed
workaround for the issue #1038 of ksp
temp
1 parent 3322a32 commit 513f06d

File tree

3 files changed

+38
-7
lines changed

3 files changed

+38
-7
lines changed

ktorm-ksp-compiler/src/main/kotlin/org/ktorm/ksp/compiler/generator/TableClassGenerator.kt

+1-1
Original file line numberDiff line numberDiff line change
@@ -47,7 +47,7 @@ internal object TableClassGenerator {
4747
}
4848

4949
private fun TypeSpec.Builder.configureSuperClass(table: TableMetadata): TypeSpec.Builder {
50-
superclass(table.superClass.asClassName().parameterizedBy(table.entityClass.toClassName()))
50+
superclass(table.superClassName.parameterizedBy(table.entityClass.toClassName()))
5151

5252
addSuperclassConstructorParameter("%S", table.name)
5353
addSuperclassConstructorParameter("alias")

ktorm-ksp-compiler/src/main/kotlin/org/ktorm/ksp/compiler/parser/MetadataParser.kt

+35-4
Original file line numberDiff line numberDiff line change
@@ -19,8 +19,14 @@ package org.ktorm.ksp.compiler.parser
1919
import com.google.devtools.ksp.*
2020
import com.google.devtools.ksp.processing.Resolver
2121
import com.google.devtools.ksp.processing.SymbolProcessorEnvironment
22-
import com.google.devtools.ksp.symbol.*
2322
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
2430
import org.ktorm.entity.Entity
2531
import org.ktorm.ksp.annotation.*
2632
import org.ktorm.ksp.compiler.util.*
@@ -32,6 +38,7 @@ import org.ktorm.schema.BaseTable
3238
import org.ktorm.schema.TypeReference
3339
import java.lang.reflect.InvocationTargetException
3440
import java.util.*
41+
import kotlin.reflect.KClass
3542
import 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
}

ktorm-ksp-spi/src/main/kotlin/org/ktorm/ksp/spi/TableMetadata.kt

+2-2
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@
1717
package org.ktorm.ksp.spi
1818

1919
import com.google.devtools.ksp.symbol.KSClassDeclaration
20-
import kotlin.reflect.KClass
20+
import com.squareup.kotlinpoet.ClassName
2121

2222
/**
2323
* Table definition metadata.
@@ -72,5 +72,5 @@ public data class TableMetadata(
7272
/**
7373
* The super class of the table class in the generated code.
7474
*/
75-
val superClass: KClass<*>
75+
val superClassName: ClassName
7676
)

0 commit comments

Comments
 (0)