mirror of
https://gitflic.ru/project/openide/openide.git
synced 2026-09-27 10:03:11 +07:00
more explicit class processing in class name completion
This commit is contained in:
@@ -24,12 +24,11 @@ import com.intellij.openapi.editor.Editor;
|
||||
import com.intellij.openapi.editor.RangeMarker;
|
||||
import com.intellij.openapi.progress.ProgressManager;
|
||||
import com.intellij.openapi.util.Condition;
|
||||
import com.intellij.patterns.PsiJavaPatterns;
|
||||
import com.intellij.psi.*;
|
||||
import com.intellij.psi.filters.ElementFilter;
|
||||
import com.intellij.psi.impl.source.PostprocessReformattingAspect;
|
||||
import com.intellij.psi.search.GlobalSearchScope;
|
||||
import com.intellij.psi.search.searches.AllClassesSearch;
|
||||
import com.intellij.util.Consumer;
|
||||
import com.intellij.util.IncorrectOperationException;
|
||||
import com.intellij.util.Processor;
|
||||
import gnu.trove.THashSet;
|
||||
@@ -46,7 +45,6 @@ import java.util.Set;
|
||||
*/
|
||||
public class AllClassesGetter {
|
||||
private static final Logger LOG = Logger.getInstance("#com.intellij.codeInsight.completion.AllClassesGetter");
|
||||
private final ElementFilter myFilter;
|
||||
private static final InsertHandler<JavaPsiClassReferenceElement> INSERT_HANDLER = new InsertHandler<JavaPsiClassReferenceElement>() {
|
||||
|
||||
private void _handleInsert(final InsertionContext context, final JavaPsiClassReferenceElement item) {
|
||||
@@ -138,30 +136,15 @@ public class AllClassesGetter {
|
||||
|
||||
};
|
||||
|
||||
public AllClassesGetter(final ElementFilter filter) {
|
||||
myFilter = filter;
|
||||
}
|
||||
|
||||
public void getClasses(final PsiElement context, final CompletionResultSet set, final int offset, final boolean filterByScope) {
|
||||
if (context == null || !context.isValid()) return;
|
||||
|
||||
final boolean lookingForAnnotations = PsiJavaPatterns.psiElement().afterLeaf("@").accepts(context);
|
||||
getClasses(context, set, offset, filterByScope, lookingForAnnotations);
|
||||
}
|
||||
|
||||
public void getClasses(final PsiElement context,
|
||||
final CompletionResultSet set,
|
||||
final int offset,
|
||||
final boolean filterByScope,
|
||||
final boolean lookingForAnnotations) {
|
||||
if (context == null || !context.isValid()) return;
|
||||
|
||||
final String packagePrefix = getPackagePrefix(context, offset);
|
||||
public static void processJavaClasses(CompletionParameters parameters,
|
||||
final PrefixMatcher prefixMatcher, final boolean filterByScope,
|
||||
final Consumer<PsiClass> consumer) {
|
||||
final PsiElement context = parameters.getPosition();
|
||||
final String packagePrefix = getPackagePrefix(context, parameters.getOffset());
|
||||
|
||||
final Set<String> qnames = new THashSet<String>();
|
||||
|
||||
final GlobalSearchScope scope = filterByScope ? context.getContainingFile().getResolveScope() : GlobalSearchScope.allScope(context.getProject());
|
||||
final PrefixMatcher prefixMatcher = set.getPrefixMatcher();
|
||||
|
||||
AllClassesSearch.search(scope, context.getProject(), new Condition<String>() {
|
||||
public boolean value(String s) {
|
||||
@@ -170,14 +153,15 @@ public class AllClassesGetter {
|
||||
}).forEach(new Processor<PsiClass>() {
|
||||
public boolean process(PsiClass psiClass) {
|
||||
assert psiClass != null;
|
||||
if (isSuitable(context, packagePrefix, qnames, lookingForAnnotations, psiClass, filterByScope)) {
|
||||
set.addElement(createLookupItem(psiClass));
|
||||
if (isSuitable(context, packagePrefix, qnames, psiClass, filterByScope)) {
|
||||
consumer.consume(psiClass);
|
||||
}
|
||||
return true;
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
|
||||
private static String getPackagePrefix(final PsiElement context, final int offset) {
|
||||
final String fileText = context.getContainingFile().getText();
|
||||
int i = offset - 1;
|
||||
@@ -191,23 +175,18 @@ public class AllClassesGetter {
|
||||
return j > 0 ? prefix.substring(0, j) : "";
|
||||
}
|
||||
|
||||
private boolean isSuitable(@NotNull final PsiElement context, final String packagePrefix, final Set<String> qnames,
|
||||
final boolean lookingForAnnotations,
|
||||
private static boolean isSuitable(@NotNull final PsiElement context, final String packagePrefix, final Set<String> qnames,
|
||||
@NotNull final PsiClass psiClass,
|
||||
final boolean filterByScope) {
|
||||
ProgressManager.checkCanceled();
|
||||
|
||||
if (!context.isValid() || !psiClass.isValid()) return false;
|
||||
|
||||
if (lookingForAnnotations && !psiClass.isAnnotationType()) return false;
|
||||
|
||||
if (JavaCompletionUtil.isInExcludedPackage(psiClass)) return false;
|
||||
|
||||
final String qualifiedName = psiClass.getQualifiedName();
|
||||
if (qualifiedName == null || !qualifiedName.startsWith(packagePrefix)) return false;
|
||||
|
||||
if (!myFilter.isAcceptable(psiClass, context)) return false;
|
||||
|
||||
if (!(psiClass instanceof PsiCompiledElement) || !filterByScope ||
|
||||
JavaPsiFacade.getInstance(psiClass.getProject()).getResolveHelper().isAccessible(psiClass, context, psiClass)) {
|
||||
return qnames.add(qualifiedName);
|
||||
|
||||
+22
-12
@@ -23,14 +23,17 @@ import com.intellij.openapi.actionSystem.IdeActions;
|
||||
import com.intellij.openapi.editor.Editor;
|
||||
import com.intellij.openapi.util.text.StringUtil;
|
||||
import com.intellij.patterns.PsiJavaElementPattern;
|
||||
import com.intellij.patterns.PsiJavaPatterns;
|
||||
import com.intellij.psi.*;
|
||||
import com.intellij.psi.filters.ClassFilter;
|
||||
import com.intellij.psi.filters.ElementFilter;
|
||||
import com.intellij.psi.filters.TrueFilter;
|
||||
import com.intellij.psi.filters.classes.ThisOrAnyInnerFilter;
|
||||
import com.intellij.psi.filters.element.ExcludeDeclaredFilter;
|
||||
import com.intellij.psi.filters.types.AssignableFromFilter;
|
||||
import com.intellij.psi.util.PsiTreeUtil;
|
||||
import com.intellij.psi.util.PsiUtil;
|
||||
import com.intellij.util.Consumer;
|
||||
import com.intellij.util.ProcessingContext;
|
||||
import org.jetbrains.annotations.NotNull;
|
||||
|
||||
@@ -57,18 +60,14 @@ public class JavaClassNameCompletionContributor extends CompletionContributor {
|
||||
CompletionService.getCompletionService().setAdvertisementText(CompletionBundle.message("completion.class.name.hint.2", getActionShortcut(IdeActions.ACTION_CLASS_NAME_COMPLETION)));
|
||||
}
|
||||
|
||||
PsiElement insertedElement = parameters.getPosition();
|
||||
final PsiElement insertedElement = parameters.getPosition();
|
||||
|
||||
final ElementFilter filter =
|
||||
AFTER_THROW_NEW.accepts(insertedElement) ? new AssignableFromFilter("java.lang.Throwable") :
|
||||
IN_TYPE_PARAMETER.accepts(insertedElement) ? new ExcludeDeclaredFilter(new ClassFilter(PsiTypeParameter.class)) :
|
||||
INSIDE_METHOD_THROWS_CLAUSE.accepts(insertedElement) ? new ThisOrAnyInnerFilter(new AssignableFromFilter("java.lang.Throwable")) :
|
||||
TrueFilter.INSTANCE;
|
||||
|
||||
AllClassesGetter getter = new AllClassesGetter(TrueFilter.INSTANCE);
|
||||
if (AFTER_THROW_NEW.accepts(insertedElement)) {
|
||||
getter = new AllClassesGetter(new AssignableFromFilter("java.lang.Throwable"));
|
||||
}
|
||||
else if (IN_TYPE_PARAMETER.accepts(insertedElement)) {
|
||||
getter = new AllClassesGetter(new ExcludeDeclaredFilter(new ClassFilter(PsiTypeParameter.class)));
|
||||
}
|
||||
else if (INSIDE_METHOD_THROWS_CLAUSE.accepts(insertedElement)) {
|
||||
getter = new AllClassesGetter(new ThisOrAnyInnerFilter(new AssignableFromFilter("java.lang.Throwable")));
|
||||
}
|
||||
|
||||
if (AFTER_NEW.accepts(insertedElement)) {
|
||||
final PsiExpression expr = PsiTreeUtil.getContextOfType(insertedElement, PsiExpression.class, true);
|
||||
@@ -88,7 +87,18 @@ public class JavaClassNameCompletionContributor extends CompletionContributor {
|
||||
}
|
||||
}
|
||||
|
||||
getter.getClasses(insertedElement, result, parameters.getOffset(), parameters.getInvocationCount() <= 1);
|
||||
final boolean lookingForAnnotations = PsiJavaPatterns.psiElement().afterLeaf("@").accepts(insertedElement);
|
||||
|
||||
AllClassesGetter.processJavaClasses(parameters, result.getPrefixMatcher(), parameters.getInvocationCount() <= 1, new Consumer<PsiClass>() {
|
||||
@Override
|
||||
public void consume(PsiClass psiClass) {
|
||||
if (lookingForAnnotations && !psiClass.isAnnotationType()) return;
|
||||
|
||||
if (filter.isAcceptable(psiClass, insertedElement)) {
|
||||
result.addElement(AllClassesGetter.createLookupItem(psiClass));
|
||||
}
|
||||
}
|
||||
});
|
||||
}
|
||||
});
|
||||
|
||||
|
||||
Reference in New Issue
Block a user