17
17
package dev.nhachicha
18
18
19
19
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
23
20
import org.jetbrains.kotlin.backend.common.FileLoweringPass
21
+ import org.jetbrains.kotlin.backend.common.IrElementTransformerVoidWithContext
24
22
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
27
25
import org.jetbrains.kotlin.compiler.plugin.ComponentRegistrar
28
26
import org.jetbrains.kotlin.config.CompilerConfiguration
29
27
import org.jetbrains.kotlin.ir.IrElement
30
28
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.*
35
30
import org.jetbrains.kotlin.ir.declarations.IrFile
36
31
import org.jetbrains.kotlin.ir.declarations.IrFunction
32
+ import org.jetbrains.kotlin.ir.declarations.IrModuleFragment
37
33
import org.jetbrains.kotlin.ir.declarations.isPropertyAccessor
38
34
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
41
36
import org.jetbrains.kotlin.ir.types.isNullableString
42
37
import org.jetbrains.kotlin.ir.types.isString
43
- import org.jetbrains.kotlin.ir.util.constructors
44
- import org.jetbrains.kotlin.ir.util.functions
45
38
import org.jetbrains.kotlin.ir.util.isGetter
46
- import org.jetbrains.kotlin.ir.util.statements
47
39
import org.jetbrains.kotlin.ir.visitors.*
48
- import org.jetbrains.kotlin.name.Name
49
- import org.jetbrains.kotlin.resolve.BindingContext
50
40
51
41
@AutoService(ComponentRegistrar ::class )
52
42
class AccessorModifierComponentRegistrar : ComponentRegistrar {
@@ -55,7 +45,7 @@ class AccessorModifierComponentRegistrar : ComponentRegistrar {
55
45
}
56
46
57
47
companion object {
58
- fun registerExtensions (project : Project , configuration : CompilerConfiguration ) {
48
+ fun registerExtensions (project : MockProject , configuration : CompilerConfiguration ) {
59
49
IrGenerationExtension .registerExtension(
60
50
project,
61
51
AccessorModifierIrGenerationExtension ()
@@ -66,76 +56,38 @@ class AccessorModifierComponentRegistrar : ComponentRegistrar {
66
56
67
57
class AccessorModifierIrGenerationExtension : IrGenerationExtension {
68
58
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
+ }
75
63
}
76
64
77
65
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 {
99
68
100
69
override fun lower (irFile : IrFile ) {
101
70
irFile.transformChildrenVoid()
102
71
}
103
72
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 {
107
74
return if (declaration.isPropertyAccessor
108
75
&& declaration.isGetter
109
76
&& (declaration.returnType.isString() || declaration.returnType.isNullableString())
110
77
) {
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)
132
85
}
133
- })
134
- }
135
-
136
- super .visitFunction(declaration)
86
+ }
87
+ })
88
+ super .visitFunctionNew(declaration)
137
89
} else {
138
- super .visitFunction (declaration)
90
+ super .visitFunctionNew (declaration)
139
91
}
140
92
}
141
93
@@ -154,4 +106,3 @@ fun FileLoweringPass.runOnFileInOrder(irFile: IrFile) {
154
106
}
155
107
})
156
108
}
157
-
0 commit comments