From 022075be4b192ee54b45a725d1f373e4a56d94b6 Mon Sep 17 00:00:00 2001 From: Tagir Valeev Date: Sun, 22 Mar 2020 11:00:35 +0700 Subject: [PATCH] Avoid PsiElementFilter and CollectFilteredElements; deprecate CollectFilteredElements GitOrigin-RevId: 8ae4be6a3f4ce016d8a8b0d317d43da201a3d6d7 --- .../lang/regexp/psi/impl/RegExpBackrefImpl.java | 14 ++++++-------- .../psi/impl/RegExpNamedGroupRefImpl.java | 8 +++----- .../psi/search/PsiElementProcessor.java | 5 +++++ .../src/com/intellij/psi/util/PsiTreeUtil.java | 10 ++++++---- .../ExtractParameterAsLocalVariableFix.java | 15 ++++++++------- .../testng/util/TestNGUtil.java | 17 +++++------------ 6 files changed, 33 insertions(+), 36 deletions(-) diff --git a/RegExpSupport/src/org/intellij/lang/regexp/psi/impl/RegExpBackrefImpl.java b/RegExpSupport/src/org/intellij/lang/regexp/psi/impl/RegExpBackrefImpl.java index 81f455ad53a1..de464e337e26 100644 --- a/RegExpSupport/src/org/intellij/lang/regexp/psi/impl/RegExpBackrefImpl.java +++ b/RegExpSupport/src/org/intellij/lang/regexp/psi/impl/RegExpBackrefImpl.java @@ -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 processor = - new PsiElementProcessor.CollectFilteredElements<>( - element -> element instanceof RegExpGroup && ((RegExpGroup)element).isCapturing()); - PsiTreeUtil.processElements(getContainingFile(), processor); - SmartList elements = new SmartList<>(processor.getCollection()); - return index <= elements.size() ? (RegExpGroup)elements.get(elements.size() - index) : null; + List groups = SyntaxTraverser.psiTraverser(getContainingFile()).filter(RegExpGroup.class) + .filter(RegExpGroup::isCapturing).toList(); + return index <= groups.size() ? groups.get(groups.size() - index) : null; } @Override diff --git a/RegExpSupport/src/org/intellij/lang/regexp/psi/impl/RegExpNamedGroupRefImpl.java b/RegExpSupport/src/org/intellij/lang/regexp/psi/impl/RegExpNamedGroupRefImpl.java index b03ec5a5d84e..b6b91b8bb4d7 100644 --- a/RegExpSupport/src/org/intellij/lang/regexp/psi/impl/RegExpNamedGroupRefImpl.java +++ b/RegExpSupport/src/org/intellij/lang/regexp/psi/impl/RegExpNamedGroupRefImpl.java @@ -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 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 diff --git a/platform/core-api/src/com/intellij/psi/search/PsiElementProcessor.java b/platform/core-api/src/com/intellij/psi/search/PsiElementProcessor.java index bb87bedc9842..0b049657818d 100644 --- a/platform/core-api/src/com/intellij/psi/search/PsiElementProcessor.java +++ b/platform/core-api/src/com/intellij/psi/search/PsiElementProcessor.java @@ -69,6 +69,11 @@ public interface PsiElementProcessor { } } + /** + * @deprecated use {@link com.intellij.psi.SyntaxTraverser} API instead. E.g. + * {@code SyntaxTraverser.psiTraverser(root).filter(ElementType.class).filter(additionalFilter).toList()} + */ + @Deprecated class CollectFilteredElements extends CollectElements { private final PsiElementFilter myFilter; diff --git a/platform/core-api/src/com/intellij/psi/util/PsiTreeUtil.java b/platform/core-api/src/com/intellij/psi/util/PsiTreeUtil.java index 79d9b788cff5..afc4d49ecfdc 100644 --- a/platform/core-api/src/com/intellij/psi/util/PsiTreeUtil.java +++ b/platform/core-api/src/com/intellij/psi/util/PsiTreeUtil.java @@ -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 processor = new CollectFilteredElements<>(filter); - processElements(element, processor); - return processor.toArray(); + List result = new ArrayList<>(); + processElements(element, e -> { + if (filter.isAccepted(e)) result.add(e); + return true; + }); + return result.toArray(PsiElement.EMPTY_ARRAY); } @SafeVarargs diff --git a/plugins/InspectionGadgets/src/com/siyeh/ig/fixes/ExtractParameterAsLocalVariableFix.java b/plugins/InspectionGadgets/src/com/siyeh/ig/fixes/ExtractParameterAsLocalVariableFix.java index 38e89f6ddd2b..c1a01c87c282 100644 --- a/plugins/InspectionGadgets/src/com/siyeh/ig/fixes/ExtractParameterAsLocalVariableFix.java +++ b/plugins/InspectionGadgets/src/com/siyeh/ig/fixes/ExtractParameterAsLocalVariableFix.java @@ -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 collector = new CollectFilteredElements<>( - e -> e instanceof PsiReferenceExpression && ((PsiReferenceExpression)e).resolve() == parameter); final PsiCodeBlock codeBlock = (PsiCodeBlock)body; + List 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); diff --git a/plugins/testng/src/com/theoryinpractice/testng/util/TestNGUtil.java b/plugins/testng/src/com/theoryinpractice/testng/util/TestNGUtil.java index 5d4a5ddb1103..d2e644fcabf7 100644 --- a/plugins/testng/src/com/theoryinpractice/testng/util/TestNGUtil.java +++ b/plugins/testng/src/com/theoryinpractice/testng/util/TestNGUtil.java @@ -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 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) {