From 2d59791cf2495023685a69b118f7008c9c910837 Mon Sep 17 00:00:00 2001 From: "Pavel V. Talanov" Date: Wed, 11 Feb 2015 18:30:00 +0300 Subject: [PATCH] Improve LazyClassDescriptor#getDefaultObjectDescriptor() To cover the case when default object's name is not unique (redeclaration) (Calling getClassifier is wrong for this case) --- .../lazy/descriptors/LazyClassDescriptor.java | 4 +- .../classObjects/classObjectRedeclaration.kt | 19 ++++++ .../classObjects/classObjectRedeclaration.txt | 67 +++++++++++++++++++ .../checkers/JetDiagnosticsTestGenerated.java | 6 ++ 4 files changed, 95 insertions(+), 1 deletion(-) create mode 100644 compiler/testData/diagnostics/tests/classObjects/classObjectRedeclaration.kt create mode 100644 compiler/testData/diagnostics/tests/classObjects/classObjectRedeclaration.txt diff --git a/compiler/frontend/src/org/jetbrains/kotlin/resolve/lazy/descriptors/LazyClassDescriptor.java b/compiler/frontend/src/org/jetbrains/kotlin/resolve/lazy/descriptors/LazyClassDescriptor.java index 15fff39e264..54dbdb08454 100644 --- a/compiler/frontend/src/org/jetbrains/kotlin/resolve/lazy/descriptors/LazyClassDescriptor.java +++ b/compiler/frontend/src/org/jetbrains/kotlin/resolve/lazy/descriptors/LazyClassDescriptor.java @@ -382,8 +382,10 @@ public class LazyClassDescriptor extends ClassDescriptorBase implements ClassDes } Name name = ((JetClassOrObjectInfo) classObjectInfo).getName(); assert name != null; - ClassifierDescriptor classObjectDescriptor = getScopeForMemberLookup().getClassifier(name); + getScopeForMemberLookup().getClassifier(name); + ClassDescriptor classObjectDescriptor = c.getTrace().get(BindingContext.CLASS, classObject); if (classObjectDescriptor instanceof LazyClassDescriptor) { + assert DescriptorUtils.isClassObject(classObjectDescriptor) : "Not a class object: " + classObjectDescriptor; return (LazyClassDescriptor) classObjectDescriptor; } else { diff --git a/compiler/testData/diagnostics/tests/classObjects/classObjectRedeclaration.kt b/compiler/testData/diagnostics/tests/classObjects/classObjectRedeclaration.kt new file mode 100644 index 00000000000..a7dc674c135 --- /dev/null +++ b/compiler/testData/diagnostics/tests/classObjects/classObjectRedeclaration.kt @@ -0,0 +1,19 @@ +package test + +class A { + object Default + + class object +} + +class B { + class object Named + + object Named +} + +class C { + class Named + + class object Named +} \ No newline at end of file diff --git a/compiler/testData/diagnostics/tests/classObjects/classObjectRedeclaration.txt b/compiler/testData/diagnostics/tests/classObjects/classObjectRedeclaration.txt new file mode 100644 index 00000000000..6d61dfdaa13 --- /dev/null +++ b/compiler/testData/diagnostics/tests/classObjects/classObjectRedeclaration.txt @@ -0,0 +1,67 @@ +package + +package test { + + internal final class A { + public constructor A() + 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 + + internal object Default { + private constructor Default() + 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 + } + + internal class object Default { + private constructor Default() + 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 + } + } + + internal final class B { + public constructor B() + 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 + + internal object Named { + private constructor Named() + 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 + } + + internal class object Named { + private constructor Named() + 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 + } + } + + internal final class 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 + + internal final class Named { + public constructor Named() + 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 + } + + internal class object Named { + private constructor Named() + 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/JetDiagnosticsTestGenerated.java b/compiler/tests/org/jetbrains/kotlin/checkers/JetDiagnosticsTestGenerated.java index fafda7d59af..b91d44a0b6e 100644 --- a/compiler/tests/org/jetbrains/kotlin/checkers/JetDiagnosticsTestGenerated.java +++ b/compiler/tests/org/jetbrains/kotlin/checkers/JetDiagnosticsTestGenerated.java @@ -1439,6 +1439,12 @@ public class JetDiagnosticsTestGenerated extends AbstractJetDiagnosticsTest { doTest(fileName); } + @TestMetadata("classObjectRedeclaration.kt") + public void testClassObjectRedeclaration() throws Exception { + String fileName = JetTestUtils.navigationMetadata("compiler/testData/diagnostics/tests/classObjects/classObjectRedeclaration.kt"); + doTest(fileName); + } + @TestMetadata("ClassObjectVisibility.kt") public void testClassObjectVisibility() throws Exception { String fileName = JetTestUtils.navigationMetadata("compiler/testData/diagnostics/tests/classObjects/ClassObjectVisibility.kt");