[FE] Pass context receiver parameters where necessary

This commit is contained in:
Anastasiya Shadrina
2021-02-03 15:55:48 +07:00
committed by TeamCityServer
parent a39fbd3822
commit c5687e080d
4 changed files with 48 additions and 7 deletions
@@ -97,8 +97,11 @@ open class AccessorForPropertyDescriptor private constructor(
init {
setType(
propertyType, emptyList<TypeParameterDescriptorImpl>(), dispatchReceiverParameter,
DescriptorFactory.createExtensionReceiverParameterForCallable(this, receiverType, Annotations.EMPTY), emptyList() // TODO: Pass context receivers
propertyType,
emptyList<TypeParameterDescriptorImpl>(),
dispatchReceiverParameter,
DescriptorFactory.createExtensionReceiverParameterForCallable(this, receiverType, Annotations.EMPTY),
original.contextReceiverParameters
)
val getterDescriptor =
@@ -108,6 +108,9 @@ public interface FunctionDescriptor extends CallableMemberDescriptor {
@Override
CopyBuilder<D> setReturnType(@NotNull KotlinType type);
@NotNull
CopyBuilder<D> setContextReceiverParameters(@NotNull List<ReceiverParameterDescriptor> contextReceiverParameters);
@NotNull
CopyBuilder<D> setExtensionReceiverParameter(@Nullable ReceiverParameterDescriptor extensionReceiverParameter);
@@ -370,6 +370,7 @@ public abstract class FunctionDescriptorImpl extends DeclarationDescriptorNonRoo
protected @Nullable FunctionDescriptor original = null;
protected @NotNull Kind kind;
protected @NotNull List<ValueParameterDescriptor> newValueParameterDescriptors;
protected @NotNull List<ReceiverParameterDescriptor> 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<ValueParameterDescriptor> newValueParameterDescriptors,
@NotNull List<ReceiverParameterDescriptor> 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<FunctionDescriptor> setContextReceiverParameters(@NotNull List<ReceiverParameterDescriptor> 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<ReceiverParameterDescriptor> substitutedContextReceiverParameters = new ArrayList<ReceiverParameterDescriptor>();
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.<ReceiverParameterDescriptor>emptyList(),
substitutedReceiverParameter, substitutedExpectedThis, substitutedContextReceiverParameters,
substitutedTypeParameters,
substitutedValueParameters,
substitutedReturnType,
@@ -121,6 +121,12 @@ public class ErrorSimpleFunctionDescriptorImpl extends SimpleFunctionDescriptorI
return this;
}
@NotNull
@Override
public CopyBuilder<SimpleFunctionDescriptor> setContextReceiverParameters(@NotNull List<ReceiverParameterDescriptor> contextReceiverParameters) {
return this;
}
@NotNull
@Override
public CopyBuilder<SimpleFunctionDescriptor> setExtensionReceiverParameter(@Nullable ReceiverParameterDescriptor extensionReceiverParameter) {