Skip to content

Commit ec26907

Browse files
authored
Upgrade to Kotlin 1.4.0 (nhachicha#1)
1 parent 59a685b commit ec26907

File tree

8 files changed

+62
-109
lines changed

8 files changed

+62
-109
lines changed

build.gradle

+4-3
Original file line numberDiff line numberDiff line change
@@ -3,14 +3,15 @@ buildscript {
33
mavenLocal()
44
}
55
ext.versions = [
6-
'kotlin': '1.3.61',
6+
'kotlin': '1.4.0',
77
'autoService': '1.0-rc6'
88
]
99

1010
ext.deps = [
1111
'kotlin': [
1212
'stdlib': "org.jetbrains.kotlin:kotlin-stdlib-jdk8:${versions.kotlin}",
13-
'compiler': "org.jetbrains.kotlin:kotlin-compiler:${versions.kotlin}",
13+
// 'compiler': "org.jetbrains.kotlin:kotlin-compiler:${versions.kotlin}",
14+
'compiler': "org.jetbrains.kotlin:kotlin-compiler-embeddable",
1415
'gradle': "org.jetbrains.kotlin:kotlin-gradle-plugin:${versions.kotlin}",
1516
],
1617
'autoService': [
@@ -21,7 +22,7 @@ buildscript {
2122
}
2223

2324
plugins {
24-
id 'org.jetbrains.kotlin.jvm' version '1.3.61'
25+
id 'org.jetbrains.kotlin.jvm' version '1.4.0'
2526
}
2627

2728
group 'dev.nhachicha'

compiler-plugin/build.gradle

+5-5
Original file line numberDiff line numberDiff line change
@@ -18,20 +18,20 @@ shadowJar {
1818
// use the same artifact name, but within a different location
1919
archiveClassifier.set("")
2020
destinationDirectory = file("$buildDir/shaded")
21-
relocate "com.intellij", "org.jetbrains.kotlin.com.intellij"
21+
relocate "org.jetbrains.kotlin.com.intellij", "com.intellij"
2222
}
2323

2424
def id = 'accessor-modifier-compiler-plugin'
2525

2626
publishing {
2727
publications {
28-
unshaded(MavenPublication) { // unshaded artifact for Kotlin/Native (Konan)
29-
artifactId "${id}-unshaded"
28+
unshaded(MavenPublication) { // unshaded artifact for Koltin JVM
29+
artifactId "${id}"
3030
from components.java
3131
}
3232

33-
shaded(MavenPublication) { // shaded artifact for Koltin JVM
34-
artifactId id
33+
shaded(MavenPublication) { // shaded artifact for Kotlin/Native (Konan)
34+
artifactId "${id}-shaded"
3535
artifact shadowJar
3636
}
3737
}

compiler-plugin/src/main/kotlin/dev/nhachicha/AccessorModifierPlugin.kt

+25-74
Original file line numberDiff line numberDiff line change
@@ -17,36 +17,26 @@
1717
package dev.nhachicha
1818

1919
import com.google.auto.service.AutoService
20-
import com.intellij.mock.MockProject
21-
import com.intellij.openapi.project.Project
22-
import org.jetbrains.kotlin.backend.common.BackendContext
2320
import org.jetbrains.kotlin.backend.common.FileLoweringPass
21+
import org.jetbrains.kotlin.backend.common.IrElementTransformerVoidWithContext
2422
import org.jetbrains.kotlin.backend.common.extensions.IrGenerationExtension
25-
import org.jetbrains.kotlin.backend.common.lower.createIrBuilder
26-
import org.jetbrains.kotlin.backend.common.lower.irBlock
23+
import org.jetbrains.kotlin.backend.common.extensions.IrPluginContext
24+
import org.jetbrains.kotlin.com.intellij.mock.MockProject
2725
import org.jetbrains.kotlin.compiler.plugin.ComponentRegistrar
2826
import org.jetbrains.kotlin.config.CompilerConfiguration
2927
import org.jetbrains.kotlin.ir.IrElement
3028
import org.jetbrains.kotlin.ir.IrStatement
31-
import org.jetbrains.kotlin.ir.builders.createTmpVariable
32-
import org.jetbrains.kotlin.ir.builders.irCall
33-
import org.jetbrains.kotlin.ir.builders.irGet
34-
import org.jetbrains.kotlin.ir.builders.irString
29+
import org.jetbrains.kotlin.ir.builders.*
3530
import org.jetbrains.kotlin.ir.declarations.IrFile
3631
import org.jetbrains.kotlin.ir.declarations.IrFunction
32+
import org.jetbrains.kotlin.ir.declarations.IrModuleFragment
3733
import org.jetbrains.kotlin.ir.declarations.isPropertyAccessor
3834
import org.jetbrains.kotlin.ir.expressions.IrExpression
39-
import org.jetbrains.kotlin.ir.expressions.IrGetField
40-
import org.jetbrains.kotlin.ir.types.isNullableAny
35+
import org.jetbrains.kotlin.ir.expressions.IrReturn
4136
import org.jetbrains.kotlin.ir.types.isNullableString
4237
import org.jetbrains.kotlin.ir.types.isString
43-
import org.jetbrains.kotlin.ir.util.constructors
44-
import org.jetbrains.kotlin.ir.util.functions
4538
import org.jetbrains.kotlin.ir.util.isGetter
46-
import org.jetbrains.kotlin.ir.util.statements
4739
import org.jetbrains.kotlin.ir.visitors.*
48-
import org.jetbrains.kotlin.name.Name
49-
import org.jetbrains.kotlin.resolve.BindingContext
5040

5141
@AutoService(ComponentRegistrar::class)
5242
class AccessorModifierComponentRegistrar : ComponentRegistrar {
@@ -55,7 +45,7 @@ class AccessorModifierComponentRegistrar : ComponentRegistrar {
5545
}
5646

5747
companion object {
58-
fun registerExtensions(project: Project, configuration: CompilerConfiguration) {
48+
fun registerExtensions(project: MockProject, configuration: CompilerConfiguration) {
5949
IrGenerationExtension.registerExtension(
6050
project,
6151
AccessorModifierIrGenerationExtension()
@@ -66,76 +56,38 @@ class AccessorModifierComponentRegistrar : ComponentRegistrar {
6656

6757
class AccessorModifierIrGenerationExtension : IrGenerationExtension {
6858

69-
override fun generate(
70-
f: IrFile,
71-
backendContext: BackendContext,
72-
bindingContext: BindingContext
73-
) {
74-
AccessorCallTransformer(backendContext).runOnFileInOrder(f)
59+
override fun generate(moduleFragment: IrModuleFragment, pluginContext: IrPluginContext) {
60+
for (file in moduleFragment.files) {
61+
AccessorCallTransformer(pluginContext).runOnFileInOrder(file)
62+
}
7563
}
7664

7765
class AccessorCallTransformer(
78-
val context: BackendContext
79-
) : IrElementTransformerVoid(), FileLoweringPass {
80-
81-
private val nameToString = Name.identifier("toString")
82-
private val nameAppend = Name.identifier("append")
83-
private val stringBuilder = context.ir.symbols.stringBuilder.owner
84-
private val prefix = "Hello "
85-
86-
private val constructor = stringBuilder.constructors.single {
87-
it.valueParameters.size == 0
88-
}
89-
90-
private val toStringFunction = stringBuilder.functions.single {
91-
it.valueParameters.size == 0 && it.name == nameToString
92-
}
93-
94-
private val appendFunction = stringBuilder.functions.single {
95-
it.name == nameAppend &&
96-
it.valueParameters.size == 1 &&
97-
it.valueParameters.single().type.isNullableAny()
98-
}
66+
val context: IrPluginContext
67+
) : IrElementTransformerVoidWithContext(), FileLoweringPass {
9968

10069
override fun lower(irFile: IrFile) {
10170
irFile.transformChildrenVoid()
10271
}
10372

104-
override fun visitFunction(declaration: IrFunction): IrStatement {
105-
106-
// Modify only property accessor getter for type String or nullable String
73+
override fun visitFunctionNew(declaration: IrFunction): IrStatement {
10774
return if (declaration.isPropertyAccessor
10875
&& declaration.isGetter
10976
&& (declaration.returnType.isString() || declaration.returnType.isNullableString())
11077
) {
111-
declaration.transformChildrenVoid(this)
112-
for (statement in declaration.body?.statements!!) {
113-
statement.transformChildrenVoid(object : IrElementTransformerVoid() {
114-
override fun visitGetField(expression: IrGetField): IrExpression {
115-
return context.createIrBuilder(expression.symbol, expression.startOffset, expression.endOffset).irBlock(expression) {
116-
val stringBuilderImpl = createTmpVariable(irCall(constructor))
117-
118-
+irCall(appendFunction).apply {
119-
dispatchReceiver = irGet(stringBuilderImpl)
120-
putValueArgument(0, irString(prefix)) // appending PROPERTY_BACKING_FIELD
121-
}
122-
123-
+irCall(appendFunction).apply {
124-
dispatchReceiver = irGet(stringBuilderImpl)
125-
putValueArgument(0, expression) // appending PROPERTY_BACKING_FIELD
126-
}
127-
// create an irCall and add it to this IrBuilder block
128-
+irCall(toStringFunction).apply {
129-
dispatchReceiver /* <-- to String called on --> */ = irGet(stringBuilderImpl)
130-
}
131-
}
78+
declaration.body?.transformChildrenVoid(object : IrElementTransformerVoid() {
79+
override fun visitReturn(expression: IrReturn): IrExpression {
80+
return IrBlockBuilder(context, currentScope?.scope!!, expression.startOffset, expression.endOffset).irBlock {
81+
val irConcat = irConcat()
82+
irConcat.addArgument(irString("Hello "))
83+
irConcat.addArgument(expression.value)
84+
+irReturn(irConcat)
13285
}
133-
})
134-
}
135-
136-
super.visitFunction(declaration)
86+
}
87+
})
88+
super.visitFunctionNew(declaration)
13789
} else {
138-
super.visitFunction(declaration)
90+
super.visitFunctionNew(declaration)
13991
}
14092
}
14193

@@ -154,4 +106,3 @@ fun FileLoweringPass.runOnFileInOrder(irFile: IrFile) {
154106
}
155107
})
156108
}
157-

example/build.gradle

+2-2
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
buildscript {
2-
ext.kotlin_version = '1.3.61'
2+
ext.kotlin_version = '1.4.0'
33
repositories {
44
mavenLocal()
55
mavenCentral()
@@ -13,7 +13,7 @@ buildscript {
1313

1414

1515
plugins {
16-
id 'org.jetbrains.kotlin.multiplatform' version '1.3.61'
16+
id 'org.jetbrains.kotlin.multiplatform' version '1.4.0'
1717
}
1818
repositories {
1919
mavenLocal()
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,9 @@
1+
#Wed May 13 20:54:17 CEST 2020
12
distributionBase=GRADLE_USER_HOME
23
distributionPath=wrapper/dists
3-
distributionUrl=https\://services.gradle.org/distributions/gradle-5.5.1-bin.zip
44
zipStoreBase=GRADLE_USER_HOME
55
zipStorePath=wrapper/dists
6+
7+
# The current Gradle version 5.5.1 is not compatible with the Kotlin Multiplatform plugin. Please use Gradle 6.0 or newer, or the previous version of the Kotlin plugin.
8+
distributionUrl=https\://services.gradle.org/distributions/gradle-6.6.1-all.zip
9+

gradle-plugin/build.gradle

+2-2
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,7 @@ gradlePlugin {
2727
id = "dev.nhachicha.accessor-modifier-compiler-plugin"
2828
displayName = "Accessor modifier compiler plugin"
2929
description = "Example Plugin using IR to modify accessor of a class (KMP)"
30-
implementationClass = "dev.nhachicha.gradle.AccessorModifierGradleSubplugin"
30+
implementationClass = "dev.nhachicha.gradle.AccessorModifierKotlinGradleSubplugin"
3131
}
3232
}
3333
}
@@ -37,4 +37,4 @@ dependencies {
3737
kapt deps.autoService.compiler
3838
compileOnly deps.autoService.annotations
3939

40-
}
40+
}

gradle-plugin/src/main/kotlin/dev/nhachicha/gradle/AccessorModifierSubplugin.kt

+17-21
Original file line numberDiff line numberDiff line change
@@ -19,49 +19,45 @@ package dev.nhachicha.gradle
1919
import com.google.auto.service.AutoService
2020
import org.gradle.api.Plugin
2121
import org.gradle.api.Project
22-
import org.gradle.api.tasks.compile.AbstractCompile
22+
import org.gradle.api.provider.Provider
2323
import org.jetbrains.kotlin.gradle.plugin.KotlinCompilation
24-
import org.jetbrains.kotlin.gradle.plugin.KotlinGradleSubplugin
24+
import org.jetbrains.kotlin.gradle.plugin.KotlinCompilerPluginSupportPlugin
2525
import org.jetbrains.kotlin.gradle.plugin.SubpluginArtifact
2626
import org.jetbrains.kotlin.gradle.plugin.SubpluginOption
2727

2828
class AccessorModifierGradleSubplugin : Plugin<Project> {
2929
companion object {
30-
fun isEnabled(project: Project) = project.plugins.findPlugin(AccessorModifierGradleSubplugin::class.java) != null
30+
fun isEnabled(project: Project) = project.plugins.findPlugin(AccessorModifierKotlinGradleSubplugin::class.java) != null
3131
}
3232

3333
override fun apply(project: Project) {}
3434
}
3535

36-
@AutoService(KotlinGradleSubplugin::class)
37-
class AccessorModifierKotlinGradleSubplugin : KotlinGradleSubplugin<AbstractCompile> {
36+
@AutoService(KotlinCompilerPluginSupportPlugin::class)
37+
class AccessorModifierKotlinGradleSubplugin : KotlinCompilerPluginSupportPlugin {
3838
companion object {
3939
const val ARTIFACT_GROUP_NAME = "dev.nhachicha"
40-
const val ARTIFACT_SHADED_NAME = "accessor-modifier-compiler-plugin"
41-
const val ARTIFACT_UNSHADED_NAME = "accessor-modifier-compiler-plugin-unshaded"
40+
const val ARTIFACT_NAME = "accessor-modifier-compiler-plugin"
41+
const val ARTIFACT_SHADED_NAME = "accessor-modifier-compiler-plugin-shaded"
4242
const val ARTIFACT_VERSION = "0.0.1-SNAPSHOT"
4343
const val PLUGIN_ID = "dev.nhachicha.accessor-modifier-compiler-plugin"
4444
}
4545

46-
override fun isApplicable(project: Project, task: AbstractCompile): Boolean =
47-
AccessorModifierGradleSubplugin.isEnabled(project)
46+
override fun isApplicable(kotlinCompilation: KotlinCompilation<*>): Boolean =
47+
AccessorModifierGradleSubplugin.isEnabled(kotlinCompilation.target.project)
4848

49-
override fun apply(
50-
project: Project,
51-
kotlinCompile: AbstractCompile,
52-
javaCompile: AbstractCompile?,
53-
variantData: Any?,
54-
androidProjectHandler: Any?,
55-
kotlinCompilation: KotlinCompilation<*>?
56-
): List<SubpluginOption> {
57-
return emptyList()
49+
override fun applyToCompilation(kotlinCompilation: KotlinCompilation<*>): Provider<List<SubpluginOption>> {
50+
val project = kotlinCompilation.target.project
51+
return project.provider {
52+
listOf(SubpluginOption(key = "optio-key", value = "option-value"))
53+
}
5854
}
5955

6056
override fun getPluginArtifact(): SubpluginArtifact =
61-
SubpluginArtifact(ARTIFACT_GROUP_NAME, ARTIFACT_SHADED_NAME, ARTIFACT_VERSION)
57+
SubpluginArtifact(ARTIFACT_GROUP_NAME, ARTIFACT_NAME, ARTIFACT_VERSION)
6258

63-
override fun getNativeCompilerPluginArtifact(): SubpluginArtifact? =
64-
SubpluginArtifact(ARTIFACT_GROUP_NAME, ARTIFACT_UNSHADED_NAME, ARTIFACT_VERSION)
59+
override fun getPluginArtifactForNative(): SubpluginArtifact? =
60+
SubpluginArtifact(ARTIFACT_GROUP_NAME, ARTIFACT_SHADED_NAME, ARTIFACT_VERSION)
6561

6662
override fun getCompilerPluginId() = PLUGIN_ID
6763
}
+2-1
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
distributionBase=GRADLE_USER_HOME
22
distributionPath=wrapper/dists
3-
distributionUrl=https\://services.gradle.org/distributions/gradle-5.5.1-all.zip
3+
distributionUrl=https\://services.gradle.org/distributions/gradle-6.6.1-all.zip
4+
45
zipStoreBase=GRADLE_USER_HOME
56
zipStorePath=wrapper/dists

0 commit comments

Comments
 (0)