complete siblings of statically imported fields, too (java)

This commit is contained in:
peter
2010-08-31 13:52:36 +01:00
parent c59f1f9ddf
commit 385649b73b
9 changed files with 109 additions and 17 deletions
@@ -883,7 +883,7 @@ public class JavaCompletionUtil {
}
}
JavaGlobalMemberNameCompletionContributor.completeStaticMembers(element).processMethodsOfRegisteredClasses(matcher, new Consumer<LookupElement>() {
JavaGlobalMemberNameCompletionContributor.completeStaticMembers(element).processMembersOfRegisteredClasses(matcher, new Consumer<LookupElement>() {
@Override
public void consume(LookupElement element) {
set.add(element);
@@ -1,8 +1,10 @@
package com.intellij.codeInsight.completion;
import com.intellij.codeInsight.lookup.LookupElement;
import com.intellij.codeInsight.lookup.VariableLookupItem;
import com.intellij.openapi.application.ApplicationManager;
import com.intellij.psi.*;
import com.intellij.psi.util.PsiTreeUtil;
import org.jetbrains.annotations.NotNull;
/**
@@ -39,11 +41,25 @@ public class JavaGlobalMemberNameCompletionContributor extends CompletionContrib
final StaticMemberProcessor processor = new StaticMemberProcessor(position) {
@NotNull
@Override
protected LookupElement createLookupElement(@NotNull PsiMethod method, @NotNull PsiClass containingClass, boolean shouldImport) {
final JavaMethodCallElement element = new JavaMethodCallElement(method, true);
element.setShouldBeImported(shouldImport);
return element;
protected LookupElement createLookupElement(@NotNull PsiMember member, @NotNull final PsiClass containingClass, boolean shouldImport) {
if (member instanceof PsiMethod) {
final JavaMethodCallElement element = new JavaMethodCallElement((PsiMethod)member, true);
element.setShouldBeImported(shouldImport);
return element;
}
return new VariableLookupItem((PsiVariable)member) {
@Override
public void handleInsert(InsertionContext context) {
context.commitDocument();
final PsiReferenceExpression ref = PsiTreeUtil.findElementOfClassAtOffset(context.getFile(), context.getStartOffset(), PsiReferenceExpression.class, false);
if (ref != null) {
ref.bindToElementViaStaticImport(containingClass);
}
super.handleInsert(context);
}
};
}
};
ApplicationManager.getApplication().runReadAction(new Runnable() {
public void run() {
@@ -64,7 +64,7 @@ public abstract class StaticMemberProcessor {
for (final PsiMethod method : methods) {
ApplicationManager.getApplication().runReadAction(new Runnable() {
public void run() {
processMethod(method, consumer);
processMember(method, consumer);
}
});
@@ -73,7 +73,7 @@ public abstract class StaticMemberProcessor {
}
}
public void processMethodsOfRegisteredClasses(@Nullable final PrefixMatcher matcher, final Consumer<LookupElement> consumer) {
public void processMembersOfRegisteredClasses(@Nullable final PrefixMatcher matcher, final Consumer<LookupElement> consumer) {
for (final PsiClass psiClass : myStaticImportedClasses) {
final PsiMethod[] classMethods = ApplicationManager.getApplication().runReadAction(new Computable<PsiMethod[]>() {
public PsiMethod[] compute() {
@@ -84,7 +84,21 @@ public abstract class StaticMemberProcessor {
ApplicationManager.getApplication().runReadAction(new Runnable() {
public void run() {
if (matcher == null || matcher.prefixMatches(method.getName())) {
processMethod(method, consumer);
processMember(method, consumer);
}
}
});
}
final PsiField[] fields = ApplicationManager.getApplication().runReadAction(new Computable<PsiField[]>() {
public PsiField[] compute() {
return psiClass.getAllFields();
}
});
for (final PsiField field : fields) {
ApplicationManager.getApplication().runReadAction(new Runnable() {
public void run() {
if (matcher == null || matcher.prefixMatches(field.getName())) {
processMember(field, consumer);
}
}
});
@@ -93,11 +107,12 @@ public abstract class StaticMemberProcessor {
}
private void processMethod(final PsiMethod method, final Consumer<LookupElement> consumer) {
if (method.hasModifierProperty(PsiModifier.STATIC) && myResolveHelper.isAccessible(method, myPosition, null)) {
final PsiClass containingClass = method.getContainingClass();
private void processMember(final PsiMember member, final Consumer<LookupElement> consumer) {
if (member.hasModifierProperty(PsiModifier.STATIC) && myResolveHelper.isAccessible(member, myPosition, null)) {
final PsiClass containingClass = member.getContainingClass();
if (containingClass != null) {
if (!JavaCompletionUtil.isInExcludedPackage(containingClass) && !StaticImportMethodFix.isExcluded(method)) {
if (!JavaCompletionUtil.isInExcludedPackage(containingClass) &&
(!(member instanceof PsiMethod) || !StaticImportMethodFix.isExcluded((PsiMethod)member))) {
final boolean shouldImport = myStaticImportedClasses.contains(containingClass);
if (!myHintShown &&
!shouldImport &&
@@ -110,7 +125,7 @@ public abstract class StaticMemberProcessor {
myHintShown = true;
}
consumer.consume(createLookupElement(method, containingClass, shouldImport));
consumer.consume(createLookupElement(member, containingClass, shouldImport));
}
}
@@ -118,5 +133,5 @@ public abstract class StaticMemberProcessor {
}
@NotNull
protected abstract LookupElement createLookupElement(@NotNull PsiMethod method, @NotNull PsiClass containingClass, boolean shouldImport);
protected abstract LookupElement createLookupElement(@NotNull PsiMember member, @NotNull PsiClass containingClass, boolean shouldImport);
}
@@ -0,0 +1,15 @@
import static Bar.BAR;
import static Bar.FOO;
class Bar {
static String FOO;
static String BAR;
}
class Foo {
Object[] foo() {
String a = FOO;
String b = BAR;<caret>
}
}
@@ -0,0 +1,14 @@
import static Bar.FOO;
class Bar {
static String FOO;
static String BAR;
}
class Foo {
Object[] foo() {
String a = FOO;
String b = BA<caret>
}
}
@@ -0,0 +1,13 @@
import static Bar.FOO
class Bar {
static String FOO;
static String BAR;
}
class Foo {
Object[] foo() {
String b = FOO;<caret>
}
}
@@ -0,0 +1,13 @@
import static Bar.FOO
class Bar {
static String FOO;
static String BAR;
}
class Foo {
Object[] foo() {
String b = FO<caret>
}
}
@@ -936,6 +936,9 @@ public class SmartTypeCompletionTest extends LightCompletionTestCase {
doTest();
}
public void testStaticallyImportedField() throws Throwable { doTest(); }
public void testSiblingOfAStaticallyImportedField() throws Throwable { doTest(); }
public void testInferFromCall() throws Throwable {
doTest();
}
@@ -160,7 +160,7 @@ public class GroovyCompletionContributor extends CompletionContributor {
}
});
completeStaticMembers(position).processMethodsOfRegisteredClasses(result.getPrefixMatcher(), new Consumer<LookupElement>() {
completeStaticMembers(position).processMembersOfRegisteredClasses(result.getPrefixMatcher(), new Consumer<LookupElement>() {
@Override
public void consume(LookupElement element) {
result.addElement(element);
@@ -389,8 +389,11 @@ public class GroovyCompletionContributor extends CompletionContributor {
final StaticMemberProcessor processor = new StaticMemberProcessor(position) {
@NotNull
@Override
protected LookupElement createLookupElement(@NotNull PsiMethod method, @NotNull PsiClass containingClass, boolean shouldImport) {
return new JavaGlobalMemberLookupElement(method, containingClass, QUALIFIED_METHOD_INSERT_HANDLER, STATIC_IMPORT_INSERT_HANDLER, shouldImport);
protected LookupElement createLookupElement(@NotNull PsiMember member, @NotNull PsiClass containingClass, boolean shouldImport) {
if (member instanceof PsiMethod) {
return new JavaGlobalMemberLookupElement((PsiMethod)member, containingClass, QUALIFIED_METHOD_INSERT_HANDLER, STATIC_IMPORT_INSERT_HANDLER, shouldImport);
}
return GroovyCompletionUtil.getLookupElement(member); //todo;
}
};
final PsiFile file = position.getContainingFile();