show static members of expected type in basic completion

This commit is contained in:
peter.gromov
2010-11-15 19:12:39 +03:00
parent ba7b415786
commit b757bc2b90
8 changed files with 77 additions and 8 deletions
@@ -20,6 +20,7 @@ import com.intellij.codeInsight.lookup.*;
import com.intellij.codeInsight.template.SmartCompletionContextType;
import com.intellij.codeInsight.template.impl.TemplateImpl;
import com.intellij.codeInsight.template.impl.TemplateSettings;
import com.intellij.patterns.ElementPattern;
import com.intellij.patterns.PsiJavaPatterns;
import com.intellij.psi.*;
import com.intellij.psi.filters.getters.ClassLiteralGetter;
@@ -44,6 +45,7 @@ import static com.intellij.patterns.StandardPatterns.not;
* @author peter
*/
public class BasicExpressionCompletionContributor extends ExpressionSmartCompletionContributor{
public static final ElementPattern<PsiElement> AFTER_DOT = psiElement().afterLeaf(".");
private static void addKeyword(final CompletionResultSet result, final PsiElement element, final String s) {
result.addElement(createKeywordLookupItem(element, s));
@@ -73,10 +75,10 @@ public class BasicExpressionCompletionContributor extends ExpressionSmartComplet
});
extend(not(psiElement().afterLeaf(".")), new CollectionsUtilityMethodsProvider());
extend(not(psiElement().afterLeaf(".")), new ClassLiteralGetter());
extend(not(AFTER_DOT), new CollectionsUtilityMethodsProvider());
extend(not(AFTER_DOT), new ClassLiteralGetter());
extend(not(psiElement().afterLeaf(".")), new CompletionProvider<JavaSmartCompletionParameters>() {
extend(not(AFTER_DOT), new CompletionProvider<JavaSmartCompletionParameters>() {
protected void addCompletions(@NotNull final JavaSmartCompletionParameters parameters, final ProcessingContext context, @NotNull final CompletionResultSet result) {
final PsiElement position = parameters.getPosition();
final PsiType expectedType = parameters.getExpectedType();
@@ -15,6 +15,7 @@
*/
package com.intellij.codeInsight.completion;
import com.intellij.codeInsight.ExpectedTypeInfo;
import com.intellij.codeInsight.TailType;
import com.intellij.codeInsight.TailTypes;
import com.intellij.codeInsight.completion.util.ParenthesesInsertHandler;
@@ -30,6 +31,7 @@ import com.intellij.psi.filters.*;
import com.intellij.psi.filters.classes.EnumOrAnnotationTypeFilter;
import com.intellij.psi.filters.classes.InterfaceFilter;
import com.intellij.psi.filters.element.ReferenceOnFilter;
import com.intellij.psi.filters.getters.MembersGetter;
import com.intellij.psi.filters.position.*;
import com.intellij.psi.filters.types.TypeCodeFragmentIsVoidEnabledFilter;
import com.intellij.psi.impl.source.jsp.jspJava.JspClassLevelDeclarationStatement;
@@ -619,6 +621,14 @@ public class JavaCompletionData extends JavaAwareCompletionData{
}
}
if (JavaSmartCompletionContributor.INSIDE_EXPRESSION.accepts(position) &&
!BasicExpressionCompletionContributor.AFTER_DOT.accepts(position) &&
!(position.getParent() instanceof PsiLiteralExpression) &&
!(position.getParent().getParent() instanceof PsiSwitchLabelStatement)) {
for (final ExpectedTypeInfo info : JavaSmartCompletionContributor.getExpectedTypes(parameters)) {
MembersGetter.addMembers(position, info.getDefaultType(), result);
}
}
}
private static LookupElement createKeyword(PsiElement position, String keyword) {
@@ -19,9 +19,7 @@ import com.intellij.codeInsight.completion.CompletionResultSet;
import com.intellij.codeInsight.completion.JavaMethodCallElement;
import com.intellij.codeInsight.completion.SmartCompletionDecorator;
import com.intellij.codeInsight.completion.JavaCompletionUtil;
import com.intellij.codeInsight.lookup.AutoCompletionPolicy;
import com.intellij.codeInsight.lookup.LookupItem;
import com.intellij.codeInsight.lookup.LookupItemUtil;
import com.intellij.codeInsight.lookup.*;
import com.intellij.psi.*;
import com.intellij.psi.filters.TrueFilter;
import com.intellij.psi.scope.processor.FilterScopeProcessor;
@@ -124,7 +122,7 @@ public class MembersGetter {
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);
final LookupItem item = result instanceof PsiMethod ? new JavaMethodCallElement((PsiMethod)result) : new VariableLookupItem((PsiVariable)result);
item.setAutoCompletionPolicy(AutoCompletionPolicy.NEVER_AUTOCOMPLETE);
JavaCompletionUtil.qualify(item);
if (member instanceof PsiMethod) {
@@ -132,7 +130,10 @@ public class MembersGetter {
final PsiSubstitutor substitutor = SmartCompletionDecorator.calculateMethodReturnTypeSubstitutor(method, expectedType);
((JavaMethodCallElement) item).setInferenceSubstitutor(substitutor);
}
results.addElement(item);
final PsiType itemType = ((TypedLookupItem)item).getType();
if (itemType != null && expectedType.isAssignableFrom(itemType)) {
results.addElement(item);
}
}
}
}
@@ -0,0 +1,10 @@
class Super {
public static final Super FOO = null;
public static final boolean FOX = true;
}
class Intermediate {
Super s = FO<caret>
}
@@ -0,0 +1,12 @@
class Super {
public static final Super FOO = null;
}
class Intermediate {
void foo(Super s, int a) {}
void bar() {
foo(FO<caret>)
}
}
@@ -0,0 +1,12 @@
class Super {
public static final Super FOO = null;
}
class Intermediate {
void foo(Super s, int a) {}
void bar() {
foo(Super.FOO<caret>)
}
}
@@ -0,0 +1,10 @@
class Super {
public static final Super FOO = null;
public static final boolean FOX = true;
}
class Intermediate {
Super s = Super.FOO<caret>
}
@@ -717,6 +717,18 @@ public class NormalCompletionTest extends LightFixtureCompletionTestCase {
public void testPrimitiveMethodParameter() throws Throwable { doTest(); }
public void testSuggestExpectedTypeMembers() throws Throwable {
configure()
selectItem myItems[0]
checkResultByFile(getTestName(false) + "_after.java");
}
public void testSuggestExpectedTypeMembersInCall() throws Throwable {
configure()
selectItem myItems[0]
checkResultByFile(getTestName(false) + "_after.java");
}
public void testRightShift() throws Throwable {
configure()
assertStringItems("myField1", "myField2");