mirror of
https://gitflic.ru/project/openide/openide.git
synced 2026-09-27 10:03:11 +07:00
show static members of expected type in basic completion
This commit is contained in:
+5
-3
@@ -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);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
+10
@@ -0,0 +1,10 @@
|
||||
class Super {
|
||||
public static final Super FOO = null;
|
||||
public static final boolean FOX = true;
|
||||
}
|
||||
|
||||
class Intermediate {
|
||||
Super s = FO<caret>
|
||||
}
|
||||
|
||||
|
||||
+12
@@ -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>)
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
+12
@@ -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>)
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
+10
@@ -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>
|
||||
}
|
||||
|
||||
|
||||
+12
@@ -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");
|
||||
|
||||
Reference in New Issue
Block a user