Avoid PsiElementFilter and CollectFilteredElements; deprecate CollectFilteredElements

GitOrigin-RevId: 8ae4be6a3f4ce016d8a8b0d317d43da201a3d6d7
This commit is contained in:
Tagir Valeev
2020-03-22 07:39:50 +00:00
committed by intellij-monorepo-bot
parent 6254cd93bf
commit 022075be4b
6 changed files with 33 additions and 36 deletions
@@ -20,18 +20,19 @@ import com.intellij.openapi.util.Comparing;
import com.intellij.openapi.util.TextRange;
import com.intellij.psi.PsiElement;
import com.intellij.psi.PsiReference;
import com.intellij.psi.SyntaxTraverser;
import com.intellij.psi.search.PsiElementProcessor;
import com.intellij.psi.util.PsiElementFilter;
import com.intellij.psi.util.PsiTreeUtil;
import com.intellij.util.IncorrectOperationException;
import com.intellij.util.SmartList;
import org.intellij.lang.regexp.psi.RegExpBackref;
import org.intellij.lang.regexp.psi.RegExpElement;
import org.intellij.lang.regexp.psi.RegExpElementVisitor;
import org.intellij.lang.regexp.psi.RegExpGroup;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import java.util.List;
import static com.intellij.openapi.util.text.StringUtil.trimEnd;
import static com.intellij.openapi.util.text.StringUtil.trimStart;
@@ -94,12 +95,9 @@ public class RegExpBackrefImpl extends RegExpElementImpl implements RegExpBackre
@Nullable
private RegExpGroup resolveRelativeGroup(int index) {
PsiElementProcessor.CollectFilteredElements<PsiElement> processor =
new PsiElementProcessor.CollectFilteredElements<>(
element -> element instanceof RegExpGroup && ((RegExpGroup)element).isCapturing());
PsiTreeUtil.processElements(getContainingFile(), processor);
SmartList<PsiElement> elements = new SmartList<>(processor.getCollection());
return index <= elements.size() ? (RegExpGroup)elements.get(elements.size() - index) : null;
List<RegExpGroup> groups = SyntaxTraverser.psiTraverser(getContainingFile()).filter(RegExpGroup.class)
.filter(RegExpGroup::isCapturing).toList();
return index <= groups.size() ? groups.get(groups.size() - index) : null;
}
@Override
@@ -6,6 +6,7 @@ import com.intellij.openapi.util.Comparing;
import com.intellij.openapi.util.TextRange;
import com.intellij.psi.PsiElement;
import com.intellij.psi.PsiReference;
import com.intellij.psi.SyntaxTraverser;
import com.intellij.psi.search.PsiElementProcessor;
import com.intellij.psi.tree.TokenSet;
import com.intellij.psi.util.PsiTreeUtil;
@@ -122,11 +123,8 @@ public class RegExpNamedGroupRefImpl extends RegExpElementImpl implements RegExp
@Override
public Object @NotNull [] getVariants() {
final PsiElementProcessor.CollectFilteredElements<PsiElement> processor = new PsiElementProcessor.CollectFilteredElements<>(
e -> e instanceof RegExpGroup && ((RegExpGroup)e).isAnyNamedGroup()
);
PsiTreeUtil.processElements(getContainingFile(), processor);
return processor.toArray();
return SyntaxTraverser.psiTraverser(getContainingFile()).filter(RegExpGroup.class)
.filter(RegExpGroup::isAnyNamedGroup).toArray(new RegExpGroup[0]);
}
@Override
@@ -69,6 +69,11 @@ public interface PsiElementProcessor<T extends PsiElement> {
}
}
/**
* @deprecated use {@link com.intellij.psi.SyntaxTraverser} API instead. E.g.
* {@code SyntaxTraverser.psiTraverser(root).filter(ElementType.class).filter(additionalFilter).toList()}
*/
@Deprecated
class CollectFilteredElements<T extends PsiElement> extends CollectElements<T> {
private final PsiElementFilter myFilter;
@@ -12,7 +12,6 @@ import com.intellij.psi.*;
import com.intellij.psi.scope.PsiScopeProcessor;
import com.intellij.psi.search.PsiElementProcessor;
import com.intellij.psi.search.PsiElementProcessor.CollectElements;
import com.intellij.psi.search.PsiElementProcessor.CollectFilteredElements;
import com.intellij.psi.search.PsiElementProcessor.FindElement;
import com.intellij.psi.stubs.StubElement;
import com.intellij.psi.templateLanguages.OuterLanguageElement;
@@ -851,9 +850,12 @@ public class PsiTreeUtil {
@Contract(pure=true)
public static PsiElement @NotNull [] collectElements(@Nullable PsiElement element, @NotNull PsiElementFilter filter) {
CollectFilteredElements<PsiElement> processor = new CollectFilteredElements<>(filter);
processElements(element, processor);
return processor.toArray();
List<PsiElement> result = new ArrayList<>();
processElements(element, e -> {
if (filter.isAccepted(e)) result.add(e);
return true;
});
return result.toArray(PsiElement.EMPTY_ARRAY);
}
@SafeVarargs
@@ -7,10 +7,8 @@ import com.intellij.codeInspection.ProblemDescriptor;
import com.intellij.openapi.project.Project;
import com.intellij.psi.*;
import com.intellij.psi.codeStyle.JavaCodeStyleManager;
import com.intellij.psi.search.PsiElementProcessor.CollectFilteredElements;
import com.intellij.psi.search.searches.ReferencesSearch;
import com.intellij.psi.tree.IElementType;
import com.intellij.psi.util.PsiTreeUtil;
import com.intellij.refactoring.util.RefactoringUtil;
import com.siyeh.InspectionGadgetsBundle;
import com.siyeh.ig.InspectionGadgetsFix;
@@ -19,7 +17,9 @@ import com.siyeh.ig.psiutils.HighlightUtils;
import com.siyeh.ig.psiutils.ParenthesesUtils;
import org.jetbrains.annotations.NotNull;
import java.util.ArrayList;
import java.util.Collection;
import java.util.List;
public class ExtractParameterAsLocalVariableFix extends InspectionGadgetsFix {
@@ -77,29 +77,30 @@ public class ExtractParameterAsLocalVariableFix extends InspectionGadgetsFix {
PsiDeclarationStatement newStatement = (PsiDeclarationStatement)
JavaPsiFacade.getElementFactory(project).createStatementFromText(
type.getCanonicalText() + ' ' + variableName + '=' + initializerText + ';', body);
final CollectFilteredElements<PsiReferenceExpression> collector = new CollectFilteredElements<>(
e -> e instanceof PsiReferenceExpression && ((PsiReferenceExpression)e).resolve() == parameter);
final PsiCodeBlock codeBlock = (PsiCodeBlock)body;
List<PsiReferenceExpression> refs = new ArrayList<>();
PsiStatement anchor = null;
for (PsiStatement statement : codeBlock.getStatements()) {
if (anchor == null) {
if (rhs == null && !JavaHighlightUtil.isSuperOrThisCall(statement, true, true)) {
anchor = statement;
PsiTreeUtil.processElements(statement, PsiReferenceExpression.class, collector);
SyntaxTraverser.psiTraverser(statement).filter(PsiReferenceExpression.class)
.filter(ref -> ref.isReferenceTo(parameter)).addAllTo(refs);
}
else if (statement.getTextRange().contains(parameterReference.getTextRange())) {
anchor = statement;
}
}
else {
PsiTreeUtil.processElements(statement, PsiReferenceExpression.class, collector);
SyntaxTraverser.psiTraverser(statement).filter(PsiReferenceExpression.class)
.filter(ref -> ref.isReferenceTo(parameter)).addAllTo(refs);
}
}
assert anchor != null;
newStatement = (PsiDeclarationStatement)(rhs == null
? codeBlock.addBefore(newStatement, anchor)
: tracker.replaceAndRestoreComments(anchor, newStatement));
replaceReferences(collector.getCollection(), variableName, body);
replaceReferences(refs, variableName, body);
if (isOnTheFly()) {
final PsiLocalVariable variable = (PsiLocalVariable)newStatement.getDeclaredElements()[0];
final PsiReference[] references = ReferencesSearch.search(variable, variable.getUseScope()).toArray(PsiReference.EMPTY_ARRAY);
@@ -21,7 +21,6 @@ import com.intellij.psi.*;
import com.intellij.psi.javadoc.PsiDocComment;
import com.intellij.psi.javadoc.PsiDocTag;
import com.intellij.psi.search.GlobalSearchScope;
import com.intellij.psi.search.PsiElementProcessor;
import com.intellij.psi.search.searches.AllClassesSearch;
import com.intellij.psi.util.*;
import com.intellij.util.PathUtil;
@@ -380,17 +379,11 @@ public class TestNGUtil {
}
public static PsiAnnotation[] getTestNGAnnotations(PsiElement element) {
PsiElementProcessor.CollectFilteredElements<PsiAnnotation> processor = new PsiElementProcessor.CollectFilteredElements<>(e -> {
if (e instanceof PsiAnnotation) {
String name = ((PsiAnnotation)e).getQualifiedName();
if (name != null && name.startsWith("org.testng.annotations")) {
return true;
}
}
return false;
});
PsiTreeUtil.processElements(element, PsiAnnotation.class, processor);
return processor.toArray(PsiAnnotation.EMPTY_ARRAY);
return SyntaxTraverser.psiTraverser(element).filter(PsiAnnotation.class)
.filter(anno -> {
String name = anno.getQualifiedName();
return name != null && name.startsWith("org.testng.annotations");
}).toArray(PsiAnnotation.EMPTY_ARRAY);
}
public static boolean isTestNGClass(PsiClass psiClass) {