From 837f3b98fa54f5fabe8daf0ab8add58040c9bfe3 Mon Sep 17 00:00:00 2001 From: Anastasiya Shadrina Date: Wed, 17 Feb 2021 19:42:21 +0700 Subject: [PATCH] [FE] Allow to infer generic property type from a context receiver type --- .../FirBlackBoxCodegenTestGenerated.java | 6 ++++++ .../kotlin/resolve/DeclarationsChecker.kt | 3 +++ .../inferGenericPropertyType.kt | 19 +++++++++++++++++++ .../IrBlackBoxCodegenTestGenerated.java | 6 ++++++ 4 files changed, 34 insertions(+) create mode 100644 compiler/testData/codegen/box/extensionFunctions/contextReceivers/inferGenericPropertyType.kt 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 e153bfcba8c..4bc2b72f900 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 @@ -16157,6 +16157,12 @@ public class FirBlackBoxCodegenTestGenerated extends AbstractFirBlackBoxCodegenT runTest("compiler/testData/codegen/box/extensionFunctions/contextReceivers/dp.kt"); } + @Test + @TestMetadata("inferGenericPropertyType.kt") + public void testInferGenericPropertyType() throws Exception { + runTest("compiler/testData/codegen/box/extensionFunctions/contextReceivers/inferGenericPropertyType.kt"); + } + @Test @TestMetadata("plusMatrix.kt") public void testPlusMatrix() throws Exception { diff --git a/compiler/frontend/src/org/jetbrains/kotlin/resolve/DeclarationsChecker.kt b/compiler/frontend/src/org/jetbrains/kotlin/resolve/DeclarationsChecker.kt index 1c9927433c6..142c6606c59 100644 --- a/compiler/frontend/src/org/jetbrains/kotlin/resolve/DeclarationsChecker.kt +++ b/compiler/frontend/src/org/jetbrains/kotlin/resolve/DeclarationsChecker.kt @@ -636,6 +636,9 @@ class DeclarationsChecker( } } addAccessibleTypeParametersFromType(descriptor.extensionReceiverParameter?.type) + for (contextReceiverParameter in descriptor.contextReceiverParameters) { + addAccessibleTypeParametersFromType(contextReceiverParameter.type) + } val typeParametersInaccessibleFromReceiver = allTypeParameters - allAccessibleTypeParameters for (typeParameter in typeParametersInaccessibleFromReceiver) { diff --git a/compiler/testData/codegen/box/extensionFunctions/contextReceivers/inferGenericPropertyType.kt b/compiler/testData/codegen/box/extensionFunctions/contextReceivers/inferGenericPropertyType.kt new file mode 100644 index 00000000000..6e7d0d0d94c --- /dev/null +++ b/compiler/testData/codegen/box/extensionFunctions/contextReceivers/inferGenericPropertyType.kt @@ -0,0 +1,19 @@ +// TARGET_BACKEND: JVM_IR +// IGNORE_BACKEND_FIR: JVM_IR + +class Result(val x: T) + +context(Result) +val result: Result get() = this@Result + +fun Result.x(): T { + with(result) { + return x + } +} + +fun box(): String { + with(Result("OK")) { + return x() + } +} \ No newline at end of file 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 4a8254651dd..c8be44b6215 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 @@ -16157,6 +16157,12 @@ public class IrBlackBoxCodegenTestGenerated extends AbstractIrBlackBoxCodegenTes runTest("compiler/testData/codegen/box/extensionFunctions/contextReceivers/dp.kt"); } + @Test + @TestMetadata("inferGenericPropertyType.kt") + public void testInferGenericPropertyType() throws Exception { + runTest("compiler/testData/codegen/box/extensionFunctions/contextReceivers/inferGenericPropertyType.kt"); + } + @Test @TestMetadata("plusMatrix.kt") public void testPlusMatrix() throws Exception {