Support completion of spring-bean name in methods like "applicationContext.getBean()"

This commit is contained in:
Sergey Evdokimov
2010-09-28 20:47:56 +04:00
parent 831bd9b541
commit 1cc4adbf9d
2 changed files with 50 additions and 21 deletions
@@ -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<T extends GrExpression, Self extends GroovyExpressionPattern<T,Self>> extends GroovyElementPattern<T,Self> {
protected GroovyExpressionPattern(final Class<T> aClass) {
@@ -39,20 +36,6 @@ public class GroovyExpressionPattern<T extends GrExpression, Self extends Groovy
});
}
public GroovyMethodCallPattern methodCall(final ElementPattern<? extends PsiMethod> method) {
return new GroovyMethodCallPattern().and(this).with(new PatternCondition<GrCallExpression>("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<? extends GrExpression> expressionPattern) {
return with(new PatternCondition<T>("skipParentheses") {
@Override
@@ -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<? extends String> names, final String className) {
return new GroovyMethodCallPattern().with(new PatternCondition<GrCallExpression>("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<? extends PsiMethod> method) {
return new GroovyMethodCallPattern().with(new PatternCondition<GrCallExpression>("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<GroovyFile> groovyScript() {
return new PsiFilePattern.Capture<GroovyFile>(new InitialPatternCondition<GroovyFile>(GroovyFile.class) {
@Override