IDEA-48622 Duplicated static fields in smart completion list

This commit is contained in:
peter.gromov
2010-11-15 19:12:37 +03:00
parent 656f185c38
commit ba7b415786
4 changed files with 33 additions and 3 deletions
@@ -26,6 +26,7 @@ import com.intellij.psi.*;
import com.intellij.psi.filters.TrueFilter;
import com.intellij.psi.scope.processor.FilterScopeProcessor;
import com.intellij.psi.tree.IElementType;
import com.intellij.psi.util.InheritanceUtil;
import com.intellij.psi.util.PsiTreeUtil;
import com.intellij.psi.util.PsiUtil;
import org.jetbrains.annotations.Nullable;
@@ -104,6 +105,15 @@ public class MembersGetter {
final boolean acceptMethods, PsiType expectedType) {
if (where == null) return;
PsiClass current = PsiTreeUtil.getContextOfType(context, PsiClass.class);
while (current != null) {
current = JavaCompletionUtil.getOriginalElement(current);
if (InheritanceUtil.isInheritorOrSelf(current, where, true)) {
return;
}
current = PsiTreeUtil.getContextOfType(current, PsiClass.class);
}
final FilterScopeProcessor<PsiElement> processor = new FilterScopeProcessor<PsiElement>(TrueFilter.INSTANCE);
where.processDeclarations(processor, ResolveState.initial(), null, context);
@@ -111,9 +121,7 @@ public class MembersGetter {
for (final PsiElement result : processor.getResults()) {
if (result instanceof PsiMember && !(result instanceof PsiClass)) {
final PsiMember member = (PsiMember)result;
if (member.hasModifierProperty(PsiModifier.STATIC) &&
!PsiTreeUtil.isAncestor(member.getContainingClass(), context, false) &&
resolveHelper.isAccessible(member, context, null)) {
if (member.hasModifierProperty(PsiModifier.STATIC) && resolveHelper.isAccessible(member, context, null)) {
if (result instanceof PsiField && !member.hasModifierProperty(PsiModifier.FINAL)) continue;
if (result instanceof PsiMethod && acceptMethods) continue;
final LookupItem item = (LookupItem)LookupItemUtil.objectToLookupItem(result);
@@ -0,0 +1,10 @@
class Super {
public static final Super FOO = null;
}
class Intermediate extends Super {
Super s = FOO;<caret>
}
@@ -0,0 +1,10 @@
class Super {
public static final Super FOO = null;
}
class Intermediate extends Super {
Super s = F<caret>
}
@@ -985,6 +985,8 @@ public class SmartTypeCompletionTest extends LightCompletionTestCase {
doItemTest();
}
public void testDuplicateMembersFromSuperClass() throws Throwable { doActionTest(); }
public void testInsideGenericClassLiteral() throws Throwable {
configureByTestName();
testByCount(3, "String.class", "StringBuffer.class", "StringBuilder.class");