From bd4e51f304af5b0f8b3124384af8badc5f2f8f51 Mon Sep 17 00:00:00 2001 From: Anastasiya Shadrina Date: Wed, 17 Nov 2021 05:14:30 +0700 Subject: [PATCH] [FE, PSI2IR] Pass context receivers when calling typealias constructor --- .../FirBlackBoxCodegenTestGenerated.java | 6 ++++++ .../lazy/descriptors/LazyClassDescriptor.java | 4 ++-- .../generators/ArgumentsGenerationUtils.kt | 2 +- .../typealiasForContextualClass.kt | 17 +++++++++++++++++ .../codegen/IrBlackBoxCodegenTestGenerated.java | 6 ++++++ .../impl/TypeAliasConstructorDescriptor.kt | 15 +++++++++++++-- .../kotlin/resolve/DescriptorFactory.java | 12 ++++++++++++ .../NativeExtBlackBoxTestGenerated.java | 6 ++++++ 8 files changed, 63 insertions(+), 5 deletions(-) create mode 100644 compiler/testData/codegen/box/extensionClasses/typealiasForContextualClass.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 7d9d1f713dd..a036a3a370c 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 @@ -15976,6 +15976,12 @@ public class FirBlackBoxCodegenTestGenerated extends AbstractFirBlackBoxCodegenT runTest("compiler/testData/codegen/box/extensionClasses/simple.kt"); } + @Test + @TestMetadata("typealiasForContextualClass.kt") + public void testTypealiasForContextualClass() throws Exception { + runTest("compiler/testData/codegen/box/extensionClasses/typealiasForContextualClass.kt"); + } + @Test @TestMetadata("useFromAnotherModule.kt") public void testUseFromAnotherModule() throws Exception { diff --git a/compiler/frontend/src/org/jetbrains/kotlin/resolve/lazy/descriptors/LazyClassDescriptor.java b/compiler/frontend/src/org/jetbrains/kotlin/resolve/lazy/descriptors/LazyClassDescriptor.java index def2200538a..bc3d59698d1 100644 --- a/compiler/frontend/src/org/jetbrains/kotlin/resolve/lazy/descriptors/LazyClassDescriptor.java +++ b/compiler/frontend/src/org/jetbrains/kotlin/resolve/lazy/descriptors/LazyClassDescriptor.java @@ -311,9 +311,9 @@ public class LazyClassDescriptor extends ClassDescriptorBase implements ClassDes .map(typeReference -> { KotlinType kotlinType = c.getTypeResolver().resolveType(getScopeForClassHeaderResolution(), typeReference, c.getTrace(), true); - return new ReceiverParameterDescriptorImpl( + return DescriptorFactory.createContextReceiverParameterForClass( this, - new ContextClassReceiver(this, kotlinType, null), + kotlinType, Annotations.Companion.getEMPTY() ); }).collect(Collectors.toList()); diff --git a/compiler/ir/ir.psi2ir/src/org/jetbrains/kotlin/psi2ir/generators/ArgumentsGenerationUtils.kt b/compiler/ir/ir.psi2ir/src/org/jetbrains/kotlin/psi2ir/generators/ArgumentsGenerationUtils.kt index 3f46fb2579f..ac753c34bce 100644 --- a/compiler/ir/ir.psi2ir/src/org/jetbrains/kotlin/psi2ir/generators/ArgumentsGenerationUtils.kt +++ b/compiler/ir/ir.psi2ir/src/org/jetbrains/kotlin/psi2ir/generators/ArgumentsGenerationUtils.kt @@ -252,7 +252,7 @@ fun StatementGenerator.generateCallReceiver( } dispatchReceiverValue = generateReceiverOrNull(ktDefaultElement, extensionReceiver ?: dispatchReceiver) extensionReceiverValue = null - contextReceiverValues = emptyList() + contextReceiverValues = contextReceivers.mapNotNull { generateReceiverOrNull(ktDefaultElement, it) } } else -> { dispatchReceiverValue = generateReceiverOrNull(ktDefaultElement, dispatchReceiver) diff --git a/compiler/testData/codegen/box/extensionClasses/typealiasForContextualClass.kt b/compiler/testData/codegen/box/extensionClasses/typealiasForContextualClass.kt new file mode 100644 index 00000000000..7784e554637 --- /dev/null +++ b/compiler/testData/codegen/box/extensionClasses/typealiasForContextualClass.kt @@ -0,0 +1,17 @@ +// !LANGUAGE: +ContextReceivers +// TARGET_BACKEND: JVM_IR +// IGNORE_BACKEND_FIR: JVM_IR + +class A { + val ok = "OK" +} + +context(A) +class B { + val result = ok +} + +typealias C = B + +fun box(): String = + with(A()) { C().result } \ 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 b8f76845901..f8bf505ee6e 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 @@ -15976,6 +15976,12 @@ public class IrBlackBoxCodegenTestGenerated extends AbstractIrBlackBoxCodegenTes runTest("compiler/testData/codegen/box/extensionClasses/simple.kt"); } + @Test + @TestMetadata("typealiasForContextualClass.kt") + public void testTypealiasForContextualClass() throws Exception { + runTest("compiler/testData/codegen/box/extensionClasses/typealiasForContextualClass.kt"); + } + @Test @TestMetadata("useFromAnotherModule.kt") public void testUseFromAnotherModule() throws Exception { diff --git a/core/descriptors/src/org/jetbrains/kotlin/descriptors/impl/TypeAliasConstructorDescriptor.kt b/core/descriptors/src/org/jetbrains/kotlin/descriptors/impl/TypeAliasConstructorDescriptor.kt index b0ccadad7a4..28a221e890a 100644 --- a/core/descriptors/src/org/jetbrains/kotlin/descriptors/impl/TypeAliasConstructorDescriptor.kt +++ b/core/descriptors/src/org/jetbrains/kotlin/descriptors/impl/TypeAliasConstructorDescriptor.kt @@ -83,7 +83,7 @@ class TypeAliasConstructorDescriptorImpl private constructor( typeAliasConstructor.initialize( null, underlyingConstructorDescriptor.dispatchReceiverParameter?.substitute(substitutorForUnderlyingClass), - emptyList(), + underlyingConstructorDescriptor.contextReceiverParameters.map { it.substitute(substitutorForUnderlyingClass) }, typeAliasDescriptor.declaredTypeParameters, valueParameters, returnType, @@ -203,10 +203,21 @@ class TypeAliasConstructorDescriptorImpl private constructor( ) } + val classDescriptor = typeAliasDescriptor.classDescriptor + val contextReceiverParameters = classDescriptor?.let { + constructor.contextReceiverParameters.map { + DescriptorFactory.createContextReceiverParameterForClass( + classDescriptor, + substitutorForUnderlyingClass.safeSubstitute(it.type, Variance.INVARIANT), + Annotations.EMPTY + ) + } + } ?: emptyList() + typeAliasConstructor.initialize( receiverParameter, null, - emptyList(), + contextReceiverParameters, typeAliasDescriptor.declaredTypeParameters, valueParameters, returnType, diff --git a/core/descriptors/src/org/jetbrains/kotlin/resolve/DescriptorFactory.java b/core/descriptors/src/org/jetbrains/kotlin/resolve/DescriptorFactory.java index eac53316e88..f5ac834aab6 100644 --- a/core/descriptors/src/org/jetbrains/kotlin/resolve/DescriptorFactory.java +++ b/core/descriptors/src/org/jetbrains/kotlin/resolve/DescriptorFactory.java @@ -22,6 +22,7 @@ import org.jetbrains.kotlin.descriptors.*; import org.jetbrains.kotlin.descriptors.annotations.Annotations; import org.jetbrains.kotlin.descriptors.impl.*; import org.jetbrains.kotlin.name.Name; +import org.jetbrains.kotlin.resolve.scopes.receivers.ContextClassReceiver; import org.jetbrains.kotlin.resolve.scopes.receivers.ContextReceiver; import org.jetbrains.kotlin.resolve.scopes.receivers.ExtensionReceiver; import org.jetbrains.kotlin.types.KotlinType; @@ -205,4 +206,15 @@ public class DescriptorFactory { ? null : new ReceiverParameterDescriptorImpl(owner, new ContextReceiver(owner, receiverParameterType, null), annotations); } + + @Nullable + public static ReceiverParameterDescriptor createContextReceiverParameterForClass( + @NotNull ClassDescriptor owner, + @Nullable KotlinType receiverParameterType, + @NotNull Annotations annotations + ) { + return receiverParameterType == null + ? null + : new ReceiverParameterDescriptorImpl(owner, new ContextClassReceiver(owner, receiverParameterType, null), annotations); + } } diff --git a/native/native.tests/tests-gen/org/jetbrains/kotlin/konan/blackboxtest/NativeExtBlackBoxTestGenerated.java b/native/native.tests/tests-gen/org/jetbrains/kotlin/konan/blackboxtest/NativeExtBlackBoxTestGenerated.java index a12779f583a..1b43228e5ac 100644 --- a/native/native.tests/tests-gen/org/jetbrains/kotlin/konan/blackboxtest/NativeExtBlackBoxTestGenerated.java +++ b/native/native.tests/tests-gen/org/jetbrains/kotlin/konan/blackboxtest/NativeExtBlackBoxTestGenerated.java @@ -16161,6 +16161,12 @@ public class NativeExtBlackBoxTestGenerated extends AbstractNativeBlackBoxTest { runTest("compiler/testData/codegen/box/extensionClasses/simple.kt"); } + @Test + @TestMetadata("typealiasForContextualClass.kt") + public void testTypealiasForContextualClass() throws Exception { + runTest("compiler/testData/codegen/box/extensionClasses/typealiasForContextualClass.kt"); + } + @Test @TestMetadata("useFromAnotherModule.kt") public void testUseFromAnotherModule() throws Exception {