17
17
package com.bnorm.power
18
18
19
19
import com.bnorm.power.internal.ReturnableBlockTransformer
20
- import org.jetbrains.kotlin.backend.common.FileLoweringPass
21
- import org.jetbrains.kotlin.backend.common.IrElementTransformerVoidWithContext
20
+ import org.jetbrains.kotlin.backend.common.*
22
21
import org.jetbrains.kotlin.backend.common.extensions.IrPluginContext
23
22
import org.jetbrains.kotlin.backend.common.ir.asSimpleLambda
24
23
import org.jetbrains.kotlin.backend.common.ir.inline
@@ -39,22 +38,11 @@ import org.jetbrains.kotlin.ir.builders.parent
39
38
import org.jetbrains.kotlin.ir.declarations.IrDeclarationOrigin
40
39
import org.jetbrains.kotlin.ir.declarations.IrFile
41
40
import org.jetbrains.kotlin.ir.declarations.path
42
- import org.jetbrains.kotlin.ir.expressions.IrCall
43
- import org.jetbrains.kotlin.ir.expressions.IrConst
44
- import org.jetbrains.kotlin.ir.expressions.IrExpression
45
- import org.jetbrains.kotlin.ir.expressions.IrStatementOrigin
46
- import org.jetbrains.kotlin.ir.expressions.IrStringConcatenation
41
+ import org.jetbrains.kotlin.ir.expressions.*
47
42
import org.jetbrains.kotlin.ir.expressions.impl.IrFunctionExpressionImpl
48
43
import org.jetbrains.kotlin.ir.symbols.IrFunctionSymbol
49
- import org.jetbrains.kotlin.ir.types.IrSimpleType
50
- import org.jetbrains.kotlin.ir.types.IrType
51
- import org.jetbrains.kotlin.ir.types.IrTypeArgument
52
- import org.jetbrains.kotlin.ir.types.IrTypeProjection
53
- import org.jetbrains.kotlin.ir.types.getClass
54
- import org.jetbrains.kotlin.ir.types.isBoolean
55
- import org.jetbrains.kotlin.ir.types.isSubtypeOf
56
- import org.jetbrains.kotlin.ir.util.functions
57
- import org.jetbrains.kotlin.ir.util.isFunctionOrKFunction
44
+ import org.jetbrains.kotlin.ir.types.*
45
+ import org.jetbrains.kotlin.ir.util.*
58
46
import org.jetbrains.kotlin.ir.visitors.IrElementVisitorVoid
59
47
import org.jetbrains.kotlin.ir.visitors.acceptChildrenVoid
60
48
import org.jetbrains.kotlin.ir.visitors.acceptVoid
@@ -138,7 +126,7 @@ class PowerAssertCallTransformer(
138
126
val title = when {
139
127
messageArgument is IrConst <* > -> messageArgument
140
128
messageArgument is IrStringConcatenation -> messageArgument
141
- lambda != null -> lambda.inline(parent).transform(ReturnableBlockTransformer (context, symbol), null )
129
+ lambda != null -> lambda.deepCopyWithSymbols(parent). inline(parent).transform(ReturnableBlockTransformer (context, symbol), null )
142
130
messageArgument != null -> {
143
131
val invoke = messageArgument.type.getClass()!! .functions.single { it.name == OperatorNameConventions .INVOKE }
144
132
irCallOp(invoke.symbol, invoke.returnType, messageArgument)
@@ -147,20 +135,20 @@ class PowerAssertCallTransformer(
147
135
else -> irString(" Assertion failed" )
148
136
}
149
137
150
- return delegate.buildCall(this , buildMessage(file, fileSource, title, expression, subStack))
138
+ return delegate.buildCall(this , expression, buildMessage(file, fileSource, title.deepCopyWithSymbols(parent) , expression, subStack))
151
139
}
152
140
}
153
141
154
- // println(assertionArgument .dump())
142
+ // println(expression .dump())
155
143
// println(tree.dump())
156
144
157
145
return generator.buildAssert(this , root)
158
- // .also { println(it.dump())}
146
+ // .also { println(it.dump()) }
159
147
}
160
148
}
161
149
162
150
private interface FunctionDelegate {
163
- fun buildCall (builder : IrBuilderWithScope , message : IrExpression ): IrExpression
151
+ fun buildCall (builder : IrBuilderWithScope , original : IrCall , message : IrExpression ): IrExpression
164
152
}
165
153
166
154
private fun findDelegate (fqName : FqName ): FunctionDelegate ? {
@@ -174,8 +162,13 @@ class PowerAssertCallTransformer(
174
162
return @mapNotNull when {
175
163
isStringSupertype(parameters[1 ].type) -> {
176
164
object : FunctionDelegate {
177
- override fun buildCall (builder : IrBuilderWithScope , message : IrExpression ): IrExpression = with (builder) {
165
+ override fun buildCall (builder : IrBuilderWithScope , original : IrCall , message : IrExpression ): IrExpression = with (builder) {
178
166
irCall(overload, type = overload.owner.returnType).apply {
167
+ dispatchReceiver = original.dispatchReceiver?.deepCopyWithSymbols(parent)
168
+ extensionReceiver = original.extensionReceiver?.deepCopyWithSymbols(parent)
169
+ for (i in 0 until original.typeArgumentsCount) {
170
+ putTypeArgument(i, original.getTypeArgument(i))
171
+ }
179
172
putValueArgument(0 , irFalse())
180
173
putValueArgument(1 , message)
181
174
}
@@ -184,7 +177,7 @@ class PowerAssertCallTransformer(
184
177
}
185
178
isStringFunction(parameters[1 ].type) -> {
186
179
object : FunctionDelegate {
187
- override fun buildCall (builder : IrBuilderWithScope , message : IrExpression ): IrExpression = with (builder) {
180
+ override fun buildCall (builder : IrBuilderWithScope , original : IrCall , message : IrExpression ): IrExpression = with (builder) {
188
181
val scope = this
189
182
val lambda = buildFun {
190
183
name = Name .special(" <anonymous>" )
@@ -198,8 +191,13 @@ class PowerAssertCallTransformer(
198
191
}
199
192
parent = scope.parent
200
193
}
201
- val expression = IrFunctionExpressionImpl (- 1 , - 1 , context.irBuiltIns.stringType , lambda, IrStatementOrigin .LAMBDA )
194
+ val expression = IrFunctionExpressionImpl (- 1 , - 1 , parameters[ 1 ].type , lambda, IrStatementOrigin .LAMBDA )
202
195
irCall(overload, type = overload.owner.returnType).apply {
196
+ dispatchReceiver = original.dispatchReceiver?.deepCopyWithSymbols(parent)
197
+ extensionReceiver = original.extensionReceiver?.deepCopyWithSymbols(parent)
198
+ for (i in 0 until original.typeArgumentsCount) {
199
+ putTypeArgument(i, original.getTypeArgument(i))
200
+ }
203
201
putValueArgument(0 , irFalse())
204
202
putValueArgument(1 , expression)
205
203
}
0 commit comments