Front-end: Prohibit to create inner class with the same name as a property

This commit is contained in:
Natalia.Ukhorskaya
2012-08-31 11:15:57 +04:00
parent 5038c906b2
commit 1ef8818556
3 changed files with 53 additions and 14 deletions
@@ -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<Name, DeclarationDescriptor> 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<DeclarationDescriptor> 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<Name, DeclarationDescriptor> descriptorMap) {
Set<Pair<PsiElement, Name>> redeclarations = Sets.newHashSet();
for (Name name : descriptorMap.keySet()) {
Collection<DeclarationDescriptor> 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<PsiElement, Name> redeclaration : redeclarations) {
trace.report(REDECLARATION.on(redeclaration.getFirst(), redeclaration.getSecond().getName()));
}
}
}
@@ -0,0 +1,13 @@
public class A() {
public val <!REDECLARATION!>FOO<!>: String = "test"
public class <!REDECLARATION!>FOO<!>() { }
}
public class B() {
class object {
public val <!REDECLARATION!>FOO<!>: String = "test"
public class <!REDECLARATION!>FOO<!>() { }
}
}
@@ -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");