SSR: allow expression constraints on complete match

This commit is contained in:
Bas Leijdekkers
2016-03-26 15:38:01 +01:00
parent 1e2ba40257
commit 9f4d5f85ae
4 changed files with 15 additions and 11 deletions
@@ -34,6 +34,7 @@ class JavaPredefinedConfigurations {
createSearchTemplateInfo(SSRBundle.message("predefined.configuration.all.expressions.of.some.type"),"'_Expression:[exprtype( SomeType )]",EXPRESSION_TYPE),
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::'methodName", EXPRESSION_TYPE),
createSearchTemplateInfo(SSRBundle.message("predefined.configuration.string.concatenations"), "[exprtype( java\\.lang\\.String )]'_a + '_b+", EXPRESSION_TYPE),
// Operators
createSearchTemplateInfo(SSRBundle.message("predefined.configuration.block.dcls"),"{\n '_Type+ 'Var+ = '_Init*;\n '_BlockStatements*;\n}",OPERATOR_TYPE),
@@ -429,14 +429,7 @@ public class PatternCompiler {
addPredicate(handler,predicate);
}
Set<MatchPredicate> predicates = new LinkedHashSet<MatchPredicate>();
for (MatchPredicateProvider matchPredicateProvider : Extensions.getExtensions(MatchPredicateProvider.EP_NAME)) {
matchPredicateProvider.collectPredicates(constraint, name, options, predicates);
}
for (MatchPredicate matchPredicate : predicates) {
addPredicate(handler, matchPredicate);
}
addExtensionPredicates(options, constraint, handler);
addScriptConstraint(project, name, constraint, handler);
if (!StringUtil.isEmptyOrSpaces(constraint.getContainsConstraint())) {
@@ -474,6 +467,7 @@ public class PatternCompiler {
addPredicate(handler,predicate);
}
addExtensionPredicates(options, constraint, handler);
addScriptConstraint(project, Configuration.CONTEXT_VAR_NAME, constraint, handler);
}
@@ -505,6 +499,16 @@ public class PatternCompiler {
return elements;
}
private static void addExtensionPredicates(MatchOptions options, MatchVariableConstraint constraint, SubstitutionHandler handler) {
Set<MatchPredicate> predicates = new LinkedHashSet<MatchPredicate>();
for (MatchPredicateProvider matchPredicateProvider : Extensions.getExtensions(MatchPredicateProvider.EP_NAME)) {
matchPredicateProvider.collectPredicates(constraint, handler.getName(), options, predicates);
}
for (MatchPredicate matchPredicate : predicates) {
addPredicate(handler, matchPredicate);
}
}
private static void addScriptConstraint(Project project, String name, MatchVariableConstraint constraint, SubstitutionHandler handler) {
if (constraint.getScriptCodeConstraint()!= null && constraint.getScriptCodeConstraint().length() > 2) {
final String script = StringUtil.stripQuotesAroundValue(constraint.getScriptCodeConstraint());
@@ -515,12 +519,11 @@ public class PatternCompiler {
}
}
static void addPredicate(SubstitutionHandler handler, MatchPredicate predicate) {
private static void addPredicate(SubstitutionHandler handler, MatchPredicate predicate) {
if (handler.getPredicate()==null) {
handler.setPredicate(predicate);
} else {
handler.setPredicate(new BinaryPredicate(handler.getPredicate(), predicate, false));
}
}
}
@@ -466,7 +466,6 @@ class EditVarConstraintsDialog extends DialogWrapper {
final boolean contextVar = Configuration.CONTEXT_VAR_NAME.equals(var.getName());
containedInConstraints.setVisible(contextVar);
textConstraintsPanel.setVisible(!contextVar);
expressionConstraints.setVisible(!contextVar);
partOfSearchResults.setEnabled(!contextVar);
occurencePanel.setVisible(!contextVar);
}
@@ -150,6 +150,7 @@ predefined.configuration.classes=classes
predefined.configuration.new.expressions=new expressions
predefined.configuration.lambdas=lambdas
predefined.configuration.method.references=method references
predefined.configuration.string.concatenations=string concatenations
# edit variable constraint dialog options
invalid.regular.expression.title=Invalid Regular Expression