Mark implicit 'invoke' calls with origin INVOKE
This commit is contained in:
+11
-1
@@ -44,6 +44,7 @@ import org.jetbrains.kotlin.resolve.constants.CompileTimeConstant
|
|||||||
import org.jetbrains.kotlin.resolve.constants.evaluate.ConstantExpressionEvaluator
|
import org.jetbrains.kotlin.resolve.constants.evaluate.ConstantExpressionEvaluator
|
||||||
import org.jetbrains.kotlin.types.KotlinType
|
import org.jetbrains.kotlin.types.KotlinType
|
||||||
import org.jetbrains.kotlin.types.expressions.ExpressionTypingUtils
|
import org.jetbrains.kotlin.types.expressions.ExpressionTypingUtils
|
||||||
|
import org.jetbrains.kotlin.util.OperatorNameConventions
|
||||||
|
|
||||||
class StatementGenerator(
|
class StatementGenerator(
|
||||||
val bodyGenerator: BodyGenerator,
|
val bodyGenerator: BodyGenerator,
|
||||||
@@ -294,7 +295,16 @@ class StatementGenerator(
|
|||||||
return CallGenerator(this).generateCall(expression, functionCall, IrStatementOrigin.INVOKE)
|
return CallGenerator(this).generateCall(expression, functionCall, IrStatementOrigin.INVOKE)
|
||||||
}
|
}
|
||||||
|
|
||||||
return CallGenerator(this).generateCall(expression.startOffset, expression.endOffset, pregenerateCall(resolvedCall))
|
val calleeExpression = expression.calleeExpression
|
||||||
|
val origin =
|
||||||
|
if (resolvedCall.resultingDescriptor.name == OperatorNameConventions.INVOKE &&
|
||||||
|
calleeExpression !is KtSimpleNameExpression && calleeExpression !is KtQualifiedExpression
|
||||||
|
)
|
||||||
|
IrStatementOrigin.INVOKE
|
||||||
|
else
|
||||||
|
null
|
||||||
|
|
||||||
|
return CallGenerator(this).generateCall(expression.startOffset, expression.endOffset, pregenerateCall(resolvedCall), origin)
|
||||||
}
|
}
|
||||||
|
|
||||||
override fun visitArrayAccessExpression(expression: KtArrayAccessExpression, data: Nothing?): IrStatement {
|
override fun visitArrayAccessExpression(expression: KtArrayAccessExpression, data: Nothing?): IrStatement {
|
||||||
|
|||||||
+5
-1
@@ -1,5 +1,9 @@
|
|||||||
|
fun invoke() {}
|
||||||
|
|
||||||
fun test1(a: dynamic) = a(1)
|
fun test1(a: dynamic) = a(1)
|
||||||
fun test1a(a: dynamic) = a.invoke(1)
|
fun test1a(a: dynamic) = a.invoke(1)
|
||||||
fun test2(a: dynamic, b: dynamic) = a(b)
|
fun test2(a: dynamic, b: dynamic) = a(b)
|
||||||
fun test2a(a: dynamic, b: dynamic) = a.invoke(b)
|
fun test2a(a: dynamic, b: dynamic) = a.invoke(b)
|
||||||
fun test2b(a: dynamic, b: dynamic) = a(b)(b)
|
fun test2b(a: dynamic, b: dynamic) = a(b)(b)
|
||||||
|
fun test2c(a: dynamic, b: dynamic) = a(b).invoke(b)
|
||||||
|
fun test3(a: dynamic) = invoke()
|
||||||
@@ -1,4 +1,6 @@
|
|||||||
FILE fqName:<root> fileName:/invokeOperator.kt
|
FILE fqName:<root> fileName:/invokeOperator.kt
|
||||||
|
FUN name:invoke visibility:public modality:FINAL <> () returnType:kotlin.Unit flags:
|
||||||
|
BLOCK_BODY
|
||||||
FUN name:test1 visibility:public modality:FINAL <> (a:dynamic) returnType:dynamic flags:
|
FUN name:test1 visibility:public modality:FINAL <> (a:dynamic) returnType:dynamic flags:
|
||||||
VALUE_PARAMETER name:a index:0 type:dynamic flags:
|
VALUE_PARAMETER name:a index:0 type:dynamic flags:
|
||||||
BLOCK_BODY
|
BLOCK_BODY
|
||||||
@@ -34,8 +36,23 @@ FILE fqName:<root> fileName:/invokeOperator.kt
|
|||||||
VALUE_PARAMETER name:b index:1 type:dynamic flags:
|
VALUE_PARAMETER name:b index:1 type:dynamic flags:
|
||||||
BLOCK_BODY
|
BLOCK_BODY
|
||||||
RETURN type=kotlin.Nothing from='test2b(dynamic, dynamic): dynamic'
|
RETURN type=kotlin.Nothing from='test2b(dynamic, dynamic): dynamic'
|
||||||
|
CALL 'invoke(dynamic): dynamic' type=dynamic origin=INVOKE
|
||||||
|
$this: CALL 'invoke(dynamic): dynamic' type=dynamic origin=INVOKE
|
||||||
|
$this: GET_VAR 'value-parameter a: dynamic' type=dynamic origin=VARIABLE_AS_FUNCTION
|
||||||
|
p0: GET_VAR 'value-parameter b: dynamic' type=dynamic origin=null
|
||||||
|
p0: GET_VAR 'value-parameter b: dynamic' type=dynamic origin=null
|
||||||
|
FUN name:test2c visibility:public modality:FINAL <> (a:dynamic, b:dynamic) returnType:dynamic flags:
|
||||||
|
VALUE_PARAMETER name:a index:0 type:dynamic flags:
|
||||||
|
VALUE_PARAMETER name:b index:1 type:dynamic flags:
|
||||||
|
BLOCK_BODY
|
||||||
|
RETURN type=kotlin.Nothing from='test2c(dynamic, dynamic): dynamic'
|
||||||
CALL 'invoke(dynamic): dynamic' type=dynamic origin=null
|
CALL 'invoke(dynamic): dynamic' type=dynamic origin=null
|
||||||
$this: CALL 'invoke(dynamic): dynamic' type=dynamic origin=INVOKE
|
$this: CALL 'invoke(dynamic): dynamic' type=dynamic origin=INVOKE
|
||||||
$this: GET_VAR 'value-parameter a: dynamic' type=dynamic origin=VARIABLE_AS_FUNCTION
|
$this: GET_VAR 'value-parameter a: dynamic' type=dynamic origin=VARIABLE_AS_FUNCTION
|
||||||
p0: GET_VAR 'value-parameter b: dynamic' type=dynamic origin=null
|
p0: GET_VAR 'value-parameter b: dynamic' type=dynamic origin=null
|
||||||
p0: GET_VAR 'value-parameter b: dynamic' type=dynamic origin=null
|
p0: GET_VAR 'value-parameter b: dynamic' type=dynamic origin=null
|
||||||
|
FUN name:test3 visibility:public modality:FINAL <> (a:dynamic) returnType:kotlin.Unit flags:
|
||||||
|
VALUE_PARAMETER name:a index:0 type:dynamic flags:
|
||||||
|
BLOCK_BODY
|
||||||
|
RETURN type=kotlin.Nothing from='test3(dynamic): Unit'
|
||||||
|
CALL 'invoke(): Unit' type=kotlin.Unit origin=null
|
||||||
|
|||||||
Reference in New Issue
Block a user