Containing declaration for TypeAliasConstructorDescriptor

is a corresponding TypeAliasDescriptor.
This commit is contained in:
Dmitry Petrov
2016-09-15 12:05:32 +03:00
committed by Dmitry Petrov
parent 1cc7f19d10
commit b31ab729de
8 changed files with 61 additions and 39 deletions
@@ -19,7 +19,6 @@ package org.jetbrains.kotlin.descriptors;
import kotlin.collections.SetsKt;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import org.jetbrains.kotlin.descriptors.impl.TypeAliasConstructorDescriptor;
import org.jetbrains.kotlin.resolve.DescriptorUtils;
import org.jetbrains.kotlin.resolve.scopes.receivers.ReceiverValue;
import org.jetbrains.kotlin.resolve.scopes.receivers.SuperCallReceiverValue;
@@ -317,13 +316,6 @@ public class Visibilities {
parent = DescriptorUtils.getParentOfType(parent, DeclarationDescriptorWithVisibility.class);
}
if (what instanceof TypeAliasConstructorDescriptor) {
DeclarationDescriptorWithVisibility invisibleMember =
findInvisibleMember(receiver, ((TypeAliasConstructorDescriptor) what).getTypeAliasDescriptor(), from);
if (invisibleMember != null) return invisibleMember;
}
return null;
}
@@ -20,27 +20,46 @@ import org.jetbrains.kotlin.descriptors.*
import org.jetbrains.kotlin.descriptors.CallableMemberDescriptor.Kind
import org.jetbrains.kotlin.descriptors.annotations.Annotations
import org.jetbrains.kotlin.name.Name
import org.jetbrains.kotlin.types.KotlinType
import org.jetbrains.kotlin.types.TypeSubstitutor
import org.jetbrains.kotlin.types.Variance
interface TypeAliasConstructorDescriptor : ConstructorDescriptor {
val typeAliasDescriptor: TypeAliasDescriptor
interface TypeAliasConstructorDescriptor : FunctionDescriptor {
val underlyingConstructorDescriptor: ConstructorDescriptor
override fun getContainingDeclaration(): TypeAliasDescriptor
override fun getReturnType(): KotlinType
override fun getOriginal(): TypeAliasConstructorDescriptor
override fun substitute(substitutor: TypeSubstitutor): TypeAliasConstructorDescriptor
override fun copy(
newOwner: DeclarationDescriptor,
modality: Modality,
visibility: Visibility,
kind: Kind,
copyOverrides: Boolean
): TypeAliasConstructorDescriptor
}
class TypeAliasConstructorDescriptorImpl private constructor(
override val typeAliasDescriptor: TypeAliasDescriptor,
val typeAliasDescriptor: TypeAliasDescriptor,
override val underlyingConstructorDescriptor: ConstructorDescriptor,
containingDeclaration: ClassDescriptor,
original: TypeAliasConstructorDescriptor?,
annotations: Annotations,
primary: Boolean,
kind: Kind,
source: SourceElement
) : TypeAliasConstructorDescriptor,
ConstructorDescriptorImpl(containingDeclaration, original, annotations,
primary, kind, source)
FunctionDescriptorImpl(typeAliasDescriptor, original, annotations, Name.special("<init>"), kind, source)
{
override fun getContainingDeclaration(): TypeAliasDescriptor =
typeAliasDescriptor
override fun getReturnType(): KotlinType =
super.getReturnType()!!
override fun getOriginal(): TypeAliasConstructorDescriptor =
super.getOriginal() as TypeAliasConstructorDescriptor
@@ -76,30 +95,43 @@ class TypeAliasConstructorDescriptorImpl private constructor(
assert(newName == null) { "Renaming type alias constructor: $this" }
return TypeAliasConstructorDescriptorImpl(
typeAliasDescriptor, underlyingConstructorDescriptor,
newOwner as ClassDescriptor,
this,
annotations, isPrimary, Kind.DECLARATION, source)
annotations,
Kind.DECLARATION, source)
}
companion object {
fun create(
typeAliasDescriptor: TypeAliasDescriptor,
underlyingConstructor: ConstructorDescriptor,
constructor: ConstructorDescriptor,
substitutor: TypeSubstitutor
): TypeAliasConstructorDescriptor? = with(underlyingConstructor) {
): TypeAliasConstructorDescriptor? {
val typeAliasConstructor =
TypeAliasConstructorDescriptorImpl(typeAliasDescriptor, underlyingConstructor, containingDeclaration, null,
annotations, isPrimary, kind, typeAliasDescriptor.source)
TypeAliasConstructorDescriptorImpl(typeAliasDescriptor, constructor, null, constructor.annotations,
constructor.kind, typeAliasDescriptor.source)
val valueParameters =
FunctionDescriptorImpl.getSubstitutedValueParameters(typeAliasConstructor, valueParameters, substitutor, false)
FunctionDescriptorImpl.getSubstitutedValueParameters(typeAliasConstructor, constructor.valueParameters, substitutor, false)
?: return null
typeAliasConstructor.initialize(valueParameters, visibility, typeAliasDescriptor.declaredTypeParameters)
val returnType = substitutor.substitute(constructor.returnType, Variance.INVARIANT)
?: return null
typeAliasConstructor.returnType = substitutor.substitute(returnType, Variance.OUT_VARIANCE) ?: return null
val dispatchReceiverParameter =
if (constructor.containingDeclaration.isInner)
constructor.containingDeclaration.thisAsReceiverParameter
else
null
typeAliasConstructor
typeAliasConstructor.initialize(null,
dispatchReceiverParameter,
typeAliasDescriptor.declaredTypeParameters,
valueParameters,
returnType,
Modality.FINAL,
constructor.visibility)
return typeAliasConstructor
}
}
}