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 a234f58bfee..15b5e2b4cc4 100644 --- a/compiler/frontend/src/org/jetbrains/jet/lang/resolve/DeclarationResolver.java +++ b/compiler/frontend/src/org/jetbrains/jet/lang/resolve/DeclarationResolver.java @@ -18,10 +18,8 @@ package org.jetbrains.jet.lang.resolve; import com.google.common.base.Function; import com.google.common.base.Predicate; -import com.google.common.collect.Collections2; -import com.google.common.collect.HashMultimap; -import com.google.common.collect.Lists; -import com.google.common.collect.Multimap; +import com.google.common.collect.*; +import com.intellij.openapi.util.Pair; import com.intellij.psi.PsiElement; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; @@ -32,10 +30,7 @@ import org.jetbrains.jet.lang.resolve.scopes.JetScope; import org.jetbrains.jet.lang.resolve.scopes.WritableScope; import javax.inject.Inject; -import java.util.Collection; -import java.util.Collections; -import java.util.List; -import java.util.Map; +import java.util.*; import static org.jetbrains.jet.lang.diagnostics.Errors.*; @@ -315,19 +310,45 @@ public class DeclarationResolver { Multimap descriptorMap = HashMultimap.create(); for (DeclarationDescriptor desc : allDescriptors) { - if (desc instanceof ClassDescriptor) { + if (desc instanceof ClassDescriptor || desc instanceof PropertyDescriptor) { descriptorMap.put(desc.getName(), desc); } } + + reportRedeclarations(descriptorMap); + } + } - for (Name name : descriptorMap.keySet()) { - Collection descriptors = descriptorMap.get(name); - if (descriptors.size() > 1) { - for (DeclarationDescriptor descriptor : descriptors) { - trace.report(REDECLARATION.on(BindingContextUtils.classDescriptorToDeclaration(trace.getBindingContext(), (ClassDescriptor)descriptor), descriptor.getName().getName())); + private void reportRedeclarations(@NotNull Multimap descriptorMap) { + Set> redeclarations = Sets.newHashSet(); + for (Name name : descriptorMap.keySet()) { + Collection descriptors = descriptorMap.get(name); + if (descriptors.size() > 1) { + // We mustn't compare PropertyDescriptor with PropertyDescriptor because we do this at OverloadResolver + for (DeclarationDescriptor descriptor : descriptors) { + if (descriptor instanceof ClassDescriptor) { + for (DeclarationDescriptor descriptor2 : descriptors) { + if (descriptor == descriptor2) { + continue; + } + + redeclarations.add(Pair.create( + BindingContextUtils.classDescriptorToDeclaration(trace.getBindingContext(), (ClassDescriptor) descriptor), + descriptor.getName())); + if (descriptor2 instanceof PropertyDescriptor) { + redeclarations.add(Pair.create( + BindingContextUtils.descriptorToDeclaration(trace.getBindingContext(), descriptor2), + descriptor2.getName())); + } + } } } } } + for (Pair redeclaration : redeclarations) { + trace.report(REDECLARATION.on(redeclaration.getFirst(), redeclaration.getSecond().getName())); + } } + + } diff --git a/compiler/testData/diagnostics/tests/redeclarations/PropertyAndInnerClass.kt b/compiler/testData/diagnostics/tests/redeclarations/PropertyAndInnerClass.kt new file mode 100644 index 00000000000..afa9b89aa2b --- /dev/null +++ b/compiler/testData/diagnostics/tests/redeclarations/PropertyAndInnerClass.kt @@ -0,0 +1,13 @@ +public class A() { + public val FOO: String = "test" + + public class FOO() { } +} + +public class B() { + class object { + public val FOO: String = "test" + + public class FOO() { } + } +} diff --git a/compiler/tests/org/jetbrains/jet/checkers/JetDiagnosticsTestGenerated.java b/compiler/tests/org/jetbrains/jet/checkers/JetDiagnosticsTestGenerated.java index 27e92ab48e2..9dec273a6fd 100644 --- a/compiler/tests/org/jetbrains/jet/checkers/JetDiagnosticsTestGenerated.java +++ b/compiler/tests/org/jetbrains/jet/checkers/JetDiagnosticsTestGenerated.java @@ -2265,6 +2265,11 @@ public class JetDiagnosticsTestGenerated extends AbstractDiagnosticsTestWithEage doTest("compiler/testData/diagnostics/tests/redeclarations/PropertyAndFunInClass.kt"); } + @TestMetadata("PropertyAndInnerClass.kt") + public void testPropertyAndInnerClass() throws Exception { + doTest("compiler/testData/diagnostics/tests/redeclarations/PropertyAndInnerClass.kt"); + } + @TestMetadata("Redeclarations.kt") public void testRedeclarations() throws Exception { doTest("compiler/testData/diagnostics/tests/redeclarations/Redeclarations.kt");