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 c65992bff44..c3fdd406f96 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(); } @@ -297,4 +298,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 8e35cfff322..8fea98da766 100644 --- a/compiler/tests/org/jetbrains/jet/checkers/JetDiagnosticsTestGenerated.java +++ b/compiler/tests/org/jetbrains/jet/checkers/JetDiagnosticsTestGenerated.java @@ -1769,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");