From b2aed536c99f6d425b935cef2eb3490bc150591d Mon Sep 17 00:00:00 2001 From: Dmitry Petrov Date: Mon, 30 Nov 2020 12:22:15 +0300 Subject: [PATCH] JVM_IR KT-39612 process subexpressions recursively in 'name' lowering --- .../codegen/ir/FirBytecodeTextTestGenerated.java | 5 +++++ .../common/lower/KCallableNamePropertyLowering.kt | 13 +++++++++---- .../bytecodeText/callableReference/kt39612.kt | 11 +++++++++++ .../kotlin/codegen/BytecodeTextTestGenerated.java | 5 +++++ .../codegen/ir/IrBytecodeTextTestGenerated.java | 5 +++++ 5 files changed, 35 insertions(+), 4 deletions(-) create mode 100644 compiler/testData/codegen/bytecodeText/callableReference/kt39612.kt diff --git a/compiler/fir/fir2ir/tests-gen/org/jetbrains/kotlin/codegen/ir/FirBytecodeTextTestGenerated.java b/compiler/fir/fir2ir/tests-gen/org/jetbrains/kotlin/codegen/ir/FirBytecodeTextTestGenerated.java index 319b6bd6eed..83b4453a87f 100644 --- a/compiler/fir/fir2ir/tests-gen/org/jetbrains/kotlin/codegen/ir/FirBytecodeTextTestGenerated.java +++ b/compiler/fir/fir2ir/tests-gen/org/jetbrains/kotlin/codegen/ir/FirBytecodeTextTestGenerated.java @@ -774,6 +774,11 @@ public class FirBytecodeTextTestGenerated extends AbstractFirBytecodeTextTest { runTest("compiler/testData/codegen/bytecodeText/callableReference/kt36975.kt"); } + @TestMetadata("kt39612.kt") + public void testKt39612() throws Exception { + runTest("compiler/testData/codegen/bytecodeText/callableReference/kt39612.kt"); + } + @TestMetadata("nameIntrinsicWithImplicitThis.kt") public void testNameIntrinsicWithImplicitThis() throws Exception { runTest("compiler/testData/codegen/bytecodeText/callableReference/nameIntrinsicWithImplicitThis.kt"); diff --git a/compiler/ir/backend.common/src/org/jetbrains/kotlin/backend/common/lower/KCallableNamePropertyLowering.kt b/compiler/ir/backend.common/src/org/jetbrains/kotlin/backend/common/lower/KCallableNamePropertyLowering.kt index 1e8a3834d02..a2ee86c70a5 100644 --- a/compiler/ir/backend.common/src/org/jetbrains/kotlin/backend/common/lower/KCallableNamePropertyLowering.kt +++ b/compiler/ir/backend.common/src/org/jetbrains/kotlin/backend/common/lower/KCallableNamePropertyLowering.kt @@ -55,14 +55,19 @@ private class KCallableNamePropertyTransformer(val lower: KCallableNamePropertyL } override fun visitCall(expression: IrCall): IrExpression { - val callableReference = expression.dispatchReceiver as? IrCallableReference<*> ?: return expression + val callableReference = expression.dispatchReceiver as? IrCallableReference<*> + ?: return super.visitCall(expression) - //TODO rewrite checking val directMember = expression.symbol.owner.let { (it as? IrSimpleFunction)?.correspondingPropertySymbol?.owner ?: it } - val irClass = directMember.parent as? IrClass ?: return expression - if (!irClass.isSubclassOf(lower.context.irBuiltIns.kCallableClass.owner)) return expression + + val irClass = directMember.parent as? IrClass + ?: return super.visitCall(expression) + if (!irClass.isSubclassOf(lower.context.irBuiltIns.kCallableClass.owner)) { + return super.visitCall(expression) + } + val name = when (directMember) { is IrSimpleFunction -> directMember.name is IrProperty -> directMember.name diff --git a/compiler/testData/codegen/bytecodeText/callableReference/kt39612.kt b/compiler/testData/codegen/bytecodeText/callableReference/kt39612.kt new file mode 100644 index 00000000000..f9da0cf410d --- /dev/null +++ b/compiler/testData/codegen/bytecodeText/callableReference/kt39612.kt @@ -0,0 +1,11 @@ +// IGNORE_BACKEND_FIR: JVM_IR +fun foo() {} + +fun id(s: String) = s + +fun test1() = id(::foo.name) + +fun test2(name: String) = (if (name == ::foo.name) ::foo else ::id).annotations + +// 0 getName +// 3 LDC "foo" \ No newline at end of file diff --git a/compiler/tests-gen/org/jetbrains/kotlin/codegen/BytecodeTextTestGenerated.java b/compiler/tests-gen/org/jetbrains/kotlin/codegen/BytecodeTextTestGenerated.java index 93a10805ec3..b4e160d8211 100644 --- a/compiler/tests-gen/org/jetbrains/kotlin/codegen/BytecodeTextTestGenerated.java +++ b/compiler/tests-gen/org/jetbrains/kotlin/codegen/BytecodeTextTestGenerated.java @@ -774,6 +774,11 @@ public class BytecodeTextTestGenerated extends AbstractBytecodeTextTest { runTest("compiler/testData/codegen/bytecodeText/callableReference/kt36975.kt"); } + @TestMetadata("kt39612.kt") + public void testKt39612() throws Exception { + runTest("compiler/testData/codegen/bytecodeText/callableReference/kt39612.kt"); + } + @TestMetadata("nameIntrinsicWithImplicitThis.kt") public void testNameIntrinsicWithImplicitThis() throws Exception { runTest("compiler/testData/codegen/bytecodeText/callableReference/nameIntrinsicWithImplicitThis.kt"); diff --git a/compiler/tests-gen/org/jetbrains/kotlin/codegen/ir/IrBytecodeTextTestGenerated.java b/compiler/tests-gen/org/jetbrains/kotlin/codegen/ir/IrBytecodeTextTestGenerated.java index 5c6213c0ca3..315f7cd4837 100644 --- a/compiler/tests-gen/org/jetbrains/kotlin/codegen/ir/IrBytecodeTextTestGenerated.java +++ b/compiler/tests-gen/org/jetbrains/kotlin/codegen/ir/IrBytecodeTextTestGenerated.java @@ -774,6 +774,11 @@ public class IrBytecodeTextTestGenerated extends AbstractIrBytecodeTextTest { runTest("compiler/testData/codegen/bytecodeText/callableReference/kt36975.kt"); } + @TestMetadata("kt39612.kt") + public void testKt39612() throws Exception { + runTest("compiler/testData/codegen/bytecodeText/callableReference/kt39612.kt"); + } + @TestMetadata("nameIntrinsicWithImplicitThis.kt") public void testNameIntrinsicWithImplicitThis() throws Exception { runTest("compiler/testData/codegen/bytecodeText/callableReference/nameIntrinsicWithImplicitThis.kt");