diff --git a/compiler/ir/ir.psi2ir/src/org/jetbrains/kotlin/psi2ir/generators/StatementGenerator.kt b/compiler/ir/ir.psi2ir/src/org/jetbrains/kotlin/psi2ir/generators/StatementGenerator.kt index 187e3dba08f..ee8d51e6a41 100644 --- a/compiler/ir/ir.psi2ir/src/org/jetbrains/kotlin/psi2ir/generators/StatementGenerator.kt +++ b/compiler/ir/ir.psi2ir/src/org/jetbrains/kotlin/psi2ir/generators/StatementGenerator.kt @@ -44,6 +44,7 @@ import org.jetbrains.kotlin.resolve.constants.CompileTimeConstant import org.jetbrains.kotlin.resolve.constants.evaluate.ConstantExpressionEvaluator import org.jetbrains.kotlin.types.KotlinType import org.jetbrains.kotlin.types.expressions.ExpressionTypingUtils +import org.jetbrains.kotlin.util.OperatorNameConventions class StatementGenerator( val bodyGenerator: BodyGenerator, @@ -294,7 +295,16 @@ class StatementGenerator( 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 { diff --git a/compiler/testData/ir/irJsText/dynamic/invokeOperator.kt b/compiler/testData/ir/irJsText/dynamic/invokeOperator.kt index 3df0f2fc80f..7288711798f 100644 --- a/compiler/testData/ir/irJsText/dynamic/invokeOperator.kt +++ b/compiler/testData/ir/irJsText/dynamic/invokeOperator.kt @@ -1,5 +1,9 @@ +fun invoke() {} + fun test1(a: dynamic) = a(1) fun test1a(a: dynamic) = a.invoke(1) fun test2(a: dynamic, b: dynamic) = a(b) fun test2a(a: dynamic, b: dynamic) = a.invoke(b) -fun test2b(a: dynamic, b: dynamic) = a(b)(b) \ No newline at end of file +fun test2b(a: dynamic, b: dynamic) = a(b)(b) +fun test2c(a: dynamic, b: dynamic) = a(b).invoke(b) +fun test3(a: dynamic) = invoke() \ No newline at end of file diff --git a/compiler/testData/ir/irJsText/dynamic/invokeOperator.txt b/compiler/testData/ir/irJsText/dynamic/invokeOperator.txt index 30b4c3f4860..c46f74fc70c 100644 --- a/compiler/testData/ir/irJsText/dynamic/invokeOperator.txt +++ b/compiler/testData/ir/irJsText/dynamic/invokeOperator.txt @@ -1,4 +1,6 @@ FILE fqName: 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: VALUE_PARAMETER name:a index:0 type:dynamic flags: BLOCK_BODY @@ -34,8 +36,23 @@ FILE fqName: fileName:/invokeOperator.kt VALUE_PARAMETER name:b index:1 type:dynamic flags: BLOCK_BODY 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 $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: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