diff --git a/kotlin-plugin/build.gradle b/kotlin-plugin/build.gradle index d7216bf..6a2b5f2 100644 --- a/kotlin-plugin/build.gradle +++ b/kotlin-plugin/build.gradle @@ -10,8 +10,7 @@ dependencies { implementation "org.jetbrains.kotlin:kotlin-gradle-plugin-api" compileOnly "org.jetbrains.kotlin:kotlin-compiler-embeddable" - // testImplementation 'com.github.tschuchortdev:kotlin-compile-testing:1.5.0' does not support Kotlin 2 - testImplementation 'dev.zacsweers.kctfork:core:0.6.0' // Fork of kotlin-compile-testing that supports Kotlin 2 + testImplementation 'dev.zacsweers.kctfork:core:0.6.0' testImplementation 'junit:junit:4.13.2' testImplementation 'org.jetbrains.kotlin:kotlin-compiler-embeddable' } diff --git a/kotlin-plugin/src/main/kotlin/me/shika/ComponentRegistrar.kt b/kotlin-plugin/src/main/kotlin/me/shika/ComponentRegistrar.kt index bf38a41..931b54c 100644 --- a/kotlin-plugin/src/main/kotlin/me/shika/ComponentRegistrar.kt +++ b/kotlin-plugin/src/main/kotlin/me/shika/ComponentRegistrar.kt @@ -2,9 +2,7 @@ package me.shika import me.shika.ObjectSerializationCommandLineProcessor.Companion.KEY_ENABLED import me.shika.generation.ObjectSerializationIrGeneration -import me.shika.generation.ObjectSerializationJvmGeneration import org.jetbrains.kotlin.backend.common.extensions.IrGenerationExtension -import org.jetbrains.kotlin.codegen.extensions.ExpressionCodegenExtension import org.jetbrains.kotlin.compiler.plugin.CompilerPluginRegistrar import org.jetbrains.kotlin.compiler.plugin.ExperimentalCompilerApi import org.jetbrains.kotlin.config.CompilerConfiguration @@ -19,10 +17,6 @@ class ObjectSerializationCompilerPluginRegistrar : CompilerPluginRegistrar() { return } - ExpressionCodegenExtension.registerExtension( - ObjectSerializationJvmGeneration() - ) - IrGenerationExtension.registerExtension( ObjectSerializationIrGeneration() ) diff --git a/kotlin-plugin/src/main/kotlin/me/shika/generation/ObjectSerializationJvmGeneration.kt b/kotlin-plugin/src/main/kotlin/me/shika/generation/ObjectSerializationJvmGeneration.kt deleted file mode 100644 index 3227965..0000000 --- a/kotlin-plugin/src/main/kotlin/me/shika/generation/ObjectSerializationJvmGeneration.kt +++ /dev/null @@ -1,43 +0,0 @@ -package me.shika.generation - -import org.jetbrains.kotlin.codegen.FunctionCodegen -import org.jetbrains.kotlin.codegen.ImplementationBodyCodegen -import org.jetbrains.kotlin.codegen.extensions.ExpressionCodegenExtension -import org.jetbrains.kotlin.com.intellij.util.ArrayUtil.EMPTY_STRING_ARRAY -import org.jetbrains.kotlin.resolve.jvm.diagnostics.JvmDeclarationOrigin.Companion.NO_ORIGIN -import org.jetbrains.org.objectweb.asm.Opcodes.ACC_PUBLIC -import org.jetbrains.org.objectweb.asm.Opcodes.ACC_SYNTHETIC -import org.jetbrains.org.objectweb.asm.commons.InstructionAdapter - -class ObjectSerializationJvmGeneration : ExpressionCodegenExtension { - override fun generateClassSyntheticParts(codegen: ImplementationBodyCodegen) { - if (codegen.descriptor.needSerializableFix()) { - val selfType = codegen.typeMapper.mapType(codegen.descriptor) - - codegen.addReadResolveFunction { - getstatic(codegen.className, "INSTANCE", selfType.descriptor) - areturn(selfType) - } - } - - } - - private fun ImplementationBodyCodegen.addReadResolveFunction( - block: InstructionAdapter.() -> Unit - ) { - val visitor = v.newMethod( - NO_ORIGIN, - ACC_PUBLIC or ACC_SYNTHETIC, - SERIALIZABLE_READ.identifier, - "()Ljava/lang/Object;", - null, - EMPTY_STRING_ARRAY - ) - - visitor.visitCode() - val iv = InstructionAdapter(visitor) - iv.apply(block) - FunctionCodegen.endVisit(iv, "JVM serialization bindings") - } - -} diff --git a/kotlin-plugin/src/main/kotlin/me/shika/generation/utils.kt b/kotlin-plugin/src/main/kotlin/me/shika/generation/utils.kt index 489c70f..0ac66aa 100644 --- a/kotlin-plugin/src/main/kotlin/me/shika/generation/utils.kt +++ b/kotlin-plugin/src/main/kotlin/me/shika/generation/utils.kt @@ -20,20 +20,6 @@ import org.jetbrains.kotlin.resolve.descriptorUtil.getSuperInterfaces import org.jetbrains.kotlin.resolve.descriptorUtil.module import java.io.Serializable -fun ClassDescriptor.needSerializableFix() = - module.platform.has() - && DescriptorUtils.isObject(this) - && isSerializable() - && !hasReadMethod() - -fun ClassDescriptor.hasReadMethod() = - unsubstitutedMemberScope.getContributedFunctions(SERIALIZABLE_READ, NoLookupLocation.FROM_BACKEND) - .any { it.name == SERIALIZABLE_READ && it.valueParameters.isEmpty() } - -fun ClassDescriptor.isSerializable(): Boolean = - getSuperInterfaces().any { it.fqNameSafe == SERIALIZABLE_FQ_NAME || it.isSerializable() } - || getSuperClassNotAny()?.isSerializable() == true - fun IrClass.needSerializableFix(): Boolean { return isObject && isSerializable() && !hasReadMethod() } diff --git a/kotlin-plugin/src/test/kotlin/me/shika/ObjectSerializationFixTest.kt b/kotlin-plugin/src/test/kotlin/me/shika/ObjectSerializationFixTest.kt index dc2b789..c0f408a 100644 --- a/kotlin-plugin/src/test/kotlin/me/shika/ObjectSerializationFixTest.kt +++ b/kotlin-plugin/src/test/kotlin/me/shika/ObjectSerializationFixTest.kt @@ -5,13 +5,24 @@ import com.tschuchort.compiletesting.SourceFile import org.jetbrains.kotlin.compiler.plugin.ExperimentalCompilerApi import org.junit.Assert.assertTrue import org.junit.Test +import org.junit.runner.RunWith +import org.junit.runners.Parameterized +import org.junit.runners.Parameterized.Parameters import java.lang.reflect.Method @OptIn(ExperimentalCompilerApi::class) -class ObjectSerializationFixTest { +@RunWith(Parameterized::class) +class ObjectSerializationFixTest(enableFir: Boolean) { + companion object { + @Parameters(name = "FIR: {1}") + @JvmStatic + fun data() = arrayOf(false, true) + } + private val compiler = KotlinCompilation().apply { compilerPluginRegistrars = listOf(ObjectSerializationCompilerPluginRegistrar()) supportsK2 = true + languageVersion = if (enableFir) "1.9" else "2.0" } private val SERIALIZABLE_OBJECT = """