From ddc9c1bd1bc878ce24d8b7f14004503f3081a325 Mon Sep 17 00:00:00 2001 From: Andrey Zinovyev Date: Tue, 25 May 2021 18:10:38 +0300 Subject: [PATCH] [FIR] Fix extension property reference resolution On type with star projection #KT-44372 Fixed --- .../references/referenceToExtension.fir.txt | 4 ++-- .../references/referenceToExtension.kt | 4 ++-- .../FirBlackBoxCodegenTestGenerated.java | 6 +++++ .../calls/CallableReferenceResolution.kt | 3 ++- .../function/extensionProperty.kt | 23 +++++++++++++++++++ ...proximateContravariantCapturedTypes.fir.kt | 8 +++---- .../codegen/BlackBoxCodegenTestGenerated.java | 6 +++++ .../IrBlackBoxCodegenTestGenerated.java | 6 +++++ .../LightAnalysisModeTestGenerated.java | 5 ++++ 9 files changed, 56 insertions(+), 9 deletions(-) create mode 100644 compiler/testData/codegen/box/callableReference/function/extensionProperty.kt diff --git a/compiler/fir/analysis-tests/testData/resolve/references/referenceToExtension.fir.txt b/compiler/fir/analysis-tests/testData/resolve/references/referenceToExtension.fir.txt index e4a999ae344..3210aeec2a9 100644 --- a/compiler/fir/analysis-tests/testData/resolve/references/referenceToExtension.fir.txt +++ b/compiler/fir/analysis-tests/testData/resolve/references/referenceToExtension.fir.txt @@ -40,8 +40,8 @@ FILE: referenceToExtension.kt } public final fun test_2(): R|kotlin/Unit| { - lval extensionValRef: = Q|GenericTest.B|::# - lval extensionFunRef: = Q|GenericTest.B|::# + lval extensionValRef: R|kotlin/reflect/KProperty1, GenericTest.A>| = Q|GenericTest.B|::R|/GenericTest.extensionVal| + lval extensionFunRef: R|@ExtensionFunctionType kotlin/reflect/KFunction1, GenericTest.A>| = Q|GenericTest.B|::R|/GenericTest.extensionFun| } } diff --git a/compiler/fir/analysis-tests/testData/resolve/references/referenceToExtension.kt b/compiler/fir/analysis-tests/testData/resolve/references/referenceToExtension.kt index f4ad623b289..7e9ad3e59ff 100644 --- a/compiler/fir/analysis-tests/testData/resolve/references/referenceToExtension.kt +++ b/compiler/fir/analysis-tests/testData/resolve/references/referenceToExtension.kt @@ -17,8 +17,8 @@ class GenericTest { } fun test_2() { - val extensionValRef = B<*>::extensionVal - val extensionFunRef = B<*>::extensionFun + val extensionValRef = B<*>::extensionVal + val extensionFunRef = B<*>::extensionFun } } diff --git a/compiler/fir/fir2ir/tests-gen/org/jetbrains/kotlin/test/runners/codegen/FirBlackBoxCodegenTestGenerated.java b/compiler/fir/fir2ir/tests-gen/org/jetbrains/kotlin/test/runners/codegen/FirBlackBoxCodegenTestGenerated.java index f7d288f1c07..ca0a1ac4cfa 100644 --- a/compiler/fir/fir2ir/tests-gen/org/jetbrains/kotlin/test/runners/codegen/FirBlackBoxCodegenTestGenerated.java +++ b/compiler/fir/fir2ir/tests-gen/org/jetbrains/kotlin/test/runners/codegen/FirBlackBoxCodegenTestGenerated.java @@ -3339,6 +3339,12 @@ public class FirBlackBoxCodegenTestGenerated extends AbstractFirBlackBoxCodegenT runTest("compiler/testData/codegen/box/callableReference/function/extensionFromTopLevelUnitOneStringArg.kt"); } + @Test + @TestMetadata("extensionProperty.kt") + public void testExtensionProperty() throws Exception { + runTest("compiler/testData/codegen/box/callableReference/function/extensionProperty.kt"); + } + @Test @TestMetadata("genericCallableReferenceArguments.kt") public void testGenericCallableReferenceArguments() throws Exception { diff --git a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/calls/CallableReferenceResolution.kt b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/calls/CallableReferenceResolution.kt index 93e02808c90..9d5653b5013 100644 --- a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/calls/CallableReferenceResolution.kt +++ b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/calls/CallableReferenceResolution.kt @@ -66,7 +66,8 @@ internal object CheckCallableReferenceExpectedType : CheckerStage() { ?.let(candidate.substitutor::substituteOrSelf) if (resultingReceiverType != null && declarationReceiverType != null) { - addSubtypeConstraint(resultingReceiverType, declarationReceiverType, position) + val capturedReceiver = context.inferenceComponents.ctx.captureFromExpression(resultingReceiverType) ?: resultingReceiverType + addSubtypeConstraint(capturedReceiver, declarationReceiverType, position) } } diff --git a/compiler/testData/codegen/box/callableReference/function/extensionProperty.kt b/compiler/testData/codegen/box/callableReference/function/extensionProperty.kt new file mode 100644 index 00000000000..7458a223f0f --- /dev/null +++ b/compiler/testData/codegen/box/callableReference/function/extensionProperty.kt @@ -0,0 +1,23 @@ +// TARGET_BACKEND: JVM +// WITH_RUNTIME + +import kotlin.reflect.KClass + +fun box(): String { + val arr: Array> = arrayOf(String::class, Number::class) as Array> + val xs = arr.myMap { it.java }.toList() + val ys = arr.myMap(KClass<*>::java).toList() + if (xs != ys) return "fail1" + if (!arr.foo()) return "fail2" + return "OK" +} + +public inline fun Array.myMap(transform: (A) -> B): List { + return mapTo(ArrayList(size), transform) +} + +fun Any?.foo(): Boolean { + val result = (this as Array>).map(KClass<*>::java).toList() + val withLambda = (this as Array>).map { it.java }.toList() + return result == withLambda +} \ No newline at end of file diff --git a/compiler/testData/diagnostics/tests/inference/capturedTypes/approximateContravariantCapturedTypes.fir.kt b/compiler/testData/diagnostics/tests/inference/capturedTypes/approximateContravariantCapturedTypes.fir.kt index 9bc610f707d..2ca5bf8f5c6 100644 --- a/compiler/testData/diagnostics/tests/inference/capturedTypes/approximateContravariantCapturedTypes.fir.kt +++ b/compiler/testData/diagnostics/tests/inference/capturedTypes/approximateContravariantCapturedTypes.fir.kt @@ -24,10 +24,10 @@ fun Foo2.setX(y: T): T { fun Float.bar() {} fun test1() { - val fooSetRef = Foo<*>::setX + val fooSetRef = , CapturedType(*), CapturedType(*)>")!>Foo<*>::setX val foo = Foo(1f) - fooSetRef.invoke(foo, 1) + fooSetRef.invoke(foo, 1) foo.x.bar() } @@ -42,10 +42,10 @@ fun test2() { } fun test3() { - val fooSetRef = Foo2<*>::setX + val fooSetRef = , CapturedType(*), CapturedType(*)>")!>Foo2<*>::setX val foo = Foo2(1) - fooSetRef.invoke(foo, "") + fooSetRef.invoke(foo, "") foo.x.bar() } diff --git a/compiler/tests-common-new/tests-gen/org/jetbrains/kotlin/test/runners/codegen/BlackBoxCodegenTestGenerated.java b/compiler/tests-common-new/tests-gen/org/jetbrains/kotlin/test/runners/codegen/BlackBoxCodegenTestGenerated.java index 2ef7e753ad0..a04aabf3fa3 100644 --- a/compiler/tests-common-new/tests-gen/org/jetbrains/kotlin/test/runners/codegen/BlackBoxCodegenTestGenerated.java +++ b/compiler/tests-common-new/tests-gen/org/jetbrains/kotlin/test/runners/codegen/BlackBoxCodegenTestGenerated.java @@ -3339,6 +3339,12 @@ public class BlackBoxCodegenTestGenerated extends AbstractBlackBoxCodegenTest { runTest("compiler/testData/codegen/box/callableReference/function/extensionFromTopLevelUnitOneStringArg.kt"); } + @Test + @TestMetadata("extensionProperty.kt") + public void testExtensionProperty() throws Exception { + runTest("compiler/testData/codegen/box/callableReference/function/extensionProperty.kt"); + } + @Test @TestMetadata("genericCallableReferenceArguments.kt") public void testGenericCallableReferenceArguments() throws Exception { diff --git a/compiler/tests-common-new/tests-gen/org/jetbrains/kotlin/test/runners/codegen/IrBlackBoxCodegenTestGenerated.java b/compiler/tests-common-new/tests-gen/org/jetbrains/kotlin/test/runners/codegen/IrBlackBoxCodegenTestGenerated.java index 7eadfaf98e3..48efad5c2f6 100644 --- a/compiler/tests-common-new/tests-gen/org/jetbrains/kotlin/test/runners/codegen/IrBlackBoxCodegenTestGenerated.java +++ b/compiler/tests-common-new/tests-gen/org/jetbrains/kotlin/test/runners/codegen/IrBlackBoxCodegenTestGenerated.java @@ -3339,6 +3339,12 @@ public class IrBlackBoxCodegenTestGenerated extends AbstractIrBlackBoxCodegenTes runTest("compiler/testData/codegen/box/callableReference/function/extensionFromTopLevelUnitOneStringArg.kt"); } + @Test + @TestMetadata("extensionProperty.kt") + public void testExtensionProperty() throws Exception { + runTest("compiler/testData/codegen/box/callableReference/function/extensionProperty.kt"); + } + @Test @TestMetadata("genericCallableReferenceArguments.kt") public void testGenericCallableReferenceArguments() throws Exception { diff --git a/compiler/tests-gen/org/jetbrains/kotlin/codegen/LightAnalysisModeTestGenerated.java b/compiler/tests-gen/org/jetbrains/kotlin/codegen/LightAnalysisModeTestGenerated.java index 1bb9fa95598..84be58fe4ad 100644 --- a/compiler/tests-gen/org/jetbrains/kotlin/codegen/LightAnalysisModeTestGenerated.java +++ b/compiler/tests-gen/org/jetbrains/kotlin/codegen/LightAnalysisModeTestGenerated.java @@ -2922,6 +2922,11 @@ public class LightAnalysisModeTestGenerated extends AbstractLightAnalysisModeTes runTest("compiler/testData/codegen/box/callableReference/function/extensionFromTopLevelUnitOneStringArg.kt"); } + @TestMetadata("extensionProperty.kt") + public void testExtensionProperty() throws Exception { + runTest("compiler/testData/codegen/box/callableReference/function/extensionProperty.kt"); + } + @TestMetadata("genericCallableReferenceArguments.kt") public void testGenericCallableReferenceArguments() throws Exception { runTest("compiler/testData/codegen/box/callableReference/function/genericCallableReferenceArguments.kt");