diff --git a/plugins/groovy/src/org/jetbrains/plugins/groovy/lang/psi/patterns/GroovyExpressionPattern.java b/plugins/groovy/src/org/jetbrains/plugins/groovy/lang/psi/patterns/GroovyExpressionPattern.java index f2e50cb1d9a1..dd854b7cacb4 100644 --- a/plugins/groovy/src/org/jetbrains/plugins/groovy/lang/psi/patterns/GroovyExpressionPattern.java +++ b/plugins/groovy/src/org/jetbrains/plugins/groovy/lang/psi/patterns/GroovyExpressionPattern.java @@ -18,13 +18,10 @@ package org.jetbrains.plugins.groovy.lang.psi.patterns; import com.intellij.patterns.ElementPattern; import com.intellij.patterns.PatternCondition; -import com.intellij.psi.PsiMethod; import com.intellij.util.ProcessingContext; import org.jetbrains.annotations.NotNull; -import org.jetbrains.plugins.groovy.lang.psi.api.GroovyResolveResult; import org.jetbrains.plugins.groovy.lang.psi.api.statements.expressions.GrExpression; import org.jetbrains.plugins.groovy.lang.psi.api.statements.expressions.GrParenthesizedExpression; -import org.jetbrains.plugins.groovy.lang.psi.api.statements.expressions.path.GrCallExpression; public class GroovyExpressionPattern> extends GroovyElementPattern { protected GroovyExpressionPattern(final Class aClass) { @@ -39,20 +36,6 @@ public class GroovyExpressionPattern method) { - return new GroovyMethodCallPattern().and(this).with(new PatternCondition("methodCall") { - public boolean accepts(@NotNull GrCallExpression callExpression, ProcessingContext context) { - final GroovyResolveResult[] results = callExpression.getCallVariants(null); - for (GroovyResolveResult result : results) { - if (method.getCondition().accepts(result.getElement(), context)) { - return true; - } - } - return false; - } - }); - } - public Self skipParentheses(final ElementPattern expressionPattern) { return with(new PatternCondition("skipParentheses") { @Override diff --git a/plugins/groovy/src/org/jetbrains/plugins/groovy/lang/psi/patterns/GroovyPatterns.java b/plugins/groovy/src/org/jetbrains/plugins/groovy/lang/psi/patterns/GroovyPatterns.java index 6177c867701b..faa3dab52052 100644 --- a/plugins/groovy/src/org/jetbrains/plugins/groovy/lang/psi/patterns/GroovyPatterns.java +++ b/plugins/groovy/src/org/jetbrains/plugins/groovy/lang/psi/patterns/GroovyPatterns.java @@ -15,16 +15,23 @@ */ package org.jetbrains.plugins.groovy.lang.psi.patterns; -import com.intellij.patterns.ElementPattern; -import com.intellij.patterns.InitialPatternCondition; -import com.intellij.patterns.PsiFilePattern; -import com.intellij.patterns.PsiJavaPatterns; +import com.intellij.patterns.*; +import com.intellij.psi.PsiClass; +import com.intellij.psi.PsiElement; +import com.intellij.psi.PsiMethod; +import com.intellij.psi.util.InheritanceUtil; import com.intellij.util.ProcessingContext; +import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import org.jetbrains.plugins.groovy.lang.psi.GroovyFile; import org.jetbrains.plugins.groovy.lang.psi.GroovyFileBase; import org.jetbrains.plugins.groovy.lang.psi.GroovyPsiElement; +import org.jetbrains.plugins.groovy.lang.psi.api.GroovyResolveResult; +import org.jetbrains.plugins.groovy.lang.psi.api.statements.expressions.GrExpression; +import org.jetbrains.plugins.groovy.lang.psi.api.statements.expressions.GrMethodCall; +import org.jetbrains.plugins.groovy.lang.psi.api.statements.expressions.GrReferenceExpression; import org.jetbrains.plugins.groovy.lang.psi.api.statements.expressions.literals.GrLiteral; +import org.jetbrains.plugins.groovy.lang.psi.api.statements.expressions.path.GrCallExpression; public class GroovyPatterns extends PsiJavaPatterns { @@ -49,6 +56,45 @@ public class GroovyPatterns extends PsiJavaPatterns { }); } + public static GroovyMethodCallPattern methodCall(final ElementPattern names, final String className) { + return new GroovyMethodCallPattern().with(new PatternCondition("methodCall") { + public boolean accepts(@NotNull GrCallExpression callExpression, ProcessingContext context) { + if (!(callExpression instanceof GrMethodCall)) return false; + + GrExpression expression = ((GrMethodCall)callExpression).getInvokedExpression(); + if (!(expression instanceof GrReferenceExpression)) return false; + + GrReferenceExpression refExpression = (GrReferenceExpression)expression; + + if (!names.accepts(refExpression.getName(), context)) return false; + + PsiElement element = refExpression.resolve(); + + if (!(element instanceof PsiMethod)) return false; + + PsiClass containingClass = ((PsiMethod)element).getContainingClass(); + + if (containingClass == null) return false; + + return InheritanceUtil.isInheritor(containingClass, className); + } + }); + } + + public static GroovyMethodCallPattern methodCall(final ElementPattern method) { + return new GroovyMethodCallPattern().with(new PatternCondition("methodCall") { + public boolean accepts(@NotNull GrCallExpression callExpression, ProcessingContext context) { + final GroovyResolveResult[] results = callExpression.getCallVariants(null); + for (GroovyResolveResult result : results) { + if (method.getCondition().accepts(result.getElement(), context)) { + return true; + } + } + return false; + } + }); + } + public static PsiFilePattern.Capture groovyScript() { return new PsiFilePattern.Capture(new InitialPatternCondition(GroovyFile.class) { @Override