From 756ea5bcc6afc8f1cdb5dc57cf58538fb771c33f Mon Sep 17 00:00:00 2001 From: Bas Leijdekkers Date: Wed, 31 May 2017 13:58:23 +0200 Subject: [PATCH] SSR: split off matching handler hierarchy from predicates --- .../matcher/JavaMatchPredicateProvider.java | 3 +- .../impl/matcher/JavaMatchingVisitor.java | 2 +- .../matcher/predicates/ExprTypePredicate.java | 3 +- .../predicates/FormalArgTypePredicate.java | 16 ++++++++ .../source/META-INF/structuralsearch.xml | 2 +- .../matcher/compiler/PatternCompiler.java | 2 - .../impl/matcher/handlers/MatchPredicate.java | 27 ------------- .../matcher/handlers/MatchingHandler.java | 8 ++-- .../matcher/handlers/SubstitutionHandler.java | 1 + .../AbstractStringBasedPredicate.java | 17 +++++++- .../matcher/predicates/BinaryPredicate.java | 4 -- .../matcher/predicates/MatchPredicate.java | 39 +++++++++++++++++++ .../MatchPredicateProvider.java | 18 ++++++++- .../impl/matcher/predicates/NotPredicate.java | 1 - .../predicates/ReferencePredicate.java | 1 - .../matcher/predicates/RegExpPredicate.java | 1 - .../matcher/predicates/WithinPredicate.java | 1 - 17 files changed, 96 insertions(+), 50 deletions(-) delete mode 100644 platform/structuralsearch/source/com/intellij/structuralsearch/impl/matcher/handlers/MatchPredicate.java create mode 100644 platform/structuralsearch/source/com/intellij/structuralsearch/impl/matcher/predicates/MatchPredicate.java rename platform/structuralsearch/source/com/intellij/structuralsearch/impl/matcher/{ => predicates}/MatchPredicateProvider.java (50%) diff --git a/java/structuralsearch-java/src/com/intellij/structuralsearch/impl/matcher/JavaMatchPredicateProvider.java b/java/structuralsearch-java/src/com/intellij/structuralsearch/impl/matcher/JavaMatchPredicateProvider.java index 075915b04b37..23402ae5b066 100644 --- a/java/structuralsearch-java/src/com/intellij/structuralsearch/impl/matcher/JavaMatchPredicateProvider.java +++ b/java/structuralsearch-java/src/com/intellij/structuralsearch/impl/matcher/JavaMatchPredicateProvider.java @@ -18,12 +18,11 @@ package com.intellij.structuralsearch.impl.matcher; import com.intellij.openapi.util.text.StringUtil; import com.intellij.structuralsearch.MatchOptions; import com.intellij.structuralsearch.MatchVariableConstraint; -import com.intellij.structuralsearch.impl.matcher.handlers.MatchPredicate; import com.intellij.structuralsearch.impl.matcher.predicates.*; import java.util.Set; -public class JavaMatchPredicateProvider extends MatchPredicateProvider{ +public class JavaMatchPredicateProvider extends MatchPredicateProvider { @Override public void collectPredicates(MatchVariableConstraint constraint, String name, MatchOptions options, Set predicates) { if (!StringUtil.isEmptyOrSpaces(constraint.getNameOfExprType())) { diff --git a/java/structuralsearch-java/src/com/intellij/structuralsearch/impl/matcher/JavaMatchingVisitor.java b/java/structuralsearch-java/src/com/intellij/structuralsearch/impl/matcher/JavaMatchingVisitor.java index cd97576b3c0a..d9fb8cfdb450 100644 --- a/java/structuralsearch-java/src/com/intellij/structuralsearch/impl/matcher/JavaMatchingVisitor.java +++ b/java/structuralsearch-java/src/com/intellij/structuralsearch/impl/matcher/JavaMatchingVisitor.java @@ -25,11 +25,11 @@ import com.intellij.psi.util.PsiTreeUtil; import com.intellij.psi.util.PsiUtil; import com.intellij.structuralsearch.MatchOptions; import com.intellij.structuralsearch.MatchResult; -import com.intellij.structuralsearch.impl.matcher.handlers.MatchPredicate; import com.intellij.structuralsearch.impl.matcher.handlers.MatchingHandler; import com.intellij.structuralsearch.impl.matcher.handlers.SubstitutionHandler; import com.intellij.structuralsearch.impl.matcher.iterators.DocValuesIterator; import com.intellij.structuralsearch.impl.matcher.iterators.HierarchyNodeIterator; +import com.intellij.structuralsearch.impl.matcher.predicates.MatchPredicate; import com.intellij.structuralsearch.impl.matcher.predicates.NotPredicate; import com.intellij.structuralsearch.impl.matcher.predicates.RegExpPredicate; import com.intellij.util.SmartList; diff --git a/java/structuralsearch-java/src/com/intellij/structuralsearch/impl/matcher/predicates/ExprTypePredicate.java b/java/structuralsearch-java/src/com/intellij/structuralsearch/impl/matcher/predicates/ExprTypePredicate.java index d51365d60e01..38b172476ddb 100644 --- a/java/structuralsearch-java/src/com/intellij/structuralsearch/impl/matcher/predicates/ExprTypePredicate.java +++ b/java/structuralsearch-java/src/com/intellij/structuralsearch/impl/matcher/predicates/ExprTypePredicate.java @@ -15,11 +15,10 @@ */ package com.intellij.structuralsearch.impl.matcher.predicates; +import com.intellij.dupLocator.iterators.NodeIterator; import com.intellij.psi.*; import com.intellij.structuralsearch.impl.matcher.MatchContext; -import com.intellij.structuralsearch.impl.matcher.handlers.MatchPredicate; import com.intellij.structuralsearch.impl.matcher.iterators.HierarchyNodeIterator; -import com.intellij.dupLocator.iterators.NodeIterator; /** * @author Maxim.Mossienko diff --git a/java/structuralsearch-java/src/com/intellij/structuralsearch/impl/matcher/predicates/FormalArgTypePredicate.java b/java/structuralsearch-java/src/com/intellij/structuralsearch/impl/matcher/predicates/FormalArgTypePredicate.java index 0e695f642794..b418100d4016 100644 --- a/java/structuralsearch-java/src/com/intellij/structuralsearch/impl/matcher/predicates/FormalArgTypePredicate.java +++ b/java/structuralsearch-java/src/com/intellij/structuralsearch/impl/matcher/predicates/FormalArgTypePredicate.java @@ -1,3 +1,18 @@ +/* + * Copyright 2000-2017 JetBrains s.r.o. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ package com.intellij.structuralsearch.impl.matcher.predicates; import com.intellij.psi.PsiExpression; @@ -11,6 +26,7 @@ public class FormalArgTypePredicate extends ExprTypePredicate { super(type, baseName, withinHierarchy, caseSensitiveMatch, target); } + @Override protected PsiType evalType(PsiExpression match, MatchContext context) { return ExpectedTypeUtils.findExpectedType(match, true, true); } diff --git a/platform/structuralsearch/source/META-INF/structuralsearch.xml b/platform/structuralsearch/source/META-INF/structuralsearch.xml index b045255c967f..ec4b2efeafc3 100644 --- a/platform/structuralsearch/source/META-INF/structuralsearch.xml +++ b/platform/structuralsearch/source/META-INF/structuralsearch.xml @@ -3,7 +3,7 @@ + interface="com.intellij.structuralsearch.impl.matcher.predicates.MatchPredicateProvider"/> diff --git a/platform/structuralsearch/source/com/intellij/structuralsearch/impl/matcher/compiler/PatternCompiler.java b/platform/structuralsearch/source/com/intellij/structuralsearch/impl/matcher/compiler/PatternCompiler.java index abc2e9000886..72a5792ac9ad 100644 --- a/platform/structuralsearch/source/com/intellij/structuralsearch/impl/matcher/compiler/PatternCompiler.java +++ b/platform/structuralsearch/source/com/intellij/structuralsearch/impl/matcher/compiler/PatternCompiler.java @@ -35,11 +35,9 @@ import com.intellij.psi.search.LocalSearchScope; import com.intellij.psi.util.PsiUtilCore; import com.intellij.structuralsearch.*; import com.intellij.structuralsearch.impl.matcher.CompiledPattern; -import com.intellij.structuralsearch.impl.matcher.MatchPredicateProvider; import com.intellij.structuralsearch.impl.matcher.MatcherImplUtil; import com.intellij.structuralsearch.impl.matcher.PatternTreeContext; import com.intellij.structuralsearch.impl.matcher.filters.LexicalNodesFilter; -import com.intellij.structuralsearch.impl.matcher.handlers.MatchPredicate; import com.intellij.structuralsearch.impl.matcher.handlers.MatchingHandler; import com.intellij.structuralsearch.impl.matcher.handlers.SubstitutionHandler; import com.intellij.structuralsearch.impl.matcher.predicates.*; diff --git a/platform/structuralsearch/source/com/intellij/structuralsearch/impl/matcher/handlers/MatchPredicate.java b/platform/structuralsearch/source/com/intellij/structuralsearch/impl/matcher/handlers/MatchPredicate.java deleted file mode 100644 index cba96681ab71..000000000000 --- a/platform/structuralsearch/source/com/intellij/structuralsearch/impl/matcher/handlers/MatchPredicate.java +++ /dev/null @@ -1,27 +0,0 @@ -package com.intellij.structuralsearch.impl.matcher.handlers; - -import com.intellij.psi.PsiElement; -import com.intellij.structuralsearch.impl.matcher.MatchContext; - -/** - * Root of handlers for pattern node matching. Handles simpliest type of the match. - */ -public abstract class MatchPredicate { - /** - * Matches given handler node against given value. - * @param matchedNode for matching - * @param context of the matching - * @return true if matching was successfull and false otherwise - */ - public boolean match(PsiElement patternNode,PsiElement matchedNode, int start, int end, MatchContext context) { - return match(patternNode,matchedNode,context); - } - - /** - * Matches given handler node against given value. - * @param matchedNode for matching - * @param context of the matching - * @return true if matching was successfull and false otherwise - */ - public abstract boolean match(PsiElement patternNode,PsiElement matchedNode, MatchContext context); -} diff --git a/platform/structuralsearch/source/com/intellij/structuralsearch/impl/matcher/handlers/MatchingHandler.java b/platform/structuralsearch/source/com/intellij/structuralsearch/impl/matcher/handlers/MatchingHandler.java index 9ec2c550d412..0a5c054ca29a 100644 --- a/platform/structuralsearch/source/com/intellij/structuralsearch/impl/matcher/handlers/MatchingHandler.java +++ b/platform/structuralsearch/source/com/intellij/structuralsearch/impl/matcher/handlers/MatchingHandler.java @@ -17,13 +17,15 @@ package com.intellij.structuralsearch.impl.matcher.handlers; import com.intellij.dupLocator.iterators.NodeIterator; import com.intellij.dupLocator.util.NodeFilter; -import com.intellij.psi.*; +import com.intellij.psi.PsiElement; +import com.intellij.psi.PsiRecursiveElementWalkingVisitor; import com.intellij.structuralsearch.StructuralSearchUtil; import com.intellij.structuralsearch.impl.matcher.CompiledPattern; import com.intellij.structuralsearch.impl.matcher.MatchContext; import com.intellij.structuralsearch.impl.matcher.MatchResultImpl; import com.intellij.structuralsearch.impl.matcher.filters.DefaultFilter; import com.intellij.structuralsearch.impl.matcher.predicates.BinaryPredicate; +import com.intellij.structuralsearch.impl.matcher.predicates.MatchPredicate; import com.intellij.structuralsearch.impl.matcher.predicates.NotPredicate; import com.intellij.structuralsearch.impl.matcher.predicates.RegExpPredicate; import com.intellij.structuralsearch.impl.matcher.strategies.MatchingStrategy; @@ -34,7 +36,7 @@ import java.util.Set; /** * Root of handlers for pattern node matching. Handles simplest type of the match. */ -public abstract class MatchingHandler extends MatchPredicate { +public abstract class MatchingHandler { protected NodeFilter filter; private PsiElement pinnedElement; @@ -48,7 +50,6 @@ public abstract class MatchingHandler extends MatchPredicate { * @param context of the matching * @return true if matching was successful and false otherwise */ - @Override public boolean match(PsiElement patternNode, PsiElement matchedNode, int start, int end, MatchContext context) { return match(patternNode,matchedNode,context); } @@ -59,7 +60,6 @@ public abstract class MatchingHandler extends MatchPredicate { * @param context of the matching * @return true if matching was successful and false otherwise */ - @Override public boolean match(PsiElement patternNode, PsiElement matchedNode, MatchContext context) { if (patternNode == null) { return matchedNode == null; diff --git a/platform/structuralsearch/source/com/intellij/structuralsearch/impl/matcher/handlers/SubstitutionHandler.java b/platform/structuralsearch/source/com/intellij/structuralsearch/impl/matcher/handlers/SubstitutionHandler.java index 6bf7649fefa8..982a547b2b55 100644 --- a/platform/structuralsearch/source/com/intellij/structuralsearch/impl/matcher/handlers/SubstitutionHandler.java +++ b/platform/structuralsearch/source/com/intellij/structuralsearch/impl/matcher/handlers/SubstitutionHandler.java @@ -25,6 +25,7 @@ import com.intellij.structuralsearch.StructuralSearchUtil; import com.intellij.structuralsearch.impl.matcher.CompiledPattern; import com.intellij.structuralsearch.impl.matcher.MatchContext; import com.intellij.structuralsearch.impl.matcher.MatchResultImpl; +import com.intellij.structuralsearch.impl.matcher.predicates.MatchPredicate; import com.intellij.structuralsearch.plugin.ui.Configuration; import com.intellij.structuralsearch.plugin.util.SmartPsiPointer; diff --git a/platform/structuralsearch/source/com/intellij/structuralsearch/impl/matcher/predicates/AbstractStringBasedPredicate.java b/platform/structuralsearch/source/com/intellij/structuralsearch/impl/matcher/predicates/AbstractStringBasedPredicate.java index 916fc1e15639..538932314c0a 100644 --- a/platform/structuralsearch/source/com/intellij/structuralsearch/impl/matcher/predicates/AbstractStringBasedPredicate.java +++ b/platform/structuralsearch/source/com/intellij/structuralsearch/impl/matcher/predicates/AbstractStringBasedPredicate.java @@ -1,8 +1,22 @@ +/* + * Copyright 2000-2017 JetBrains s.r.o. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ package com.intellij.structuralsearch.impl.matcher.predicates; import com.intellij.psi.PsiElement; import com.intellij.structuralsearch.impl.matcher.MatchContext; -import com.intellij.structuralsearch.impl.matcher.handlers.MatchPredicate; /** * @author Maxim.Mossienko @@ -16,6 +30,7 @@ public class AbstractStringBasedPredicate extends MatchPredicate { myWithin = within; } + @Override public boolean match(PsiElement patternNode, PsiElement matchedNode, MatchContext context) { return match(patternNode, matchedNode, 0, -1, context); } diff --git a/platform/structuralsearch/source/com/intellij/structuralsearch/impl/matcher/predicates/BinaryPredicate.java b/platform/structuralsearch/source/com/intellij/structuralsearch/impl/matcher/predicates/BinaryPredicate.java index bded2a66bced..107cbbabb702 100644 --- a/platform/structuralsearch/source/com/intellij/structuralsearch/impl/matcher/predicates/BinaryPredicate.java +++ b/platform/structuralsearch/source/com/intellij/structuralsearch/impl/matcher/predicates/BinaryPredicate.java @@ -17,11 +17,7 @@ package com.intellij.structuralsearch.impl.matcher.predicates; import com.intellij.psi.PsiElement; import com.intellij.structuralsearch.impl.matcher.MatchContext; -import com.intellij.structuralsearch.impl.matcher.handlers.MatchPredicate; -/** - * Binary predicate - */ public final class BinaryPredicate extends MatchPredicate { private final MatchPredicate first; private final MatchPredicate second; diff --git a/platform/structuralsearch/source/com/intellij/structuralsearch/impl/matcher/predicates/MatchPredicate.java b/platform/structuralsearch/source/com/intellij/structuralsearch/impl/matcher/predicates/MatchPredicate.java new file mode 100644 index 000000000000..30af2e07fff4 --- /dev/null +++ b/platform/structuralsearch/source/com/intellij/structuralsearch/impl/matcher/predicates/MatchPredicate.java @@ -0,0 +1,39 @@ +/* + * Copyright 2000-2017 JetBrains s.r.o. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.intellij.structuralsearch.impl.matcher.predicates; + +import com.intellij.psi.PsiElement; +import com.intellij.structuralsearch.impl.matcher.MatchContext; + +public abstract class MatchPredicate { + /** + * Matches given node against this predicate. + * @param matchedNode for matching + * @param context of the matching + * @return true if matching was successful, false otherwise + */ + public boolean match(PsiElement patternNode,PsiElement matchedNode, int start, int end, MatchContext context) { + return match(patternNode,matchedNode,context); + } + + /** + * Matches given handler node against given value. + * @param matchedNode for matching + * @param context of the matching + * @return true if matching was successful, false otherwise + */ + public abstract boolean match(PsiElement patternNode, PsiElement matchedNode, MatchContext context); +} diff --git a/platform/structuralsearch/source/com/intellij/structuralsearch/impl/matcher/MatchPredicateProvider.java b/platform/structuralsearch/source/com/intellij/structuralsearch/impl/matcher/predicates/MatchPredicateProvider.java similarity index 50% rename from platform/structuralsearch/source/com/intellij/structuralsearch/impl/matcher/MatchPredicateProvider.java rename to platform/structuralsearch/source/com/intellij/structuralsearch/impl/matcher/predicates/MatchPredicateProvider.java index b75ffb5d0f5d..718e5675045e 100644 --- a/platform/structuralsearch/source/com/intellij/structuralsearch/impl/matcher/MatchPredicateProvider.java +++ b/platform/structuralsearch/source/com/intellij/structuralsearch/impl/matcher/predicates/MatchPredicateProvider.java @@ -1,9 +1,23 @@ -package com.intellij.structuralsearch.impl.matcher; +/* + * Copyright 2000-2017 JetBrains s.r.o. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.intellij.structuralsearch.impl.matcher.predicates; import com.intellij.openapi.extensions.ExtensionPointName; import com.intellij.structuralsearch.MatchOptions; import com.intellij.structuralsearch.MatchVariableConstraint; -import com.intellij.structuralsearch.impl.matcher.handlers.MatchPredicate; import java.util.Set; diff --git a/platform/structuralsearch/source/com/intellij/structuralsearch/impl/matcher/predicates/NotPredicate.java b/platform/structuralsearch/source/com/intellij/structuralsearch/impl/matcher/predicates/NotPredicate.java index 943eedaddddd..9928fd158e20 100644 --- a/platform/structuralsearch/source/com/intellij/structuralsearch/impl/matcher/predicates/NotPredicate.java +++ b/platform/structuralsearch/source/com/intellij/structuralsearch/impl/matcher/predicates/NotPredicate.java @@ -17,7 +17,6 @@ package com.intellij.structuralsearch.impl.matcher.predicates; import com.intellij.psi.PsiElement; import com.intellij.structuralsearch.impl.matcher.MatchContext; -import com.intellij.structuralsearch.impl.matcher.handlers.MatchPredicate; /** * Negates predicate diff --git a/platform/structuralsearch/source/com/intellij/structuralsearch/impl/matcher/predicates/ReferencePredicate.java b/platform/structuralsearch/source/com/intellij/structuralsearch/impl/matcher/predicates/ReferencePredicate.java index a1913ba3219c..92177ec5cec9 100644 --- a/platform/structuralsearch/source/com/intellij/structuralsearch/impl/matcher/predicates/ReferencePredicate.java +++ b/platform/structuralsearch/source/com/intellij/structuralsearch/impl/matcher/predicates/ReferencePredicate.java @@ -21,7 +21,6 @@ import com.intellij.structuralsearch.StructuralSearchUtil; import com.intellij.structuralsearch.impl.matcher.MatchContext; import com.intellij.structuralsearch.impl.matcher.MatchResultImpl; import com.intellij.structuralsearch.impl.matcher.MatchUtils; -import com.intellij.structuralsearch.impl.matcher.handlers.MatchPredicate; import com.intellij.structuralsearch.plugin.util.SmartPsiPointer; public final class ReferencePredicate extends MatchPredicate { diff --git a/platform/structuralsearch/source/com/intellij/structuralsearch/impl/matcher/predicates/RegExpPredicate.java b/platform/structuralsearch/source/com/intellij/structuralsearch/impl/matcher/predicates/RegExpPredicate.java index 7b8b9d36c853..a924357ec7b2 100644 --- a/platform/structuralsearch/source/com/intellij/structuralsearch/impl/matcher/predicates/RegExpPredicate.java +++ b/platform/structuralsearch/source/com/intellij/structuralsearch/impl/matcher/predicates/RegExpPredicate.java @@ -22,7 +22,6 @@ import com.intellij.structuralsearch.StructuralSearchProfile; import com.intellij.structuralsearch.StructuralSearchUtil; import com.intellij.structuralsearch.impl.matcher.MatchContext; import com.intellij.structuralsearch.impl.matcher.MatchResultImpl; -import com.intellij.structuralsearch.impl.matcher.handlers.MatchPredicate; import com.intellij.structuralsearch.plugin.util.SmartPsiPointer; import org.jetbrains.annotations.NonNls; diff --git a/platform/structuralsearch/source/com/intellij/structuralsearch/impl/matcher/predicates/WithinPredicate.java b/platform/structuralsearch/source/com/intellij/structuralsearch/impl/matcher/predicates/WithinPredicate.java index 7cf265abde05..f507d5f81461 100644 --- a/platform/structuralsearch/source/com/intellij/structuralsearch/impl/matcher/predicates/WithinPredicate.java +++ b/platform/structuralsearch/source/com/intellij/structuralsearch/impl/matcher/predicates/WithinPredicate.java @@ -25,7 +25,6 @@ import com.intellij.structuralsearch.MatchOptions; import com.intellij.structuralsearch.MatchResult; import com.intellij.structuralsearch.Matcher; import com.intellij.structuralsearch.impl.matcher.MatchContext; -import com.intellij.structuralsearch.impl.matcher.handlers.MatchPredicate; import com.intellij.structuralsearch.plugin.ui.Configuration; import com.intellij.structuralsearch.plugin.ui.ConfigurationManager;