From 5dfbaede4fac4dc912d863f8c04a65e6ecfad6ce Mon Sep 17 00:00:00 2001 From: Dmitry Petrov Date: Thu, 16 Jun 2016 15:09:38 +0300 Subject: [PATCH] Typealias can't be a qualifier --- .../resolve/QualifiedExpressionResolver.kt | 3 +- .../tests/typealias/typeAliasAsQualifier.kt | 18 ++++++++ .../tests/typealias/typeAliasAsQualifier.txt | 46 +++++++++++++++++++ .../checkers/DiagnosticsTestGenerated.java | 6 +++ 4 files changed, 71 insertions(+), 2 deletions(-) create mode 100644 compiler/testData/diagnostics/tests/typealias/typeAliasAsQualifier.kt create mode 100644 compiler/testData/diagnostics/tests/typealias/typeAliasAsQualifier.txt diff --git a/compiler/frontend/src/org/jetbrains/kotlin/resolve/QualifiedExpressionResolver.kt b/compiler/frontend/src/org/jetbrains/kotlin/resolve/QualifiedExpressionResolver.kt index 6d00e61a9dc..8cb297ec7d7 100644 --- a/compiler/frontend/src/org/jetbrains/kotlin/resolve/QualifiedExpressionResolver.kt +++ b/compiler/frontend/src/org/jetbrains/kotlin/resolve/QualifiedExpressionResolver.kt @@ -397,7 +397,7 @@ class QualifiedExpressionResolver(val classifierUsageCheckers: Iterable // TODO type aliases as qualifiers? (would break some assumptions in TypeResolver) - currentDescriptor.classDescriptor?.getContributedClassifier(qualifierPart) + null is ClassDescriptor -> currentDescriptor.getContributedClassifier(qualifierPart) is PackageViewDescriptor -> { @@ -622,7 +622,6 @@ class QualifiedExpressionResolver(val classifierUsageCheckers: Iterable PackageQualifier(referenceExpression, descriptor) is ClassDescriptor -> ClassQualifier(referenceExpression, descriptor) is TypeParameterDescriptor -> TypeParameterQualifier(referenceExpression, descriptor) - is TypeAliasDescriptor -> ClassQualifier(referenceExpression, descriptor.classDescriptor ?: return null) else -> return null } diff --git a/compiler/testData/diagnostics/tests/typealias/typeAliasAsQualifier.kt b/compiler/testData/diagnostics/tests/typealias/typeAliasAsQualifier.kt new file mode 100644 index 00000000000..05530955c77 --- /dev/null +++ b/compiler/testData/diagnostics/tests/typealias/typeAliasAsQualifier.kt @@ -0,0 +1,18 @@ +class C { + typealias Self = C + class Nested { + class N2 + typealias Root = C + } + companion object X { + val ok = "OK" + class InCompanion + } +} + +val c = C.Self.Self() +val n = C.Self.Nested() +val x = C.Self.X +val n2 = C.Nested.Root.Nested.N2() +val ic = C.Self.InCompanion() +val ok = C.Self.ok diff --git a/compiler/testData/diagnostics/tests/typealias/typeAliasAsQualifier.txt b/compiler/testData/diagnostics/tests/typealias/typeAliasAsQualifier.txt new file mode 100644 index 00000000000..9de824b3606 --- /dev/null +++ b/compiler/testData/diagnostics/tests/typealias/typeAliasAsQualifier.txt @@ -0,0 +1,46 @@ +package + +public val c: [ERROR : Type for C.Self.Self()] +public val ic: [ERROR : Type for C.Self.InCompanion()] +public val n: [ERROR : Type for C.Self.Nested()] +public val n2: [ERROR : ] +public val ok: kotlin.String = "OK" +public val x: [ERROR : Type for C.Self.X] + +public final class C { + public typealias Self = C + public constructor C() + public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean + public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int + public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String + + public final class Nested { + public typealias Root = C + public constructor Nested() + public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean + public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int + public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String + + public final class N2 { + public constructor N2() + public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean + public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int + public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String + } + } + + public companion object X { + private constructor X() + public final val ok: kotlin.String = "OK" + public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean + public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int + public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String + + public final class InCompanion { + public constructor InCompanion() + public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean + public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int + public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String + } + } +} diff --git a/compiler/tests/org/jetbrains/kotlin/checkers/DiagnosticsTestGenerated.java b/compiler/tests/org/jetbrains/kotlin/checkers/DiagnosticsTestGenerated.java index 99f10cd6516..bf87263933f 100644 --- a/compiler/tests/org/jetbrains/kotlin/checkers/DiagnosticsTestGenerated.java +++ b/compiler/tests/org/jetbrains/kotlin/checkers/DiagnosticsTestGenerated.java @@ -19821,6 +19821,12 @@ public class DiagnosticsTestGenerated extends AbstractDiagnosticsTest { doTest(fileName); } + @TestMetadata("typeAliasAsQualifier.kt") + public void testTypeAliasAsQualifier() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/diagnostics/tests/typealias/typeAliasAsQualifier.kt"); + doTest(fileName); + } + @TestMetadata("typeAliasConstructor.kt") public void testTypeAliasConstructor() throws Exception { String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/diagnostics/tests/typealias/typeAliasConstructor.kt");