diff --git a/plugins/groovy/src/org/jetbrains/plugins/groovy/lang/completion/MapArgumentCompletionProvider.java b/plugins/groovy/src/org/jetbrains/plugins/groovy/lang/completion/MapArgumentCompletionProvider.java index 8ffe398ca76e..59714e005247 100644 --- a/plugins/groovy/src/org/jetbrains/plugins/groovy/lang/completion/MapArgumentCompletionProvider.java +++ b/plugins/groovy/src/org/jetbrains/plugins/groovy/lang/completion/MapArgumentCompletionProvider.java @@ -36,12 +36,12 @@ import org.jetbrains.plugins.groovy.lang.psi.api.statements.arguments.GrNamedArg import org.jetbrains.plugins.groovy.lang.psi.api.statements.expressions.GrCall; import org.jetbrains.plugins.groovy.lang.psi.api.statements.expressions.GrReferenceExpression; import org.jetbrains.plugins.groovy.lang.psi.patterns.GroovyElementPattern; -import org.jetbrains.plugins.groovy.lang.psi.patterns.GroovyPatterns; import org.jetbrains.plugins.groovy.lang.psi.util.PsiUtil; import java.util.Map; import static com.intellij.patterns.PlatformPatterns.psiElement; +import static org.jetbrains.plugins.groovy.lang.psi.patterns.GroovyPatterns.namedArgument; /** * @author peter @@ -77,7 +77,7 @@ class MapArgumentCompletionProvider extends CompletionProvider inLabel = psiElement(GroovyTokenTypes.mIDENT).withParent(psiElement(GrArgumentLabel.class).withParent( - GroovyPatterns.methodNamedParameter(null))); + namedArgument().isParameterOfMethodCall(null))); contributor.extend(CompletionType.BASIC, inArgumentListOfCall, instance); contributor.extend(CompletionType.BASIC, inLabel, instance); diff --git a/plugins/groovy/src/org/jetbrains/plugins/groovy/lang/psi/patterns/GroovyNamedArgumentPattern.java b/plugins/groovy/src/org/jetbrains/plugins/groovy/lang/psi/patterns/GroovyNamedArgumentPattern.java new file mode 100644 index 000000000000..75b24e4fe7c5 --- /dev/null +++ b/plugins/groovy/src/org/jetbrains/plugins/groovy/lang/psi/patterns/GroovyNamedArgumentPattern.java @@ -0,0 +1,56 @@ +package org.jetbrains.plugins.groovy.lang.psi.patterns; + +import com.intellij.patterns.ElementPattern; +import com.intellij.patterns.PatternCondition; +import com.intellij.patterns.StringPattern; +import com.intellij.util.ProcessingContext; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; +import org.jetbrains.plugins.groovy.lang.psi.api.statements.arguments.GrNamedArgument; +import org.jetbrains.plugins.groovy.lang.psi.api.statements.expressions.GrCall; +import org.jetbrains.plugins.groovy.lang.psi.util.PsiUtil; + +/** + * @author Sergey Evdokimov + */ +public class GroovyNamedArgumentPattern extends GroovyElementPattern { + + public GroovyNamedArgumentPattern() { + super(GrNamedArgument.class); + } + + public GroovyNamedArgumentPattern withLabel(@NotNull final String label) { + return with(new PatternCondition("left") { + public boolean accepts(@NotNull GrNamedArgument namedArgument, final ProcessingContext context) { + return label.equals(namedArgument.getLabelName()); + } + }); + } + + public GroovyNamedArgumentPattern withLabel(@NotNull final StringPattern labelPattern) { + return with(new PatternCondition("left") { + public boolean accepts(@NotNull GrNamedArgument namedArgument, final ProcessingContext context) { + return labelPattern.getCondition().accepts(namedArgument.getLabelName(), context); + } + }); + } + + public GroovyNamedArgumentPattern withExpression(@NotNull final ElementPattern pattern) { + return with(new PatternCondition("left") { + public boolean accepts(@NotNull GrNamedArgument namedArgument, final ProcessingContext context) { + return pattern.getCondition().accepts(namedArgument.getExpression(), context); + } + }); + } + + public GroovyNamedArgumentPattern isParameterOfMethodCall(@Nullable final ElementPattern methodCall) { + return with(new PatternCondition("left") { + public boolean accepts(@NotNull GrNamedArgument namedArgument, final ProcessingContext context) { + GrCall call = PsiUtil.getMethodByNamedParameter(namedArgument); + + return call != null && (methodCall == null || methodCall.accepts(call, context)); + } + }); + } + +} 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 8304211f3abd..bdcf250a848b 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 @@ -92,7 +92,11 @@ public class GroovyPatterns extends PsiJavaPatterns { } public static GroovyElementPattern.Capture namedArgumentStringLiteral() { - return stringLiteral().withParent(psiElement(GrNamedArgument.class)); + return stringLiteral().withParent(namedArgument()); + } + + public static GroovyNamedArgumentPattern namedArgument() { + return new GroovyNamedArgumentPattern(); } public static GroovyElementPattern.Capture namedArgumentLabel(@Nullable final ElementPattern namePattern) { @@ -114,18 +118,6 @@ public class GroovyPatterns extends PsiJavaPatterns { }); } - public static GroovyElementPattern.Capture methodNamedParameter(@Nullable final ElementPattern methodCall) { - return new GroovyElementPattern.Capture(new InitialPatternCondition(GrNamedArgument.class) { - public boolean accepts(@Nullable final Object o, final ProcessingContext context) { - if (!(o instanceof GrNamedArgument)) return false; - - GrCall call = PsiUtil.getMethodByNamedParameter((GrNamedArgument)o); - - return call != null && (methodCall == null || methodCall.accepts(call, context)); - } - }); - } - public static GroovyMethodCallPattern methodCall(final ElementPattern names, final String className) { return new GroovyMethodCallPattern().withMethodName(names) .withMethod(psiMethod().with(new PatternCondition("psiMethodClassNameCondition") {