diff --git a/compiler/backend/src/org/jetbrains/kotlin/codegen/AccessorForPropertyDescriptor.kt b/compiler/backend/src/org/jetbrains/kotlin/codegen/AccessorForPropertyDescriptor.kt index e6705027ae4..9786252d375 100644 --- a/compiler/backend/src/org/jetbrains/kotlin/codegen/AccessorForPropertyDescriptor.kt +++ b/compiler/backend/src/org/jetbrains/kotlin/codegen/AccessorForPropertyDescriptor.kt @@ -97,8 +97,11 @@ open class AccessorForPropertyDescriptor private constructor( init { setType( - propertyType, emptyList(), dispatchReceiverParameter, - DescriptorFactory.createExtensionReceiverParameterForCallable(this, receiverType, Annotations.EMPTY), emptyList() // TODO: Pass context receivers + propertyType, + emptyList(), + dispatchReceiverParameter, + DescriptorFactory.createExtensionReceiverParameterForCallable(this, receiverType, Annotations.EMPTY), + original.contextReceiverParameters ) val getterDescriptor = diff --git a/core/descriptors/src/org/jetbrains/kotlin/descriptors/FunctionDescriptor.java b/core/descriptors/src/org/jetbrains/kotlin/descriptors/FunctionDescriptor.java index 65913e4dae0..fac13c824f0 100644 --- a/core/descriptors/src/org/jetbrains/kotlin/descriptors/FunctionDescriptor.java +++ b/core/descriptors/src/org/jetbrains/kotlin/descriptors/FunctionDescriptor.java @@ -108,6 +108,9 @@ public interface FunctionDescriptor extends CallableMemberDescriptor { @Override CopyBuilder setReturnType(@NotNull KotlinType type); + @NotNull + CopyBuilder setContextReceiverParameters(@NotNull List contextReceiverParameters); + @NotNull CopyBuilder setExtensionReceiverParameter(@Nullable ReceiverParameterDescriptor extensionReceiverParameter); diff --git a/core/descriptors/src/org/jetbrains/kotlin/descriptors/impl/FunctionDescriptorImpl.java b/core/descriptors/src/org/jetbrains/kotlin/descriptors/impl/FunctionDescriptorImpl.java index 2a519e3dab9..abb199f79b5 100644 --- a/core/descriptors/src/org/jetbrains/kotlin/descriptors/impl/FunctionDescriptorImpl.java +++ b/core/descriptors/src/org/jetbrains/kotlin/descriptors/impl/FunctionDescriptorImpl.java @@ -370,6 +370,7 @@ public abstract class FunctionDescriptorImpl extends DeclarationDescriptorNonRoo protected @Nullable FunctionDescriptor original = null; protected @NotNull Kind kind; protected @NotNull List newValueParameterDescriptors; + protected @NotNull List newContextReceiverParameters; protected @Nullable ReceiverParameterDescriptor newExtensionReceiverParameter; protected @Nullable ReceiverParameterDescriptor dispatchReceiverParameter = FunctionDescriptorImpl.this.dispatchReceiverParameter; protected @NotNull KotlinType newReturnType; @@ -393,6 +394,7 @@ public abstract class FunctionDescriptorImpl extends DeclarationDescriptorNonRoo @NotNull DescriptorVisibility newVisibility, @NotNull Kind kind, @NotNull List newValueParameterDescriptors, + @NotNull List newContextReceiverParameters, @Nullable ReceiverParameterDescriptor newExtensionReceiverParameter, @NotNull KotlinType newReturnType, @Nullable Name name @@ -403,6 +405,7 @@ public abstract class FunctionDescriptorImpl extends DeclarationDescriptorNonRoo this.newVisibility = newVisibility; this.kind = kind; this.newValueParameterDescriptors = newValueParameterDescriptors; + this.newContextReceiverParameters = newContextReceiverParameters; this.newExtensionReceiverParameter = newExtensionReceiverParameter; this.newReturnType = newReturnType; this.name = name; @@ -471,6 +474,13 @@ public abstract class FunctionDescriptorImpl extends DeclarationDescriptorNonRoo return this; } + @NotNull + @Override + public CopyBuilder setContextReceiverParameters(@NotNull List contextReceiverParameters) { + this.newContextReceiverParameters = contextReceiverParameters; + return this; + } + @NotNull @Override public CopyConfiguration setExtensionReceiverParameter(@Nullable ReceiverParameterDescriptor extensionReceiverParameter) { @@ -586,9 +596,8 @@ public abstract class FunctionDescriptorImpl extends DeclarationDescriptorNonRoo protected CopyConfiguration newCopyBuilder(@NotNull TypeSubstitutor substitutor) { return new CopyConfiguration( substitutor.getSubstitution(), - getContainingDeclaration(), getModality(), getVisibility(), getKind(), getValueParameters(), - getExtensionReceiverParameter(), getReturnType(), null - ); + getContainingDeclaration(), getModality(), getVisibility(), getKind(), getValueParameters(), getContextReceiverParameters(), + getExtensionReceiverParameter(), getReturnType(), null); } @Nullable @@ -615,6 +624,27 @@ public abstract class FunctionDescriptorImpl extends DeclarationDescriptorNonRoo ); if (substitutor == null) return null; + List substitutedContextReceiverParameters = new ArrayList(); + if (!configuration.newContextReceiverParameters.isEmpty()) { + for (ReceiverParameterDescriptor newContextReceiverParameter : configuration.newContextReceiverParameters) { + KotlinType substitutedContextReceiverType = + substitutor.substitute(newContextReceiverParameter.getType(), Variance.IN_VARIANCE); + if (substitutedContextReceiverType == null) { + return null; + } + ReceiverParameterDescriptor substitutedContextReceiverParameter = new ReceiverParameterDescriptorImpl( + substitutedDescriptor, + new ExtensionReceiver( + substitutedDescriptor, substitutedContextReceiverType, newContextReceiverParameter.getValue() + ), + newContextReceiverParameter.getAnnotations() + ); + substitutedContextReceiverParameters.add(substitutedContextReceiverParameter); + + wereChanges[0] |= substitutedContextReceiverType != newContextReceiverParameter.getType(); + } + } + ReceiverParameterDescriptor substitutedReceiverParameter = null; if (configuration.newExtensionReceiverParameter != null) { KotlinType substitutedExtensionReceiverType = @@ -672,9 +702,8 @@ public abstract class FunctionDescriptorImpl extends DeclarationDescriptorNonRoo return this; } - // TODO: Substitute context receivers substitutedDescriptor.initialize( - substitutedReceiverParameter, substitutedExpectedThis, CollectionsKt.emptyList(), + substitutedReceiverParameter, substitutedExpectedThis, substitutedContextReceiverParameters, substitutedTypeParameters, substitutedValueParameters, substitutedReturnType, diff --git a/core/descriptors/src/org/jetbrains/kotlin/types/error/ErrorSimpleFunctionDescriptorImpl.java b/core/descriptors/src/org/jetbrains/kotlin/types/error/ErrorSimpleFunctionDescriptorImpl.java index bf81400b53e..76e50451839 100644 --- a/core/descriptors/src/org/jetbrains/kotlin/types/error/ErrorSimpleFunctionDescriptorImpl.java +++ b/core/descriptors/src/org/jetbrains/kotlin/types/error/ErrorSimpleFunctionDescriptorImpl.java @@ -121,6 +121,12 @@ public class ErrorSimpleFunctionDescriptorImpl extends SimpleFunctionDescriptorI return this; } + @NotNull + @Override + public CopyBuilder setContextReceiverParameters(@NotNull List contextReceiverParameters) { + return this; + } + @NotNull @Override public CopyBuilder setExtensionReceiverParameter(@Nullable ReceiverParameterDescriptor extensionReceiverParameter) {