From eeacfb96a3fd2bd6b14dd40a0758fbfd78243403 Mon Sep 17 00:00:00 2001 From: Alexander Udalov Date: Thu, 19 Jul 2012 17:40:34 +0400 Subject: [PATCH] KT-2247 Report name clashes between inner classes and members of class object #KT-2247 Fixed --- .../MutableClassDescriptorLite.java | 7 ++++++ .../jet/lang/resolve/DeclarationResolver.java | 23 +++++++++++++++++++ .../tests/redeclarations/kt2247.kt | 14 +++++++++++ .../checkers/JetDiagnosticsTestGenerated.java | 10 +++++++- 4 files changed, 53 insertions(+), 1 deletion(-) create mode 100644 compiler/testData/diagnostics/tests/redeclarations/kt2247.kt diff --git a/compiler/frontend/src/org/jetbrains/jet/lang/descriptors/MutableClassDescriptorLite.java b/compiler/frontend/src/org/jetbrains/jet/lang/descriptors/MutableClassDescriptorLite.java index 11c883ee685..068a695751c 100644 --- a/compiler/frontend/src/org/jetbrains/jet/lang/descriptors/MutableClassDescriptorLite.java +++ b/compiler/frontend/src/org/jetbrains/jet/lang/descriptors/MutableClassDescriptorLite.java @@ -43,6 +43,7 @@ public abstract class MutableClassDescriptorLite extends ClassDescriptorBase private List typeParameters; private Collection supertypes = Lists.newArrayList(); + private final Collection innerClasses = Lists.newArrayList(); private TypeConstructor typeConstructor; @@ -209,6 +210,11 @@ public abstract class MutableClassDescriptorLite extends ClassDescriptorBase return innerClassesScope; } + public Collection getInnerClasses() { + return innerClasses; + } + + public void addSupertype(@NotNull JetType supertype) { if (!ErrorUtils.isErrorType(supertype)) { if (TypeUtils.getClassDescriptor(supertype) != null) { @@ -275,6 +281,7 @@ public abstract class MutableClassDescriptorLite extends ClassDescriptorBase @Override public void addClassifierDescriptor(@NotNull MutableClassDescriptorLite classDescriptor) { getScopeForMemberLookupAsWritableScope().addClassifierDescriptor(classDescriptor); + innerClasses.add(classDescriptor); } @Override diff --git a/compiler/frontend/src/org/jetbrains/jet/lang/resolve/DeclarationResolver.java b/compiler/frontend/src/org/jetbrains/jet/lang/resolve/DeclarationResolver.java index 0754795388a..4b1855b4d9e 100644 --- a/compiler/frontend/src/org/jetbrains/jet/lang/resolve/DeclarationResolver.java +++ b/compiler/frontend/src/org/jetbrains/jet/lang/resolve/DeclarationResolver.java @@ -93,6 +93,7 @@ public class DeclarationResolver { resolveFunctionAndPropertyHeaders(); importsResolver.processMembersImports(rootScope); checkRedeclarationsInNamespaces(); + checkClassObjectInnerClassNames(); } @@ -314,4 +315,26 @@ public class DeclarationResolver { } return declarations; } + + private void checkClassObjectInnerClassNames() { + for (MutableClassDescriptor classDescriptor : context.getClasses().values()) { + MutableClassDescriptorLite classObj = classDescriptor.getClassObjectDescriptor(); + if (classObj == null) { + continue; + } + + Collection myInnerClasses = classDescriptor.getInnerClasses(); + Collection classObjInnerClasses = classObj.getInnerClasses(); + + for (ClassDescriptor myInnerClass : myInnerClasses) { + for (ClassDescriptor classObjInnerClass : classObjInnerClasses) { + if (myInnerClass.getName().equals(classObjInnerClass.getName())) { + trace.report(REDECLARATION.on(BindingContextUtils.classDescriptorToDeclaration(trace.getBindingContext(), myInnerClass), myInnerClass.getName().getName())); + trace.report(REDECLARATION.on(BindingContextUtils.classDescriptorToDeclaration(trace.getBindingContext(), classObjInnerClass), classObjInnerClass.getName().getName())); + break; + } + } + } + } + } } diff --git a/compiler/testData/diagnostics/tests/redeclarations/kt2247.kt b/compiler/testData/diagnostics/tests/redeclarations/kt2247.kt new file mode 100644 index 00000000000..744681c4d83 --- /dev/null +++ b/compiler/testData/diagnostics/tests/redeclarations/kt2247.kt @@ -0,0 +1,14 @@ +//KT-2247 Report name clashes between inner classes and members of class object + +package kt2247 + +class B { + class object { + class Y { + } + } + + class Y { + } + +} diff --git a/compiler/tests/org/jetbrains/jet/checkers/JetDiagnosticsTestGenerated.java b/compiler/tests/org/jetbrains/jet/checkers/JetDiagnosticsTestGenerated.java index b673e9dd8b9..7370b45fc01 100644 --- a/compiler/tests/org/jetbrains/jet/checkers/JetDiagnosticsTestGenerated.java +++ b/compiler/tests/org/jetbrains/jet/checkers/JetDiagnosticsTestGenerated.java @@ -15,12 +15,15 @@ */ package org.jetbrains.jet.checkers; +import junit.framework.Assert; import junit.framework.Test; import junit.framework.TestSuite; + +import java.io.File; import org.jetbrains.jet.JetTestUtils; import org.jetbrains.jet.test.TestMetadata; -import java.io.File; +import org.jetbrains.jet.checkers.AbstractDiagnosticsTestWithEagerResolve; /** This class is generated by {@link org.jetbrains.jet.checkers.AbstractDiagnosticsTestWithEagerResolve}. DO NOT MODIFY MANUALLY */ public class JetDiagnosticsTestGenerated extends AbstractDiagnosticsTestWithEagerResolve { @@ -1766,6 +1769,11 @@ public class JetDiagnosticsTestGenerated extends AbstractDiagnosticsTestWithEage JetTestUtils.assertAllTestsPresentByMetadata(this.getClass(), "org.jetbrains.jet.checkers.AbstractDiagnosticsTestWithEagerResolve", new File("compiler/testData/diagnostics/tests/redeclarations"), "kt", false); } + @TestMetadata("kt2247.kt") + public void testKt2247() throws Exception { + doTest("compiler/testData/diagnostics/tests/redeclarations/kt2247.kt"); + } + @TestMetadata("MultiFilePackageRedeclaration.kt") public void testMultiFilePackageRedeclaration() throws Exception { doTest("compiler/testData/diagnostics/tests/redeclarations/MultiFilePackageRedeclaration.kt");