From 92c2cfa9687b82d116836582cb2af06eb966dfd0 Mon Sep 17 00:00:00 2001 From: Georgy Bronnikov Date: Wed, 11 Dec 2019 16:52:04 +0300 Subject: [PATCH] JVM_IR: handle property references at class level --- .../backend/jvm/lower/PropertyReferenceLowering.kt | 4 +++- .../box/callableReference/property/inEnum.kt | 13 +++++++++++++ .../codegen/BlackBoxCodegenTestGenerated.java | 5 +++++ .../codegen/LightAnalysisModeTestGenerated.java | 5 +++++ .../codegen/ir/FirBlackBoxCodegenTestGenerated.java | 5 +++++ .../codegen/ir/IrBlackBoxCodegenTestGenerated.java | 5 +++++ .../ir/semantics/IrJsCodegenBoxTestGenerated.java | 5 +++++ .../test/semantics/JsCodegenBoxTestGenerated.java | 5 +++++ 8 files changed, 46 insertions(+), 1 deletion(-) create mode 100644 compiler/testData/codegen/box/callableReference/property/inEnum.kt diff --git a/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/lower/PropertyReferenceLowering.kt b/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/lower/PropertyReferenceLowering.kt index be80aa6a1e2..3f5ddff1367 100644 --- a/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/lower/PropertyReferenceLowering.kt +++ b/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/lower/PropertyReferenceLowering.kt @@ -226,7 +226,9 @@ internal class PropertyReferenceLowering(val context: JvmBackendContext) : Class // private fun createSpecializedKProperty(expression: IrCallableReference): IrExpression { val referenceClass = createKPropertySubclass(expression) - return context.createIrBuilder(currentScope!!.scope.scopeOwnerSymbol, expression.startOffset, expression.endOffset) + return context.createIrBuilder( + currentScope?.scope?.scopeOwnerSymbol ?: irClass.symbol, expression.startOffset, expression.endOffset + ) .irBlock { +referenceClass +irCall(referenceClass.constructors.single()).apply { diff --git a/compiler/testData/codegen/box/callableReference/property/inEnum.kt b/compiler/testData/codegen/box/callableReference/property/inEnum.kt new file mode 100644 index 00000000000..059d0bfb062 --- /dev/null +++ b/compiler/testData/codegen/box/callableReference/property/inEnum.kt @@ -0,0 +1,13 @@ +// IGNORE_BACKEND_FIR: JVM_IR + +import kotlin.reflect.KProperty1 + +class Q { + val s = "OK" +} + +enum class PropEnum(val prop: KProperty1) { + ELEM(Q::s) +} + +fun box() = PropEnum.ELEM.prop.get(Q()) diff --git a/compiler/tests/org/jetbrains/kotlin/codegen/BlackBoxCodegenTestGenerated.java b/compiler/tests/org/jetbrains/kotlin/codegen/BlackBoxCodegenTestGenerated.java index 49fd9c8ee0d..6b7500c381c 100644 --- a/compiler/tests/org/jetbrains/kotlin/codegen/BlackBoxCodegenTestGenerated.java +++ b/compiler/tests/org/jetbrains/kotlin/codegen/BlackBoxCodegenTestGenerated.java @@ -2456,6 +2456,11 @@ public class BlackBoxCodegenTestGenerated extends AbstractBlackBoxCodegenTest { runTest("compiler/testData/codegen/box/callableReference/property/genericProperty.kt"); } + @TestMetadata("inEnum.kt") + public void testInEnum() throws Exception { + runTest("compiler/testData/codegen/box/callableReference/property/inEnum.kt"); + } + @TestMetadata("invokePropertyReference.kt") public void testInvokePropertyReference() throws Exception { runTest("compiler/testData/codegen/box/callableReference/property/invokePropertyReference.kt"); diff --git a/compiler/tests/org/jetbrains/kotlin/codegen/LightAnalysisModeTestGenerated.java b/compiler/tests/org/jetbrains/kotlin/codegen/LightAnalysisModeTestGenerated.java index 52a626c3670..9ce4f55d9e4 100644 --- a/compiler/tests/org/jetbrains/kotlin/codegen/LightAnalysisModeTestGenerated.java +++ b/compiler/tests/org/jetbrains/kotlin/codegen/LightAnalysisModeTestGenerated.java @@ -2456,6 +2456,11 @@ public class LightAnalysisModeTestGenerated extends AbstractLightAnalysisModeTes runTest("compiler/testData/codegen/box/callableReference/property/genericProperty.kt"); } + @TestMetadata("inEnum.kt") + public void testInEnum() throws Exception { + runTest("compiler/testData/codegen/box/callableReference/property/inEnum.kt"); + } + @TestMetadata("invokePropertyReference.kt") public void testInvokePropertyReference() throws Exception { runTest("compiler/testData/codegen/box/callableReference/property/invokePropertyReference.kt"); diff --git a/compiler/tests/org/jetbrains/kotlin/codegen/ir/FirBlackBoxCodegenTestGenerated.java b/compiler/tests/org/jetbrains/kotlin/codegen/ir/FirBlackBoxCodegenTestGenerated.java index 71a7c43d851..59e16164f08 100644 --- a/compiler/tests/org/jetbrains/kotlin/codegen/ir/FirBlackBoxCodegenTestGenerated.java +++ b/compiler/tests/org/jetbrains/kotlin/codegen/ir/FirBlackBoxCodegenTestGenerated.java @@ -2436,6 +2436,11 @@ public class FirBlackBoxCodegenTestGenerated extends AbstractFirBlackBoxCodegenT runTest("compiler/testData/codegen/box/callableReference/property/genericProperty.kt"); } + @TestMetadata("inEnum.kt") + public void testInEnum() throws Exception { + runTest("compiler/testData/codegen/box/callableReference/property/inEnum.kt"); + } + @TestMetadata("invokePropertyReference.kt") public void testInvokePropertyReference() throws Exception { runTest("compiler/testData/codegen/box/callableReference/property/invokePropertyReference.kt"); diff --git a/compiler/tests/org/jetbrains/kotlin/codegen/ir/IrBlackBoxCodegenTestGenerated.java b/compiler/tests/org/jetbrains/kotlin/codegen/ir/IrBlackBoxCodegenTestGenerated.java index e7b81759139..f4666d093b3 100644 --- a/compiler/tests/org/jetbrains/kotlin/codegen/ir/IrBlackBoxCodegenTestGenerated.java +++ b/compiler/tests/org/jetbrains/kotlin/codegen/ir/IrBlackBoxCodegenTestGenerated.java @@ -2436,6 +2436,11 @@ public class IrBlackBoxCodegenTestGenerated extends AbstractIrBlackBoxCodegenTes runTest("compiler/testData/codegen/box/callableReference/property/genericProperty.kt"); } + @TestMetadata("inEnum.kt") + public void testInEnum() throws Exception { + runTest("compiler/testData/codegen/box/callableReference/property/inEnum.kt"); + } + @TestMetadata("invokePropertyReference.kt") public void testInvokePropertyReference() throws Exception { runTest("compiler/testData/codegen/box/callableReference/property/invokePropertyReference.kt"); diff --git a/js/js.tests/test/org/jetbrains/kotlin/js/test/ir/semantics/IrJsCodegenBoxTestGenerated.java b/js/js.tests/test/org/jetbrains/kotlin/js/test/ir/semantics/IrJsCodegenBoxTestGenerated.java index b2d4b5ce7be..47f3b864e6b 100644 --- a/js/js.tests/test/org/jetbrains/kotlin/js/test/ir/semantics/IrJsCodegenBoxTestGenerated.java +++ b/js/js.tests/test/org/jetbrains/kotlin/js/test/ir/semantics/IrJsCodegenBoxTestGenerated.java @@ -1911,6 +1911,11 @@ public class IrJsCodegenBoxTestGenerated extends AbstractIrJsCodegenBoxTest { runTest("compiler/testData/codegen/box/callableReference/property/genericProperty.kt"); } + @TestMetadata("inEnum.kt") + public void testInEnum() throws Exception { + runTest("compiler/testData/codegen/box/callableReference/property/inEnum.kt"); + } + @TestMetadata("invokePropertyReference.kt") public void testInvokePropertyReference() throws Exception { runTest("compiler/testData/codegen/box/callableReference/property/invokePropertyReference.kt"); diff --git a/js/js.tests/test/org/jetbrains/kotlin/js/test/semantics/JsCodegenBoxTestGenerated.java b/js/js.tests/test/org/jetbrains/kotlin/js/test/semantics/JsCodegenBoxTestGenerated.java index b905cc79fdd..95d6eac546a 100644 --- a/js/js.tests/test/org/jetbrains/kotlin/js/test/semantics/JsCodegenBoxTestGenerated.java +++ b/js/js.tests/test/org/jetbrains/kotlin/js/test/semantics/JsCodegenBoxTestGenerated.java @@ -1911,6 +1911,11 @@ public class JsCodegenBoxTestGenerated extends AbstractJsCodegenBoxTest { runTest("compiler/testData/codegen/box/callableReference/property/genericProperty.kt"); } + @TestMetadata("inEnum.kt") + public void testInEnum() throws Exception { + runTest("compiler/testData/codegen/box/callableReference/property/inEnum.kt"); + } + @TestMetadata("invokePropertyReference.kt") public void testInvokePropertyReference() throws Exception { runTest("compiler/testData/codegen/box/callableReference/property/invokePropertyReference.kt");