[FE] Add getContextReceivers to CallableDescriptor interface

This commit is contained in:
Anastasiya Shadrina
2020-07-15 17:57:19 +07:00
committed by TeamCityServer
parent 7de8380ddf
commit a39fbd3822
61 changed files with 194 additions and 63 deletions
@@ -24,7 +24,7 @@ class AccessorForCompanionObjectInstanceFieldDescriptor(
init {
initialize(
null, null, emptyList(), emptyList(),
null, null, emptyList(), emptyList(), emptyList(),
companionObjectDescriptor.defaultType,
Modality.FINAL,
DescriptorVisibilities.LOCAL
@@ -57,6 +57,7 @@ class AccessorForConstructorDescriptor(
initialize(
calleeDescriptor.extensionReceiverParameter?.copy(this),
calleeDescriptor.dispatchReceiverParameter,
calleeDescriptor.contextReceiverParameters.map { p -> p.copy(this) },
copyTypeParameters(calleeDescriptor),
copyValueParameters(calleeDescriptor),
calleeDescriptor.returnType,
@@ -39,6 +39,7 @@ class AccessorForFunctionDescriptor(
null
else
calleeDescriptor.dispatchReceiverParameter,
calleeDescriptor.contextReceiverParameters.map { p -> p.copy(this) },
copyTypeParameters(calleeDescriptor),
copyValueParameters(calleeDescriptor),
calleeDescriptor.returnType,
@@ -98,7 +98,7 @@ open class AccessorForPropertyDescriptor private constructor(
init {
setType(
propertyType, emptyList<TypeParameterDescriptorImpl>(), dispatchReceiverParameter,
DescriptorFactory.createExtensionReceiverParameterForCallable(this, receiverType, Annotations.EMPTY)
DescriptorFactory.createExtensionReceiverParameterForCallable(this, receiverType, Annotations.EMPTY), emptyList() // TODO: Pass context receivers
)
val getterDescriptor =
@@ -261,6 +261,7 @@ public class ClosureCodegen extends MemberCodegen<KtElement> {
descriptorForBridges
.initialize(erasedInterfaceFunction.getExtensionReceiverParameter(), erasedInterfaceFunction.getDispatchReceiverParameter(),
erasedInterfaceFunction.getContextReceiverParameters(),
erasedInterfaceFunction.getTypeParameters(), erasedInterfaceFunction.getValueParameters(),
erasedInterfaceFunction.getReturnType(), Modality.OPEN, erasedInterfaceFunction.getVisibility());
@@ -487,7 +487,7 @@ public abstract class MemberCodegen<T extends KtPureElement/* TODO: & KtDeclarat
private SimpleFunctionDescriptorImpl createClInitFunctionDescriptor(@NotNull DeclarationDescriptor descriptor) {
SimpleFunctionDescriptorImpl clInit = SimpleFunctionDescriptorImpl.create(descriptor, Annotations.Companion.getEMPTY(),
Name.special("<clinit>"), SYNTHESIZED, KotlinSourceElementKt.toSourceElement(element));
clInit.initialize(null, null, Collections.emptyList(), Collections.emptyList(),
clInit.initialize(null, null, Collections.emptyList(), Collections.emptyList(), Collections.emptyList(),
DescriptorUtilsKt.getModule(descriptor).getBuiltIns().getUnitType(),
Modality.FINAL, DescriptorVisibilities.PRIVATE);
return clInit;
@@ -73,6 +73,7 @@ abstract class AbstractCoroutineCodegen(
null,
classDescriptor.thisAsReceiverParameter,
emptyList(),
emptyList(),
listOf(
ValueParameterDescriptorImpl(
this, null, 0, Annotations.EMPTY, Name.identifier(SUSPEND_CALL_RESULT_NAME),
@@ -188,6 +189,7 @@ class CoroutineCodegenForLambda private constructor(
it.initialize(
funDescriptor.extensionReceiverParameter?.copy(it),
funDescriptor.dispatchReceiverParameter,
funDescriptor.contextReceiverParameters.map { p -> p.copy(it) },
funDescriptor.typeParameters,
funDescriptor.valueParameters,
funDescriptor.module.getContinuationOfTypeOrAny(
@@ -132,7 +132,7 @@ fun createFreeFakeLocalPropertyDescriptor(descriptor: LocalVariableDescriptor, t
)
property.setType(
descriptor.type, descriptor.typeParameters,
descriptor.dispatchReceiverParameter, descriptor.extensionReceiverParameter
descriptor.dispatchReceiverParameter, descriptor.extensionReceiverParameter, descriptor.contextReceiverParameters
)
property.initialize(
@@ -30,7 +30,7 @@ internal class FictitiousArrayConstructor(arrayClass: ClassDescriptor) : SimpleF
val arrayClass = arrayConstructor.constructedClass
return FictitiousArrayConstructor(arrayClass).apply {
this.initialize(
null, null, arrayConstructor.typeParameters, arrayConstructor.valueParameters, arrayClass.defaultType,
null, null, emptyList<ReceiverParameterDescriptor>(), arrayConstructor.typeParameters, arrayConstructor.valueParameters, arrayClass.defaultType,
Modality.FINAL, DescriptorVisibilities.PUBLIC
)
this.isInline = true
@@ -16,6 +16,7 @@
package org.jetbrains.kotlin.load.java.sam;
import kotlin.collections.CollectionsKt;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.kotlin.descriptors.*;
import org.jetbrains.kotlin.descriptors.impl.ValueParameterDescriptorImpl;
@@ -75,8 +76,7 @@ public class JavaSingleAbstractMethodUtils {
@NotNull KotlinType returnType
) {
result.initialize(
null,
original.getDispatchReceiverParameter(),
null, original.getDispatchReceiverParameter(), CollectionsKt.emptyList(),
typeParameters,
valueParameters,
returnType,
@@ -88,8 +88,7 @@ public class SignaturesPropagationData {
false
);
autoMethodDescriptor.initialize(
null,
containingClass.getThisAsReceiverParameter(),
null, containingClass.getThisAsReceiverParameter(), CollectionsKt.emptyList(),
autoTypeParameters,
autoValueParameters,
autoReturnType,
@@ -375,7 +375,7 @@ class JavaSyntheticPropertiesScope(
val receiverType = typeSubstitutor.safeSubstitute(ownerClass.defaultType, Variance.INVARIANT)
descriptor.setType(
propertyType, typeParameters, null,
DescriptorFactory.createExtensionReceiverParameterForCallable(descriptor, receiverType, Annotations.EMPTY)
DescriptorFactory.createExtensionReceiverParameterForCallable(descriptor, receiverType, Annotations.EMPTY), emptyList()
)
val getter = PropertyGetterDescriptorImpl(
@@ -338,7 +338,7 @@ class SamAdapterFunctionsScope(
val visibility = syntheticVisibility(sourceFunction, isUsedForExtension = false)
descriptor.initialize(
null, ownerClass.thisAsReceiverParameter, typeParameters, valueParameters, returnType,
null, ownerClass.thisAsReceiverParameter, emptyList(), typeParameters, valueParameters, returnType,
Modality.FINAL, visibility
)
@@ -42,7 +42,7 @@ sealed class LocalVariableAccessorDescriptor(
val returnType =
if (isGetter) correspondingVariable.type else correspondingVariable.builtIns.unitType
@Suppress("LeakingThis")
initialize(null, null, emptyList(), valueParameters, returnType, Modality.FINAL, DescriptorVisibilities.LOCAL)
initialize(null, null, emptyList(), emptyList(), valueParameters, returnType, Modality.FINAL, DescriptorVisibilities.LOCAL)
}
private fun createValueParameter(name: Name, type: KotlinType): ValueParameterDescriptorImpl {
@@ -52,6 +52,7 @@ object DataClassDescriptorResolver {
functionDescriptor.initialize(
null,
classDescriptor.thisAsReceiverParameter,
emptyList<ReceiverParameterDescriptor>(),
emptyList<TypeParameterDescriptor>(),
emptyList<ValueParameterDescriptor>(),
property.type,
@@ -96,6 +97,7 @@ object DataClassDescriptorResolver {
functionDescriptor.initialize(
null,
classDescriptor.thisAsReceiverParameter,
emptyList<ReceiverParameterDescriptor>(),
emptyList<TypeParameterDescriptor>(),
parameterDescriptors,
classDescriptor.defaultType,
@@ -63,6 +63,8 @@ import org.jetbrains.kotlin.types.expressions.*;
import org.jetbrains.kotlin.types.typeUtil.TypeUtilsKt;
import java.util.*;
import java.util.stream.Collectors;
import java.util.stream.Stream;
import static org.jetbrains.kotlin.descriptors.annotations.AnnotationUseSiteTarget.*;
import static org.jetbrains.kotlin.diagnostics.Errors.*;
@@ -927,6 +929,7 @@ public class DescriptorResolver {
LexicalScope scopeForDeclarationResolutionWithTypeParameters;
LexicalScope scopeForInitializerResolutionWithTypeParameters;
KotlinType receiverType = null;
Stream<KotlinType> contextReceiverTypes;
{
List<KtTypeParameter> typeParameters = variableDeclaration.getTypeParameters();
@@ -965,6 +968,8 @@ public class DescriptorResolver {
for (KtTypeReference contextReceiverTypeRef: contextReceiverTypeRefs) {
typeResolver.resolveType(scopeForDeclarationResolutionWithTypeParameters, contextReceiverTypeRef, trace, true);
}
contextReceiverTypes = contextReceiverTypeRefs.stream()
.map((typeRef) -> typeResolver.resolveType(scopeForDeclarationResolutionWithTypeParameters, typeRef, trace, true));
}
ReceiverParameterDescriptor receiverDescriptor;
@@ -978,6 +983,13 @@ public class DescriptorResolver {
receiverDescriptor = null;
}
List<ReceiverParameterDescriptor> contextReceiverDescriptors = contextReceiverTypes.map((type) -> {
AnnotationSplitter splitter = new AnnotationSplitter(storageManager, type.getAnnotations(), EnumSet.of(RECEIVER));
return DescriptorFactory.createExtensionReceiverParameterForCallable(
propertyDescriptor, type, splitter.getAnnotationsForTarget(RECEIVER)
);
}).collect(Collectors.toList());
LexicalScope scopeForInitializer = ScopeUtils.makeScopeForPropertyInitializer(scopeForInitializerResolutionWithTypeParameters, propertyDescriptor);
KotlinType propertyType = propertyInfo.getVariableType();
KotlinType typeIfKnown = propertyType != null ? propertyType : variableTypeAndInitializerResolver.resolveTypeNullable(
@@ -1006,7 +1018,8 @@ public class DescriptorResolver {
propertyDescriptor, scopeForInitializer, variableDeclaration, dataFlowInfo, type, inferenceSession, trace
);
propertyDescriptor.setType(type, typeParameterDescriptors, getDispatchReceiverParameterIfNeeded(container), receiverDescriptor);
propertyDescriptor.setType(type, typeParameterDescriptors, getDispatchReceiverParameterIfNeeded(container), receiverDescriptor,
contextReceiverDescriptors);
PropertySetterDescriptor setter = resolvePropertySetterDescriptor(
scopeForDeclarationResolutionWithTypeParameters,
@@ -1304,7 +1317,8 @@ public class DescriptorResolver {
false,
false
);
propertyDescriptor.setType(type, Collections.emptyList(), getDispatchReceiverParameterIfNeeded(classDescriptor), null);
propertyDescriptor.setType(type, Collections.emptyList(), getDispatchReceiverParameterIfNeeded(classDescriptor), null,
CollectionsKt.emptyList());
Annotations setterAnnotations = annotationSplitter.getAnnotationsForTarget(PROPERTY_SETTER);
Annotations getterAnnotations = new CompositeAnnotations(CollectionsKt.listOf(
@@ -197,7 +197,7 @@ class FunctionDescriptorResolver(
if (function is KtFunctionLiteral) expectedFunctionType.getReceiverType() else null
}
function.contextReceiverTypeReferences.onEach {
val contextReceiverTypes = function.contextReceiverTypeReferences.map {
typeResolver.resolveType(headerScope, it, trace, true)
}
@@ -231,10 +231,17 @@ class FunctionDescriptorResolver(
functionDescriptor, it, splitter.getAnnotationsForTarget(AnnotationUseSiteTarget.RECEIVER)
)
}
val contextReceivers = contextReceiverTypes.map {
val splitter = AnnotationSplitter(storageManager, it.annotations, EnumSet.of(AnnotationUseSiteTarget.RECEIVER))
DescriptorFactory.createExtensionReceiverParameterForCallable(
functionDescriptor, it, splitter.getAnnotationsForTarget(AnnotationUseSiteTarget.RECEIVER)
)
}
functionDescriptor.initialize(
extensionReceiver,
getDispatchReceiverParameterIfNeeded(container),
contextReceivers,
typeParameterDescriptors,
valueParameterDescriptors,
returnType,
@@ -98,6 +98,7 @@ object FunctionsFromAny {
functionDescriptor.initialize(
null,
classDescriptor.thisAsReceiverParameter,
emptyList(),
functionFromAny.typeParameters,
functionFromAny.valueParameters.map { it.copy(functionDescriptor, it.name, it.index) },
functionFromAny.returnType,
@@ -70,6 +70,7 @@ object InlineClassDescriptorResolver {
functionDescriptor.initialize(
null,
null,
emptyList<ReceiverParameterDescriptor>(),
emptyList<TypeParameterDescriptor>(),
createValueParametersForSpecializedEquals(functionDescriptor, owner.inlineClassRepresentation!!.underlyingType),
owner.builtIns.booleanType,
@@ -93,6 +94,7 @@ object InlineClassDescriptorResolver {
functionDescriptor.initialize(
null,
if (isBoxMethod) null else owner.thisAsReceiverParameter,
emptyList<ReceiverParameterDescriptor>(),
emptyList<TypeParameterDescriptor>(),
if (isBoxMethod) listOf(createValueParameterForBoxing(functionDescriptor, underlyingType)) else emptyList(),
if (isBoxMethod) owner.defaultType else underlyingType,
@@ -186,7 +186,7 @@ class LocalVariableResolver(
)
val receiverParameter = (containingDeclaration as ScriptDescriptor).thisAsReceiverParameter
propertyDescriptor.setType(type, emptyList<TypeParameterDescriptor>(), receiverParameter, null)
propertyDescriptor.setType(type, emptyList<TypeParameterDescriptor>(), receiverParameter, null, emptyList<ReceiverParameterDescriptor>())
initializeWithDefaultGetterSetter(propertyDescriptor)
trace.record(BindingContext.VARIABLE, variable, propertyDescriptor)
result = propertyDescriptor
@@ -105,7 +105,8 @@ class DynamicCallableDescriptors(private val storageManager: StorageManager, bui
dynamicType,
createTypeParameters(propertyDescriptor, call),
createDynamicDispatchReceiverParameter(propertyDescriptor),
null
null,
emptyList()
)
val getter = DescriptorFactory.createDefaultGetter(propertyDescriptor, Annotations.EMPTY)
@@ -128,6 +129,7 @@ class DynamicCallableDescriptors(private val storageManager: StorageManager, bui
functionDescriptor.initialize(
null,
createDynamicDispatchReceiverParameter(functionDescriptor),
emptyList(),
createTypeParameters(functionDescriptor, call),
createValueParameters(functionDescriptor, call),
dynamicType,
@@ -82,6 +82,7 @@ public class ForceResolveUtil {
}
else if (object instanceof CallableDescriptor) {
CallableDescriptor callableDescriptor = (CallableDescriptor) object;
callableDescriptor.getContextReceiverParameters().forEach(p -> forceResolveAllContents(p.getType()));
ReceiverParameterDescriptor parameter = callableDescriptor.getExtensionReceiverParameter();
if (parameter != null) {
forceResolveAllContents(parameter.getType());
@@ -319,7 +319,7 @@ public class LazyClassDescriptor extends ClassDescriptorBase implements ClassDes
CallableMemberDescriptor.Kind.SYNTHESIZED, SourceElement.NO_SOURCE
) {
{
initialize(null, null, Collections.emptyList(), Collections.emptyList(),
initialize(null, null, CollectionsKt.emptyList(), Collections.emptyList(), Collections.emptyList(),
null, Modality.FINAL, DescriptorVisibilities.PRIVATE);
}
@@ -226,6 +226,7 @@ public class ControlStructureTypingUtils {
function.initialize(
null,
null,
Collections.emptyList(),
Lists.newArrayList(typeParameter),
valueParameters,
returnType,
@@ -636,7 +636,7 @@ class DoubleColonExpressionResolver(
)
functionDescriptor.initialize(
null, null, emptyList(),
null, null, emptyList(), emptyList(),
createValueParametersForInvokeInFunctionType(functionDescriptor, type.arguments.dropLast(1)),
type.arguments.last().type,
Modality.FINAL,
@@ -88,6 +88,7 @@ private fun copyTypesFromExtensionAccessor(
null,
extensionAccessorDescriptor.extensionReceiverParameter?.copy(this),
emptyList(),
emptyList(),
extensionAccessorDescriptor.valueParameters.map { it.copy(this, it.name, it.index) },
extensionAccessorDescriptor.returnType,
accessorFunctionDescriptor.modality,
@@ -133,6 +133,8 @@ abstract class IrBasedCallableDescriptor<T : IrDeclaration>(owner: T) : Callable
override fun getDispatchReceiverParameter(): ReceiverParameterDescriptor? = null
override fun getContextReceiverParameters(): List<ReceiverParameterDescriptor> = emptyList()
override fun getTypeParameters(): List<TypeParameterDescriptor> {
TODO("not implemented")
}
@@ -859,6 +861,10 @@ open class IrBasedPropertyDescriptor(owner: IrProperty) :
override fun getExtensionReceiverParameter() =
owner.getter?.extensionReceiverParameter?.toIrBasedDescriptor() as? ReceiverParameterDescriptor
override fun getContextReceiverParameters(): List<ReceiverParameterDescriptor> {
TODO("Not yet implemented")
}
override fun isExternal() = owner.isExternal
override fun <R : Any?, D : Any?> accept(visitor: DeclarationDescriptorVisitor<R, D>?, data: D) =
@@ -1043,6 +1049,10 @@ open class IrBasedFieldDescriptor(owner: IrField) : PropertyDescriptor, IrBasedD
override fun getExtensionReceiverParameter(): ReceiverParameterDescriptor? =
owner.correspondingPropertySymbol?.owner?.toIrBasedDescriptor()?.extensionReceiverParameter
override fun getContextReceiverParameters(): List<ReceiverParameterDescriptor> {
TODO("Not yet implemented")
}
override fun isExternal() = owner.isExternal
override fun <R : Any?, D : Any?> accept(visitor: DeclarationDescriptorVisitor<R, D>?, data: D) =
@@ -155,7 +155,7 @@ class IrBuiltInsOverDescriptors(
returnKotlinType = typeParameterDescriptor.typeConstructor.makeNonNullType()
initialize(
null, null, listOf(typeParameterDescriptor), listOf(valueParameterDescriptor), returnKotlinType,
null, null, listOf(), listOf(typeParameterDescriptor), listOf(valueParameterDescriptor), returnKotlinType,
Modality.FINAL, DescriptorVisibilities.PUBLIC
)
}
@@ -35,6 +35,7 @@ abstract class IrBuiltinOperatorDescriptorBase(containingDeclaration: Declaratio
IrBuiltinOperatorDescriptor {
override fun getDispatchReceiverParameter(): ReceiverParameterDescriptor? = null
override fun getExtensionReceiverParameter(): ReceiverParameterDescriptor? = null
override fun getContextReceiverParameters(): List<ReceiverParameterDescriptor> = emptyList()
override fun getOriginal(): SimpleFunctionDescriptor = this
override fun substitute(substitutor: TypeSubstitutor): FunctionDescriptor = throw UnsupportedOperationException()
override fun getOverriddenDescriptors(): Collection<FunctionDescriptor> = emptyList()
@@ -67,7 +67,7 @@ abstract class IrDelegateDescriptorBase(
/* isDelegated = */ true
) {
init {
setType(delegateType, emptyList(), (containingDeclaration as? ClassDescriptor)?.thisAsReceiverParameter, null)
setType(delegateType, emptyList(), (containingDeclaration as? ClassDescriptor)?.thisAsReceiverParameter, null, emptyList())
}
final override fun setOutType(outType: KotlinType?) {
@@ -39,6 +39,8 @@ open class FakeCallableDescriptorForObject(
fun getReferencedObject(): ClassDescriptor = classDescriptor.getClassObjectReferenceTarget()
override fun getContextReceiverParameters(): List<ReceiverParameterDescriptor> = emptyList()
override fun getExtensionReceiverParameter(): ReceiverParameterDescriptor? = null
override fun getDispatchReceiverParameter(): ReceiverParameterDescriptor? = null
@@ -21,7 +21,7 @@ class CloneableClassScope(
override fun computeDeclaredFunctions(): List<FunctionDescriptor> = listOf(
SimpleFunctionDescriptorImpl.create(containingClass, Annotations.EMPTY, CLONE_NAME, DECLARATION, SourceElement.NO_SOURCE).apply {
initialize(
null, containingClass.thisAsReceiverParameter, emptyList(), emptyList(), containingClass.builtIns.anyType,
null, containingClass.thisAsReceiverParameter, emptyList(), emptyList(), emptyList(), containingClass.builtIns.anyType,
Modality.OPEN, DescriptorVisibilities.PROTECTED
)
}
@@ -17,6 +17,7 @@
package org.jetbrains.kotlin.load.java.descriptors;
import kotlin.Pair;
import kotlin.collections.CollectionsKt;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import org.jetbrains.kotlin.descriptors.*;
@@ -132,8 +133,7 @@ public class JavaClassConstructorDescriptor extends ClassConstructorDescriptorIm
);
// We do not use doSubstitute here as in JavaMethodDescriptor.enhance because type parameters of constructor belongs to class
enhanced.initialize(
enhancedReceiver,
getDispatchReceiverParameter(),
enhancedReceiver, getDispatchReceiverParameter(), CollectionsKt.<ReceiverParameterDescriptor>emptyList(),
getTypeParameters(),
UtilKt.copyValueParameters(enhancedValueParameterTypes, getValueParameters(), enhanced),
enhancedReturnType,
@@ -93,6 +93,7 @@ public class JavaMethodDescriptor extends SimpleFunctionDescriptorImpl implement
public SimpleFunctionDescriptorImpl initialize(
@Nullable ReceiverParameterDescriptor extensionReceiverParameter,
@Nullable ReceiverParameterDescriptor dispatchReceiverParameter,
@NotNull List<ReceiverParameterDescriptor> contextReceiverParameters,
@NotNull List<? extends TypeParameterDescriptor> typeParameters,
@NotNull List<ValueParameterDescriptor> unsubstitutedValueParameters,
@Nullable KotlinType unsubstitutedReturnType,
@@ -101,7 +102,7 @@ public class JavaMethodDescriptor extends SimpleFunctionDescriptorImpl implement
@Nullable Map<? extends UserDataKey<?>, ?> userData
) {
SimpleFunctionDescriptorImpl descriptor = super.initialize(
extensionReceiverParameter, dispatchReceiverParameter, typeParameters, unsubstitutedValueParameters,
extensionReceiverParameter, dispatchReceiverParameter, contextReceiverParameters, typeParameters, unsubstitutedValueParameters,
unsubstitutedReturnType, modality, visibility, userData
);
setOperator(OperatorChecks.INSTANCE.check(descriptor).isSuccess());
@@ -17,6 +17,7 @@
package org.jetbrains.kotlin.load.java.descriptors;
import kotlin.Pair;
import kotlin.collections.CollectionsKt;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import org.jetbrains.kotlin.builtins.KotlinBuiltIns;
@@ -162,8 +163,8 @@ public class JavaPropertyDescriptor extends PropertyDescriptorImpl implements Ja
enhancedReturnType,
getTypeParameters(), // TODO
getDispatchReceiverParameter(),
enhancedReceiver
);
enhancedReceiver,
CollectionsKt.<ReceiverParameterDescriptor>emptyList());
return enhanced;
}
@@ -515,6 +515,7 @@ class LazyJavaClassMemberScope(
getDispatchReceiverParameter(),
emptyList(),
emptyList(),
emptyList(),
returnType,
// Those functions are generated as open in bytecode
// Actually, it should not be important because the class is final anyway, but leaving them open is convenient for consistency
@@ -597,7 +598,7 @@ class LazyJavaClassMemberScope(
propertyDescriptor.initialize(getter, null)
val returnType = givenType ?: computeMethodReturnType(method, c.childForMethod(propertyDescriptor, method))
propertyDescriptor.setType(returnType, listOf(), getDispatchReceiverParameter(), null)
propertyDescriptor.setType(returnType, listOf(), getDispatchReceiverParameter(), null, listOf())
getter.initialize(returnType)
return propertyDescriptor
@@ -623,7 +624,7 @@ class LazyJavaClassMemberScope(
val propertyDescriptor = JavaForKotlinOverridePropertyDescriptor(ownerDescriptor, getterMethod, setterMethod, overriddenProperty)
propertyDescriptor.setType(getterMethod.returnType!!, listOf(), getDispatchReceiverParameter(), null)
propertyDescriptor.setType(getterMethod.returnType!!, listOf(), getDispatchReceiverParameter(), null, listOf())
val getter = DescriptorFactory.createGetter(
propertyDescriptor, getterMethod.annotations, /* isDefault = */false,
@@ -174,6 +174,7 @@ abstract class LazyJavaScope(
DescriptorFactory.createExtensionReceiverParameterForCallable(functionDescriptorImpl, it, Annotations.EMPTY)
},
getDispatchReceiverParameter(),
emptyList(),
effectiveSignature.typeParameters,
effectiveSignature.valueParameters,
effectiveSignature.returnType,
@@ -297,7 +298,13 @@ abstract class LazyJavaScope(
val propertyType = getPropertyType(field)
propertyDescriptor.setType(propertyType, listOf(), getDispatchReceiverParameter(), null)
propertyDescriptor.setType(
propertyType,
listOf(),
getDispatchReceiverParameter(),
null,
emptyList()
)
if (DescriptorUtils.shouldRecordInitializerForProperty(propertyDescriptor, propertyDescriptor.type)) {
propertyDescriptor.setCompileTimeInitializer(
@@ -115,7 +115,7 @@ class FunctionInvokeDescriptor private constructor(
result.initialize(
null,
functionClass.thisAsReceiverParameter,
listOf(),
listOf(), listOf(),
typeParameters.takeWhile { it.variance == Variance.IN_VARIANCE }
.withIndex()
.map { createValueParameter(result, it.index, it.value) },
@@ -26,6 +26,10 @@ import java.util.List;
public interface CallableDescriptor extends DeclarationDescriptorWithVisibility, DeclarationDescriptorNonRoot,
Substitutable<CallableDescriptor> {
@NotNull
@ReadOnly
List<ReceiverParameterDescriptor> getContextReceiverParameters();
@Nullable
ReceiverParameterDescriptor getExtensionReceiverParameter();
@@ -65,6 +65,12 @@ public abstract class AbstractReceiverParameterDescriptor extends DeclarationDes
return visitor.visitReceiverParameterDescriptor(this, data);
}
@NotNull
@Override
public List<ReceiverParameterDescriptor> getContextReceiverParameters() {
return Collections.emptyList();
}
@Nullable
@Override
public ReceiverParameterDescriptor getExtensionReceiverParameter() {
@@ -70,7 +70,7 @@ public class ClassConstructorDescriptorImpl extends FunctionDescriptorImpl imple
@NotNull List<TypeParameterDescriptor> typeParameterDescriptors
) {
super.initialize(
null, calculateDispatchReceiverParameter(),
null, calculateDispatchReceiverParameter(), Collections.<ReceiverParameterDescriptor>emptyList(),
typeParameterDescriptors,
unsubstitutedValueParameters, null,
Modality.FINAL, visibility);
@@ -23,6 +23,7 @@ public abstract class FunctionDescriptorImpl extends DeclarationDescriptorNonRoo
private List<TypeParameterDescriptor> typeParameters;
private List<ValueParameterDescriptor> unsubstitutedValueParameters;
private KotlinType unsubstitutedReturnType;
private List<ReceiverParameterDescriptor> contextReceiverParameters;
private ReceiverParameterDescriptor extensionReceiverParameter;
private ReceiverParameterDescriptor dispatchReceiverParameter;
private Modality modality;
@@ -68,6 +69,7 @@ public abstract class FunctionDescriptorImpl extends DeclarationDescriptorNonRoo
public FunctionDescriptorImpl initialize(
@Nullable ReceiverParameterDescriptor extensionReceiverParameter,
@Nullable ReceiverParameterDescriptor dispatchReceiverParameter,
@NotNull List<ReceiverParameterDescriptor> contextReceiverParameters,
@NotNull List<? extends TypeParameterDescriptor> typeParameters,
@NotNull List<ValueParameterDescriptor> unsubstitutedValueParameters,
@Nullable KotlinType unsubstitutedReturnType,
@@ -81,6 +83,7 @@ public abstract class FunctionDescriptorImpl extends DeclarationDescriptorNonRoo
this.visibility = visibility;
this.extensionReceiverParameter = extensionReceiverParameter;
this.dispatchReceiverParameter = dispatchReceiverParameter;
this.contextReceiverParameters = contextReceiverParameters;
for (int i = 0; i < typeParameters.size(); ++i) {
TypeParameterDescriptor typeParameterDescriptor = typeParameters.get(i);
@@ -165,6 +168,12 @@ public abstract class FunctionDescriptorImpl extends DeclarationDescriptorNonRoo
this.extensionReceiverParameter = extensionReceiverParameter;
}
@NotNull
@Override
public List<ReceiverParameterDescriptor> getContextReceiverParameters() {
return contextReceiverParameters;
}
@Nullable
@Override
public ReceiverParameterDescriptor getExtensionReceiverParameter() {
@@ -663,9 +672,9 @@ public abstract class FunctionDescriptorImpl extends DeclarationDescriptorNonRoo
return this;
}
// TODO: Substitute context receivers
substitutedDescriptor.initialize(
substitutedReceiverParameter,
substitutedExpectedThis,
substitutedReceiverParameter, substitutedExpectedThis, CollectionsKt.<ReceiverParameterDescriptor>emptyList(),
substitutedTypeParameters,
substitutedValueParameters,
substitutedReturnType,
@@ -166,6 +166,12 @@ public abstract class PropertyAccessorDescriptorImpl extends DeclarationDescript
return correspondingProperty;
}
@NotNull
@Override
public List<ReceiverParameterDescriptor> getContextReceiverParameters() {
return getCorrespondingProperty().getContextReceiverParameters();
}
@Nullable
@Override
public ReceiverParameterDescriptor getExtensionReceiverParameter() {
@@ -17,6 +17,7 @@
package org.jetbrains.kotlin.descriptors.impl;
import kotlin.annotations.jvm.ReadOnly;
import kotlin.collections.CollectionsKt;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import org.jetbrains.kotlin.descriptors.*;
@@ -47,6 +48,7 @@ public class PropertyDescriptorImpl extends VariableDescriptorWithInitializerImp
private final boolean isExternal;
private final boolean isDelegated;
private List<ReceiverParameterDescriptor> contextReceiverParameters = Collections.emptyList();
private ReceiverParameterDescriptor dispatchReceiverParameter;
private ReceiverParameterDescriptor extensionReceiverParameter;
private List<TypeParameterDescriptor> typeParameters;
@@ -121,7 +123,8 @@ public class PropertyDescriptorImpl extends VariableDescriptorWithInitializerImp
@NotNull KotlinType outType,
@ReadOnly @NotNull List<? extends TypeParameterDescriptor> typeParameters,
@Nullable ReceiverParameterDescriptor dispatchReceiverParameter,
@Nullable ReceiverParameterDescriptor extensionReceiverParameter
@Nullable ReceiverParameterDescriptor extensionReceiverParameter,
@NotNull List<ReceiverParameterDescriptor> contextReceiverParameters
) {
setOutType(outType);
@@ -129,6 +132,7 @@ public class PropertyDescriptorImpl extends VariableDescriptorWithInitializerImp
this.extensionReceiverParameter = extensionReceiverParameter;
this.dispatchReceiverParameter = dispatchReceiverParameter;
this.contextReceiverParameters = contextReceiverParameters;
}
public void initialize(
@@ -169,6 +173,12 @@ public class PropertyDescriptorImpl extends VariableDescriptorWithInitializerImp
return parameters;
}
@Override
@NotNull
public List<ReceiverParameterDescriptor> getContextReceiverParameters() {
return contextReceiverParameters;
}
@Override
@Nullable
public ReceiverParameterDescriptor getExtensionReceiverParameter() {
@@ -427,19 +437,22 @@ public class PropertyDescriptorImpl extends VariableDescriptorWithInitializerImp
ReceiverParameterDescriptor substitutedExtensionReceiver;
if (extensionReceiverParameter != null) {
KotlinType substitutedReceiverType = substitutor.substitute(extensionReceiverParameter.getType(), Variance.IN_VARIANCE);
if (substitutedReceiverType == null) return null;
substitutedExtensionReceiver = new ReceiverParameterDescriptorImpl(
substitutedDescriptor,
new ExtensionReceiver(substitutedDescriptor, substitutedReceiverType, extensionReceiverParameter.getValue()),
extensionReceiverParameter.getAnnotations()
);
}
else {
substitutedExtensionReceiver = substituteParameterDescriptor(substitutor, substitutedDescriptor, extensionReceiverParameter);
} else {
substitutedExtensionReceiver = null;
}
substitutedDescriptor.setType(outType, substitutedTypeParameters, substitutedDispatchReceiver, substitutedExtensionReceiver);
List<ReceiverParameterDescriptor> substitutedContextReceivers = new ArrayList<ReceiverParameterDescriptor>();
for (ReceiverParameterDescriptor contextReceiverParameter: contextReceiverParameters) {
ReceiverParameterDescriptor substitutedContextReceiver = substituteParameterDescriptor(substitutor, substitutedDescriptor,
contextReceiverParameter);
if (substitutedContextReceiver != null) {
substitutedContextReceivers.add(substitutedContextReceiver);
}
}
substitutedDescriptor.setType(outType, substitutedTypeParameters, substitutedDispatchReceiver, substitutedExtensionReceiver,
substitutedContextReceivers);
PropertyGetterDescriptorImpl newGetter = getter == null ? null : new PropertyGetterDescriptorImpl(
substitutedDescriptor, getter.getAnnotations(), copyConfiguration.modality, normalizeVisibility(getter.getVisibility(), copyConfiguration.kind),
@@ -514,6 +527,20 @@ public class PropertyDescriptorImpl extends VariableDescriptorWithInitializerImp
return prev;
}
private static ReceiverParameterDescriptor substituteParameterDescriptor(
TypeSubstitutor substitutor,
PropertyDescriptor substitutedPropertyDescriptor,
ReceiverParameterDescriptor receiverParameterDescriptor
) {
KotlinType substitutedType = substitutor.substitute(receiverParameterDescriptor.getType(), Variance.IN_VARIANCE);
if (substitutedType == null) return null;
return new ReceiverParameterDescriptorImpl(
substitutedPropertyDescriptor,
new ExtensionReceiver(substitutedPropertyDescriptor, substitutedType, receiverParameterDescriptor.getValue()),
receiverParameterDescriptor.getAnnotations()
);
}
private static FunctionDescriptor getSubstitutedInitialSignatureDescriptor(
@NotNull TypeSubstitutor substitutor,
@NotNull PropertyAccessorDescriptor accessorDescriptor
@@ -55,13 +55,14 @@ public class SimpleFunctionDescriptorImpl extends FunctionDescriptorImpl impleme
public SimpleFunctionDescriptorImpl initialize(
@Nullable ReceiverParameterDescriptor extensionReceiverParameter,
@Nullable ReceiverParameterDescriptor dispatchReceiverParameter,
@NotNull List<ReceiverParameterDescriptor> contextReceiverParameters,
@NotNull List<? extends TypeParameterDescriptor> typeParameters,
@NotNull List<ValueParameterDescriptor> unsubstitutedValueParameters,
@Nullable KotlinType unsubstitutedReturnType,
@Nullable Modality modality,
@NotNull DescriptorVisibility visibility
) {
return initialize(extensionReceiverParameter, dispatchReceiverParameter, typeParameters, unsubstitutedValueParameters,
return initialize(extensionReceiverParameter, dispatchReceiverParameter, contextReceiverParameters, typeParameters, unsubstitutedValueParameters,
unsubstitutedReturnType, modality, visibility, null);
}
@@ -69,6 +70,7 @@ public class SimpleFunctionDescriptorImpl extends FunctionDescriptorImpl impleme
public SimpleFunctionDescriptorImpl initialize(
@Nullable ReceiverParameterDescriptor extensionReceiverParameter,
@Nullable ReceiverParameterDescriptor dispatchReceiverParameter,
@NotNull List<ReceiverParameterDescriptor> contextReceiverParameters,
@NotNull List<? extends TypeParameterDescriptor> typeParameters,
@NotNull List<ValueParameterDescriptor> unsubstitutedValueParameters,
@Nullable KotlinType unsubstitutedReturnType,
@@ -76,7 +78,7 @@ public class SimpleFunctionDescriptorImpl extends FunctionDescriptorImpl impleme
@NotNull DescriptorVisibility visibility,
@Nullable Map<? extends UserDataKey<?>, ?> userData
) {
super.initialize(extensionReceiverParameter, dispatchReceiverParameter, typeParameters, unsubstitutedValueParameters,
super.initialize(extensionReceiverParameter, dispatchReceiverParameter, contextReceiverParameters, typeParameters, unsubstitutedValueParameters,
unsubstitutedReturnType, modality, visibility);
if (userData != null && !userData.isEmpty()) {
@@ -83,6 +83,7 @@ class TypeAliasConstructorDescriptorImpl private constructor(
typeAliasConstructor.initialize(
null,
underlyingConstructorDescriptor.dispatchReceiverParameter?.substitute(substitutorForUnderlyingClass),
emptyList(),
typeAliasDescriptor.declaredTypeParameters,
valueParameters,
returnType,
@@ -205,6 +206,7 @@ class TypeAliasConstructorDescriptorImpl private constructor(
typeAliasConstructor.initialize(
receiverParameter,
null,
emptyList(),
typeAliasDescriptor.declaredTypeParameters,
valueParameters,
returnType,
@@ -88,6 +88,12 @@ public abstract class VariableDescriptorImpl extends DeclarationDescriptorNonRoo
return Collections.emptyList();
}
@NotNull
@Override
public List<ReceiverParameterDescriptor> getContextReceiverParameters() {
return Collections.emptyList();
}
@Override
public ReceiverParameterDescriptor getExtensionReceiverParameter() {
return null;
@@ -146,7 +146,7 @@ public class DescriptorFactory {
SimpleFunctionDescriptorImpl values =
SimpleFunctionDescriptorImpl.create(enumClass, Annotations.Companion.getEMPTY(), ENUM_VALUES,
CallableMemberDescriptor.Kind.SYNTHESIZED, enumClass.getSource());
return values.initialize(null, null, Collections.<TypeParameterDescriptor>emptyList(),
return values.initialize(null, null, Collections.<ReceiverParameterDescriptor>emptyList(), Collections.<TypeParameterDescriptor>emptyList(),
Collections.<ValueParameterDescriptor>emptyList(),
getBuiltIns(enumClass).getArrayType(Variance.INVARIANT, enumClass.getDefaultType()),
Modality.FINAL, DescriptorVisibilities.PUBLIC);
@@ -165,7 +165,7 @@ public class DescriptorFactory {
null,
enumClass.getSource()
);
return valueOf.initialize(null, null, Collections.<TypeParameterDescriptor>emptyList(),
return valueOf.initialize(null, null, Collections.<ReceiverParameterDescriptor>emptyList(), Collections.<TypeParameterDescriptor>emptyList(),
Collections.singletonList(parameterDescriptor), enumClass.getDefaultType(),
Modality.FINAL, DescriptorVisibilities.PUBLIC);
}
@@ -99,6 +99,7 @@ private fun initializeSamConstructorDescriptor(
samConstructor.initialize(
null,
null,
emptyList(),
typeParameters.descriptors, listOf(parameter),
returnType,
Modality.FINAL,
@@ -429,7 +429,8 @@ public class ErrorUtils {
SourceElement.NO_SOURCE,
false, false, false, false, false, false
);
descriptor.setType(ERROR_PROPERTY_TYPE, Collections.<TypeParameterDescriptor>emptyList(), null, null);
descriptor.setType(ERROR_PROPERTY_TYPE, Collections.<TypeParameterDescriptor>emptyList(), null, null,
Collections.<ReceiverParameterDescriptor>emptyList());
return descriptor;
}
@@ -438,8 +439,7 @@ public class ErrorUtils {
private static SimpleFunctionDescriptor createErrorFunction(@NotNull ErrorScope ownerScope) {
ErrorSimpleFunctionDescriptorImpl function = new ErrorSimpleFunctionDescriptorImpl(ERROR_CLASS, ownerScope);
function.initialize(
null,
null,
null, null, Collections.<ReceiverParameterDescriptor>emptyList(),
Collections.<TypeParameterDescriptorImpl>emptyList(), // TODO
Collections.<ValueParameterDescriptor>emptyList(), // TODO
createErrorType("<ERROR FUNCTION RETURN TYPE>"),
@@ -59,7 +59,8 @@ class MemberDeserializer(private val c: DeserializationContext) {
getDispatchReceiverParameter(),
proto.receiverType(c.typeTable)?.let(local.typeDeserializer::type)?.let { receiverType ->
DescriptorFactory.createExtensionReceiverParameterForCallable(property, receiverType, receiverAnnotations)
}
},
emptyList()
)
// Per documentation on Property.getter_flags in metadata.proto, if an accessor flags field is absent, its value should be computed
@@ -161,6 +162,7 @@ class MemberDeserializer(private val c: DeserializationContext) {
initialize(
extensionReceiverParameter,
dispatchReceiverParameter,
emptyList(), // TODO
typeParameters,
unsubstitutedValueParameters,
unsubstitutedReturnType,
@@ -71,7 +71,7 @@ open class ParcelableResolveExtension : SyntheticResolveExtension {
val valueParameters = parameters.mapIndexed { index, (name, type) -> functionDescriptor.makeValueParameter(name, type, index) }
functionDescriptor.initialize(
null, classDescriptor.thisAsReceiverParameter, emptyList(), valueParameters,
null, classDescriptor.thisAsReceiverParameter, emptyList(), emptyList(), valueParameters,
returnType, modality, DescriptorVisibilities.PUBLIC)
return functionDescriptor
@@ -49,7 +49,7 @@ internal fun genClearCacheFunction(packageFragmentDescriptor: PackageFragmentDes
val unitType = packageFragmentDescriptor.builtIns.unitType
return function.initialize(
DescriptorFactory.createExtensionReceiverParameterForCallable(function, receiverType, Annotations.EMPTY),
null, emptyList(), emptyList(), unitType, Modality.FINAL, DescriptorVisibilities.PUBLIC
null, emptyList(), emptyList(), emptyList(), unitType, Modality.FINAL, DescriptorVisibilities.PUBLIC
)
}
@@ -123,7 +123,8 @@ private fun genProperty(
flexibleType,
emptyList<TypeParameterDescriptor>(),
null,
DescriptorFactory.createExtensionReceiverParameterForCallable(property, receiverType, Annotations.EMPTY)
DescriptorFactory.createExtensionReceiverParameterForCallable(property, receiverType, Annotations.EMPTY),
emptyList<ReceiverParameterDescriptor>()
)
val getter = PropertyGetterDescriptorImpl(
@@ -33,7 +33,7 @@ class SimpleSyntheticPropertyDescriptor(
private val _backingField = FieldDescriptorImpl(Annotations.EMPTY, this)
init {
super.setType(type, emptyList(), owner.thisAsReceiverParameter, null)
super.setType(type, emptyList(), owner.thisAsReceiverParameter, null, emptyList())
super.initialize(null, null, _backingField, null)
}
}
@@ -625,6 +625,7 @@ internal fun createSingletonLambda(
lambdaCodegen.descriptor.thisAsReceiverParameter,
emptyList(),
emptyList(),
emptyList(),
resultSimpleType,
Modality.FINAL,
DescriptorVisibilities.PUBLIC
@@ -647,6 +648,7 @@ internal fun createSingletonLambda(
lambdaCodegen.descriptor.thisAsReceiverParameter,
emptyList(),
emptyList(),
emptyList(),
lambdaCodegen.descriptor.builtIns.anyType,
Modality.FINAL,
DescriptorVisibilities.PUBLIC
@@ -47,7 +47,7 @@ class SerialInfoCodegenImpl(val codegen: ImplementationBodyCodegen, val thisClas
codegen.v.newField(OtherOrigin(codegen.myClass.psiOrParent), Opcodes.ACC_PRIVATE or Opcodes.ACC_FINAL or Opcodes.ACC_SYNTHETIC,
propFieldName, propType.descriptor, null, null)
val f = SimpleFunctionDescriptorImpl.create(thisClass, Annotations.EMPTY, prop.name, CallableMemberDescriptor.Kind.SYNTHESIZED, thisClass.source)
f.initialize(null, thisClass.thisAsReceiverParameter, emptyList(), emptyList(), prop.type, Modality.FINAL, DescriptorVisibilities.PUBLIC)
f.initialize(null, thisClass.thisAsReceiverParameter, emptyList(), emptyList(), emptyList(), prop.type, Modality.FINAL, DescriptorVisibilities.PUBLIC)
codegen.generateMethod(f, { _, _ ->
load(0, thisAsmType)
getfield(thisAsmType.internalName, propFieldName, propType.descriptor)
@@ -244,7 +244,8 @@ object KSerializerDescriptorResolver {
propertyFromSerializer.type,
propertyFromSerializer.typeParameters,
companionDescriptor.thisAsReceiverParameter,
extensionReceiverParameter
extensionReceiverParameter,
emptyList()
)
val propertyGetter = PropertyGetterDescriptorImpl(
@@ -277,6 +278,7 @@ object KSerializerDescriptorResolver {
functionDescriptor.initialize(
null,
companionDescriptor.thisAsReceiverParameter,
emptyList(),
functionFromSerializer.typeParameters,
functionFromSerializer.valueParameters.map { it.copy(functionDescriptor, it.name, it.index) },
functionFromSerializer.returnType,
@@ -488,6 +490,7 @@ object KSerializerDescriptorResolver {
f.initialize(
null,
thisClass.thisAsReceiverParameter,
emptyList(),
listOf(),
listOf(vararg),
kSerializerStarType,
@@ -517,7 +520,7 @@ object KSerializerDescriptorResolver {
val serialReturnType =
KotlinTypeFactory.simpleNotNullType(Annotations.EMPTY, serializerClass, listOf(TypeProjectionImpl(newSerializableType)))
f.initialize(null, thisClass.thisAsReceiverParameter, typeArgs, args, serialReturnType, Modality.FINAL, DescriptorVisibilities.PUBLIC)
f.initialize(null, thisClass.thisAsReceiverParameter, emptyList(), typeArgs, args, serialReturnType, Modality.FINAL, DescriptorVisibilities.PUBLIC)
return f
}
@@ -602,6 +605,7 @@ object KSerializerDescriptorResolver {
f.initialize(
null,
null,
emptyList(),
typeArgs,
args,
returnType,
@@ -100,6 +100,7 @@ abstract class AbstractNoArgExpressionCodegenExtension(val invokeInitializers: B
calculateDispatchReceiverParameter(),
emptyList(),
emptyList(),
emptyList(),
containingClass.builtIns.unitType,
Modality.OPEN,
DescriptorVisibilities.PUBLIC
@@ -77,7 +77,7 @@ open class ParcelizeResolveExtension : SyntheticResolveExtension {
val valueParameters = parameters.mapIndexed { index, (name, type) -> functionDescriptor.makeValueParameter(name, type, index) }
functionDescriptor.initialize(
null, classDescriptor.thisAsReceiverParameter, emptyList(), valueParameters,
null, classDescriptor.thisAsReceiverParameter, emptyList(), emptyList(), valueParameters,
returnType, modality, DescriptorVisibilities.PUBLIC
)
@@ -31,7 +31,7 @@ class ReplResultPropertyDescriptor(
/* isDelegated = */ false
) {
init {
setType(kotlinType, emptyList(), receiver, null)
setType(kotlinType, emptyList(), receiver, null, emptyList())
initialize(
null, null
)
@@ -30,7 +30,7 @@ class ScriptProvidedPropertyDescriptor(
/* isDelegated = */ false
) {
init {
setType(typeDescriptor.defaultType, emptyList(), receiver, null)
setType(typeDescriptor.defaultType, emptyList(), receiver, null, emptyList())
// TODO: consider delegation instead
initialize(null, null, null, null)
}