From f8df99e6770018d857a5c6edbc0a0b971f9dc08e Mon Sep 17 00:00:00 2001 From: peter Date: Wed, 25 May 2011 20:28:02 +0200 Subject: [PATCH] name pointcut for methods --- .../plugins/groovy/dsl/DslPointcut.java | 18 +++++++++++++++--- .../plugins/groovy/dsl/GdslMethod.java | 11 +++++++++++ .../plugins/groovy/dsl/DsldTest.groovy | 8 ++++++++ 3 files changed, 34 insertions(+), 3 deletions(-) diff --git a/plugins/groovy/src/org/jetbrains/plugins/groovy/dsl/DslPointcut.java b/plugins/groovy/src/org/jetbrains/plugins/groovy/dsl/DslPointcut.java index 7945593ab9f3..1f05fde3a435 100644 --- a/plugins/groovy/src/org/jetbrains/plugins/groovy/dsl/DslPointcut.java +++ b/plugins/groovy/src/org/jetbrains/plugins/groovy/dsl/DslPointcut.java @@ -113,18 +113,29 @@ public abstract class DslPointcut { if (src instanceof GdslType) { return arg.equals(((GdslType)src).getName()) ? Arrays.asList((String)arg) : null; } + if (src instanceof GdslMethod) { + return arg.equals(((GdslMethod)src).getName()) ? Arrays.asList((String)arg) : null; + } return Collections.emptyList(); } @Override boolean operatesOn(Class c) { - return c == GdslType.class; + return c == GdslType.class || c == GdslMethod.class; } }; } public static DslPointcut enclosingMethod(final Object arg) { + final DslPointcut inner; + if (arg instanceof String) { + inner = name(arg); + } else { + inner = (DslPointcut)arg; + assert inner.operatesOn(GdslMethod.class) : "The argument to enclosingMethod should be a pointcut working with types, e.g. name"; + } + return new DslPointcut() { @Override List matches(GroovyClassDescriptor src, ProcessingContext context) { @@ -135,8 +146,9 @@ public abstract class DslPointcut { if (method == null) { break; } - if (arg.equals(method.getName())) { - result.add(new GdslMethod()); + final GdslMethod wrapper = new GdslMethod(method); + if (inner.matches(wrapper, context) != null) { + result.add(wrapper); } place = method; } diff --git a/plugins/groovy/src/org/jetbrains/plugins/groovy/dsl/GdslMethod.java b/plugins/groovy/src/org/jetbrains/plugins/groovy/dsl/GdslMethod.java index 18aabfaf9219..a58caa795e7c 100644 --- a/plugins/groovy/src/org/jetbrains/plugins/groovy/dsl/GdslMethod.java +++ b/plugins/groovy/src/org/jetbrains/plugins/groovy/dsl/GdslMethod.java @@ -1,7 +1,18 @@ package org.jetbrains.plugins.groovy.dsl; +import com.intellij.psi.PsiMethod; + /** * @author peter */ public class GdslMethod { + public final PsiMethod psiMethod; + + public GdslMethod(PsiMethod psiMethod) { + this.psiMethod = psiMethod; + } + + public String getName() { + return psiMethod.getName(); + } } diff --git a/plugins/groovy/test/org/jetbrains/plugins/groovy/dsl/DsldTest.groovy b/plugins/groovy/test/org/jetbrains/plugins/groovy/dsl/DsldTest.groovy index 9e18328efd78..8d784d2c153f 100644 --- a/plugins/groovy/test/org/jetbrains/plugins/groovy/dsl/DsldTest.groovy +++ b/plugins/groovy/test/org/jetbrains/plugins/groovy/dsl/DsldTest.groovy @@ -70,6 +70,14 @@ class Foo { ''' } + public void testMethodName() { + checkHighlighting 'contribute(enclosingMethod(name("goo"))) { property name:"foo" }', + ''' +def goo() { println foo + "".foo } +def doo() { println foo } +''' + } + private def checkHighlighting(String dsl, String code) { def file = myFixture.addFileToProject('a.gdsl', dsl)