From c968746d5db20e6fecb404109bcac15ba379173a Mon Sep 17 00:00:00 2001 From: Bas Leijdekkers Date: Sat, 14 Oct 2017 21:21:29 +0200 Subject: [PATCH] SSR: improve reference predicate and add some example templates for it --- .../JavaPredefinedConfigurations.java | 9 +++++++++ .../com/intellij/structuralsearch/Matcher.java | 2 +- .../matcher/predicates/ReferencePredicate.java | 16 ++++++++++------ .../source/messages/SSRBundle.properties | 2 +- 4 files changed, 21 insertions(+), 8 deletions(-) diff --git a/java/structuralsearch-java/src/com/intellij/structuralsearch/JavaPredefinedConfigurations.java b/java/structuralsearch-java/src/com/intellij/structuralsearch/JavaPredefinedConfigurations.java index 8b21f0d47de8..b183bad1b6a9 100644 --- a/java/structuralsearch-java/src/com/intellij/structuralsearch/JavaPredefinedConfigurations.java +++ b/java/structuralsearch-java/src/com/intellij/structuralsearch/JavaPredefinedConfigurations.java @@ -1,6 +1,7 @@ // Copyright 2000-2017 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license that can be found in the LICENSE file. package com.intellij.structuralsearch; +import com.intellij.openapi.fileTypes.StdFileTypes; import com.intellij.structuralsearch.plugin.ui.Configuration; import static com.intellij.structuralsearch.PredefinedConfigurationUtil.createSearchTemplateInfo; @@ -36,6 +37,7 @@ class JavaPredefinedConfigurations { createSearchTemplateInfo(SSRBundle.message("predefined.configuration.sample.method.invokation.with.constant.argument"),"Integer.parseInt('_a:[script( \"com.intellij.psi.util.PsiUtil.isConstantExpression(__context__)\" )])",EXPRESSION_TYPE), createSearchTemplateInfo(SSRBundle.message("predefined.configuration.method.references"), "'_Qualifier::'Method", EXPRESSION_TYPE), createSearchTemplateInfo(SSRBundle.message("predefined.configuration.string.concatenations"), "[exprtype( java\\.lang\\.String )]'_a + '_b+", EXPRESSION_TYPE), + createSearchTemplateInfo(SSRBundle.message("predefined.configuration.deprecated.method.calls"), "'_Instance?.'MethodCall:[ref( deprecated methods )]('_Parameter*)", EXPRESSION_TYPE), // Operators createSearchTemplateInfo(SSRBundle.message("predefined.configuration.block.dcls"),"{\n '_Type 'Var+ = '_Init?;\n '_BlockStatements*;\n}",OPERATOR_TYPE), @@ -52,6 +54,11 @@ class JavaPredefinedConfigurations { "'_ReturnType '_Method('_ParameterType '_Parameter*);", CLASS_TYPE ), + createSearchTemplateInfo( + SSRBundle.message("predefined.configuration.deprecated.methods"), + "@Deprecated\n'_ReturnType '_Method('_ParameterType '_Parameter*);", + CLASS_TYPE + ), createSearchTemplateInfo( SSRBundle.message("predefined.configuration.fields.of.the.class"), "class '_Class { \n '_FieldType 'Field+ = '_Init?;\n}", @@ -307,6 +314,8 @@ class JavaPredefinedConfigurations { //createSearchTemplateInfo("fields selected","'_?.'_:[ref('Field)] ", INTERESTING_TYPE), //createSearchTemplateInfo("symbols used","'_:[ref('Symbol)] ", INTERESTING_TYPE), //createSearchTemplateInfo("types used","'_:[ref('Type)] '_;", INTERESTING_TYPE), + + createSearchTemplateInfo("xml attribute references java class", "<'_tag 'attribute=\"'_value:[ref( classes, interfaces & enums )]\"/>", SSRBundle.message("xml_html.category"), StdFileTypes.XML), }; } } diff --git a/platform/structuralsearch/source/com/intellij/structuralsearch/Matcher.java b/platform/structuralsearch/source/com/intellij/structuralsearch/Matcher.java index ce33bcab37a3..413748177388 100644 --- a/platform/structuralsearch/source/com/intellij/structuralsearch/Matcher.java +++ b/platform/structuralsearch/source/com/intellij/structuralsearch/Matcher.java @@ -172,7 +172,7 @@ public class Matcher { } } - public boolean matchNode(PsiElement element) { + public boolean matchNode(@NotNull PsiElement element) { final CollectingMatchResultSink sink = new CollectingMatchResultSink(); final MatchOptions options = matchContext.getOptions(); final CompiledPattern compiledPattern = prepareMatching(sink, options); 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 1e171efcfff6..01372e57bca5 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 @@ -1,14 +1,21 @@ -// Copyright 2000-2017 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license that can be found in the LICENSE file.s +// Copyright 2000-2017 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license that can be found in the LICENSE file. package com.intellij.structuralsearch.impl.matcher.predicates; import com.intellij.openapi.fileTypes.FileType; import com.intellij.openapi.project.Project; import com.intellij.psi.PsiElement; import com.intellij.psi.PsiReference; +import com.intellij.psi.PsiReferenceService; import com.intellij.structuralsearch.Matcher; import com.intellij.structuralsearch.StructuralSearchUtil; import com.intellij.structuralsearch.impl.matcher.MatchContext; +import java.util.List; +import java.util.Objects; + +/** + * @author Bas Leijdekkers + */ public final class ReferencePredicate extends MatchPredicate { private final Matcher matcher; @@ -20,10 +27,7 @@ public final class ReferencePredicate extends MatchPredicate { @Override public boolean match(PsiElement matchedNode, int start, int end, MatchContext context) { matchedNode = StructuralSearchUtil.getParentIfIdentifier(matchedNode); - if (!(matchedNode instanceof PsiReference)) { - return false; - } - final PsiElement target = ((PsiReference)matchedNode).resolve(); - return target != null && matcher.matchNode(target); + final List references = PsiReferenceService.getService().getReferences(matchedNode, PsiReferenceService.Hints.NO_HINTS); + return references.stream().map(PsiReference::resolve).filter(Objects::nonNull).anyMatch(t -> matcher.matchNode(t)); } } diff --git a/platform/structuralsearch/source/messages/SSRBundle.properties b/platform/structuralsearch/source/messages/SSRBundle.properties index b682a65904cd..b97b07bbf2fa 100644 --- a/platform/structuralsearch/source/messages/SSRBundle.properties +++ b/platform/structuralsearch/source/messages/SSRBundle.properties @@ -146,7 +146,7 @@ predefined.configuration.all.fields.of.the.class=all fields of the class predefined.configuration.instance.fields.of.the.class=instance fields of the class predefined.configuration.packagelocal.fields.of.the.class=package-private fields of the class predefined.configuration.classes=classes -predefined.configuration.classes.interfaces.enums=classes, interfaces & enums +predefined.configuration.classes.interfaces.enums=classes, interfaces \\& enums predefined.configuration.new.expressions=new expressions predefined.configuration.lambdas=lambdas predefined.configuration.method.references=method references