Skip to content

Commit 7cc36c4

Browse files
authored
Merge pull request #3 from nvkleban/support-kotlin-1.5
Add kotlin 1.5 support
2 parents 6632666 + 4e5b9a7 commit 7cc36c4

File tree

4 files changed

+42
-10
lines changed

4 files changed

+42
-10
lines changed

build.gradle

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
plugins {
22
id 'java'
3-
id 'org.jetbrains.kotlin.jvm' version '1.3.70'
3+
id 'org.jetbrains.kotlin.jvm' version '1.5.21'
44
}
55

66
sourceCompatibility = 1.8
@@ -13,5 +13,5 @@ allprojects {
1313
}
1414

1515
group 'me.shika'
16-
version '1.0.2'
16+
version '1.1.0'
1717
}

gradle/wrapper/gradle-wrapper.properties

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
#Wed Dec 18 22:46:33 GMT 2019
2-
distributionUrl=https\://services.gradle.org/distributions/gradle-6.0.1-all.zip
2+
distributionUrl=https\://services.gradle.org/distributions/gradle-6.1.1-all.zip
33
distributionBase=GRADLE_USER_HOME
44
distributionPath=wrapper/dists
55
zipStorePath=wrapper/dists

kotlin-plugin/src/main/kotlin/me/shika/generation/ObjectSerializationIRGeneration.kt

Lines changed: 11 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ package me.shika.generation
33
import org.jetbrains.kotlin.backend.common.extensions.IrGenerationExtension
44
import org.jetbrains.kotlin.backend.common.extensions.IrPluginContext
55
import org.jetbrains.kotlin.backend.common.lower.DeclarationIrBuilder
6+
import org.jetbrains.kotlin.descriptors.DescriptorVisibilities
67
import org.jetbrains.kotlin.descriptors.Visibilities
78
import org.jetbrains.kotlin.ir.IrElement
89
import org.jetbrains.kotlin.ir.builders.declarations.addFunction
@@ -15,25 +16,28 @@ import org.jetbrains.kotlin.ir.declarations.IrModuleFragment
1516
import org.jetbrains.kotlin.ir.visitors.IrElementVisitorVoid
1617
import org.jetbrains.kotlin.ir.visitors.acceptChildrenVoid
1718
import org.jetbrains.kotlin.ir.visitors.acceptVoid
19+
import org.jetbrains.kotlin.utils.addToStdlib.firstIsInstanceOrNull
1820

1921
private object ObjectSerializationOrigin : IrDeclarationOriginImpl("object-serialization-fix", isSynthetic = true)
2022

2123
class ObjectSerializationIrGeneration : IrGenerationExtension {
2224
override fun generate(moduleFragment: IrModuleFragment, pluginContext: IrPluginContext) {
23-
moduleFragment.acceptVoid(
24-
recursiveIrClassVisitor {
25-
if (it.descriptor.needSerializableFix()) {
26-
fixSerializable(it, pluginContext)
25+
if (moduleFragment.hasJvmPlatform()) {
26+
moduleFragment.acceptVoid(
27+
recursiveIrClassVisitor {
28+
if (it.needSerializableFix()) {
29+
fixSerializable(it, pluginContext)
30+
}
2731
}
28-
}
29-
)
32+
)
33+
}
3034
}
3135

3236
private fun fixSerializable(cls: IrClass, context: IrPluginContext) {
3337
cls.addFunction {
3438
name = SERIALIZABLE_READ
3539
returnType = context.irBuiltIns.anyNType
36-
visibility = Visibilities.PUBLIC
40+
visibility = DescriptorVisibilities.PUBLIC
3741
origin = ObjectSerializationOrigin
3842
}.also { function ->
3943
function.body = DeclarationIrBuilder(context, function.symbol, function.startOffset, function.endOffset)

kotlin-plugin/src/main/kotlin/me/shika/generation/utils.kt

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,14 @@
11
package me.shika.generation
22

3+
import org.jetbrains.kotlin.backend.wasm.ir2wasm.allSuperInterfaces
34
import org.jetbrains.kotlin.descriptors.ClassDescriptor
45
import org.jetbrains.kotlin.incremental.components.NoLookupLocation
6+
import org.jetbrains.kotlin.ir.declarations.IrClass
7+
import org.jetbrains.kotlin.ir.declarations.IrModuleFragment
8+
import org.jetbrains.kotlin.ir.util.fqNameWhenAvailable
9+
import org.jetbrains.kotlin.ir.util.functions
10+
import org.jetbrains.kotlin.ir.util.getAllSuperclasses
11+
import org.jetbrains.kotlin.ir.util.isObject
512
import org.jetbrains.kotlin.name.FqName
613
import org.jetbrains.kotlin.name.Name
714
import org.jetbrains.kotlin.platform.has
@@ -27,5 +34,26 @@ fun ClassDescriptor.isSerializable(): Boolean =
2734
getSuperInterfaces().any { it.fqNameSafe == SERIALIZABLE_FQ_NAME || it.isSerializable() }
2835
|| getSuperClassNotAny()?.isSerializable() == true
2936

37+
fun IrClass.needSerializableFix(): Boolean {
38+
return isObject && isSerializable() && !hasReadMethod()
39+
}
40+
41+
fun IrClass.isSerializable(): Boolean {
42+
return allSuperInterfaces()
43+
.any { it.fqNameWhenAvailable == SERIALIZABLE_FQ_NAME || it.isSerializable() }
44+
|| getAllSuperclasses().any { it.isSerializable() }
45+
}
46+
47+
fun IrClass.hasReadMethod(): Boolean {
48+
return functions.any { it.name == SERIALIZABLE_READ && it.valueParameters.isEmpty() }
49+
}
50+
51+
fun IrModuleFragment.hasJvmPlatform(): Boolean {
52+
return descriptor
53+
.platform
54+
?.has<JvmPlatform>()
55+
?: false
56+
}
57+
3058
val SERIALIZABLE_READ = Name.identifier("readResolve")
3159
val SERIALIZABLE_FQ_NAME = FqName(Serializable::class.java.name)

0 commit comments

Comments
 (0)