From b31ab729de07e56fe77bad7c21a1d5e4534a9f28 Mon Sep 17 00:00:00 2001 From: Dmitry Petrov Date: Thu, 15 Sep 2016 12:05:32 +0300 Subject: [PATCH] Containing declaration for TypeAliasConstructorDescriptor is a corresponding TypeAliasDescriptor. --- .../kotlin/diagnostics/rendering/Renderers.kt | 3 + .../kotlin/resolve/OverloadChecker.kt | 3 +- .../kotlin/resolve/OverloadResolver.kt | 13 ++-- .../kotlin/resolve/calls/CandidateResolver.kt | 2 +- .../kotlin/resolve/calls/tower/TowerLevels.kt | 3 +- .../tests/typealias/throwJLException.kt | 2 +- .../kotlin/descriptors/Visibilities.java | 8 --- .../impl/TypeAliasConstructorDescriptor.kt | 66 ++++++++++++++----- 8 files changed, 61 insertions(+), 39 deletions(-) diff --git a/compiler/frontend/src/org/jetbrains/kotlin/diagnostics/rendering/Renderers.kt b/compiler/frontend/src/org/jetbrains/kotlin/diagnostics/rendering/Renderers.kt index f600c6096b1..25c6845d015 100644 --- a/compiler/frontend/src/org/jetbrains/kotlin/diagnostics/rendering/Renderers.kt +++ b/compiler/frontend/src/org/jetbrains/kotlin/diagnostics/rendering/Renderers.kt @@ -25,6 +25,7 @@ import org.jetbrains.kotlin.builtins.KotlinBuiltIns import org.jetbrains.kotlin.cfg.WhenMissingCase import org.jetbrains.kotlin.cfg.hasUnknown import org.jetbrains.kotlin.descriptors.* +import org.jetbrains.kotlin.descriptors.impl.TypeAliasConstructorDescriptor import org.jetbrains.kotlin.diagnostics.rendering.TabledDescriptorRenderer.newTable import org.jetbrains.kotlin.diagnostics.rendering.TabledDescriptorRenderer.newText import org.jetbrains.kotlin.psi.KtClass @@ -85,7 +86,9 @@ object Renderers { val declarationKindWithSpace = when (it) { is PackageFragmentDescriptor -> "package " is ClassDescriptor -> "${it.renderKind()} " + is TypeAliasDescriptor -> "typealias " is ConstructorDescriptor -> "constructor " + is TypeAliasConstructorDescriptor -> "typealias constructor " is PropertyGetterDescriptor -> "property getter " is PropertySetterDescriptor -> "property setter " is FunctionDescriptor -> "function " diff --git a/compiler/frontend/src/org/jetbrains/kotlin/resolve/OverloadChecker.kt b/compiler/frontend/src/org/jetbrains/kotlin/resolve/OverloadChecker.kt index e25b17e04ce..8a7bb868e26 100644 --- a/compiler/frontend/src/org/jetbrains/kotlin/resolve/OverloadChecker.kt +++ b/compiler/frontend/src/org/jetbrains/kotlin/resolve/OverloadChecker.kt @@ -90,8 +90,7 @@ class OverloadChecker(val specificityComparator: TypeSpecificityComparator) { DeclarationCategory.EXTENSION_PROPERTY else DeclarationCategory.TYPE_OR_VALUE - is ConstructorDescriptor, - is SimpleFunctionDescriptor -> + is FunctionDescriptor -> DeclarationCategory.FUNCTION is ClassifierDescriptor -> DeclarationCategory.TYPE_OR_VALUE diff --git a/compiler/frontend/src/org/jetbrains/kotlin/resolve/OverloadResolver.kt b/compiler/frontend/src/org/jetbrains/kotlin/resolve/OverloadResolver.kt index 26171b79968..543f92c48aa 100644 --- a/compiler/frontend/src/org/jetbrains/kotlin/resolve/OverloadResolver.kt +++ b/compiler/frontend/src/org/jetbrains/kotlin/resolve/OverloadResolver.kt @@ -41,8 +41,8 @@ class OverloadResolver( checkOverloadsInPackages(c) } - private fun findConstructorsInNestedClassesAndTypeAliases(c: BodiesResolveContext): MultiMap { - val constructorsByOuterClass = MultiMap.create() + private fun findConstructorsInNestedClassesAndTypeAliases(c: BodiesResolveContext): MultiMap { + val constructorsByOuterClass = MultiMap.create() for (klass in c.declaredClasses.values) { if (klass.kind.isSingleton || klass.name.isSpecial) { @@ -83,7 +83,7 @@ class OverloadResolver( private fun checkOverloadsInClass( classDescriptor: ClassDescriptorWithResolutionScopes, - nestedClassConstructors: Collection + nestedClassConstructors: Collection ) { val functionsByName = MultiMap.create() @@ -92,12 +92,7 @@ class OverloadResolver( } for (nestedConstructor in nestedClassConstructors) { - val name = - if (nestedConstructor is TypeAliasConstructorDescriptor) - nestedConstructor.typeAliasDescriptor.name - else - nestedConstructor.containingDeclaration.name - + val name = nestedConstructor.containingDeclaration.name functionsByName.putValue(name, nestedConstructor) } diff --git a/compiler/frontend/src/org/jetbrains/kotlin/resolve/calls/CandidateResolver.kt b/compiler/frontend/src/org/jetbrains/kotlin/resolve/calls/CandidateResolver.kt index 6e333965c58..6cb339f2513 100644 --- a/compiler/frontend/src/org/jetbrains/kotlin/resolve/calls/CandidateResolver.kt +++ b/compiler/frontend/src/org/jetbrains/kotlin/resolve/calls/CandidateResolver.kt @@ -630,7 +630,7 @@ class CandidateResolver( val substitutedType = typeAliasParametersSubstitutor.substitute(typeAliasConstructorDescriptor.returnType, Variance.INVARIANT)!! val boundsSubstitutor = TypeSubstitutor.create(substitutedType) - val typeAliasDescriptor = typeAliasConstructorDescriptor.typeAliasDescriptor + val typeAliasDescriptor = typeAliasConstructorDescriptor.containingDeclaration val unsubstitutedType = typeAliasDescriptor.expandedType if (unsubstitutedType.isError) return diff --git a/compiler/resolution/src/org/jetbrains/kotlin/resolve/calls/tower/TowerLevels.kt b/compiler/resolution/src/org/jetbrains/kotlin/resolve/calls/tower/TowerLevels.kt index a1b13721a8f..94825e895de 100644 --- a/compiler/resolution/src/org/jetbrains/kotlin/resolve/calls/tower/TowerLevels.kt +++ b/compiler/resolution/src/org/jetbrains/kotlin/resolve/calls/tower/TowerLevels.kt @@ -17,6 +17,7 @@ package org.jetbrains.kotlin.resolve.calls.tower import org.jetbrains.kotlin.descriptors.* +import org.jetbrains.kotlin.descriptors.impl.TypeAliasConstructorDescriptor import org.jetbrains.kotlin.descriptors.impl.TypeAliasConstructorDescriptorImpl import org.jetbrains.kotlin.incremental.components.LookupLocation import org.jetbrains.kotlin.name.Name @@ -297,7 +298,7 @@ private fun getClassWithConstructors(classifier: ClassifierDescriptor?): ClassDe private val ClassDescriptor.canHaveCallableConstructors: Boolean get() = !ErrorUtils.isError(this) && !kind.isSingleton -fun ClassifierDescriptor.getTypeAliasConstructors(): Collection { +fun ClassifierDescriptor.getTypeAliasConstructors(): Collection { if (this !is TypeAliasDescriptor) return emptyList() val classDescriptor = this.classDescriptor ?: return emptyList() diff --git a/compiler/testData/diagnostics/tests/typealias/throwJLException.kt b/compiler/testData/diagnostics/tests/typealias/throwJLException.kt index 8448c0ad67b..41eb89d3570 100644 --- a/compiler/testData/diagnostics/tests/typealias/throwJLException.kt +++ b/compiler/testData/diagnostics/tests/typealias/throwJLException.kt @@ -3,5 +3,5 @@ typealias Exn = java.lang.Exception fun test() { - throw Exn + throw Exn } \ No newline at end of file diff --git a/core/descriptors/src/org/jetbrains/kotlin/descriptors/Visibilities.java b/core/descriptors/src/org/jetbrains/kotlin/descriptors/Visibilities.java index c1a7133983e..634ca1ca9e9 100644 --- a/core/descriptors/src/org/jetbrains/kotlin/descriptors/Visibilities.java +++ b/core/descriptors/src/org/jetbrains/kotlin/descriptors/Visibilities.java @@ -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; } 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 f94c1a48348..5bfa3d11828 100644 --- a/core/descriptors/src/org/jetbrains/kotlin/descriptors/impl/TypeAliasConstructorDescriptor.kt +++ b/core/descriptors/src/org/jetbrains/kotlin/descriptors/impl/TypeAliasConstructorDescriptor.kt @@ -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(""), 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 } } }