From 3fed0b4eb8e4f05f13a0d4f47382d15f4bd646ef Mon Sep 17 00:00:00 2001 From: peter Date: Wed, 25 May 2011 16:12:50 +0200 Subject: [PATCH] currentType pointcut --- .../plugins/groovy/dsl/DslPointcut.java | 42 +++++++++++++++++++ .../groovy/dsl/GroovyDslExecutor.groovy | 10 ++++- .../groovy/dsl/PointcutContextFilter.java | 20 +++++++++ .../plugins/groovy/dsl/DsldTest.groovy | 14 ++++++- 4 files changed, 83 insertions(+), 3 deletions(-) create mode 100644 plugins/groovy/src/org/jetbrains/plugins/groovy/dsl/DslPointcut.java create mode 100644 plugins/groovy/src/org/jetbrains/plugins/groovy/dsl/PointcutContextFilter.java diff --git a/plugins/groovy/src/org/jetbrains/plugins/groovy/dsl/DslPointcut.java b/plugins/groovy/src/org/jetbrains/plugins/groovy/dsl/DslPointcut.java new file mode 100644 index 000000000000..d2d24cb4d4a9 --- /dev/null +++ b/plugins/groovy/src/org/jetbrains/plugins/groovy/dsl/DslPointcut.java @@ -0,0 +1,42 @@ +package org.jetbrains.plugins.groovy.dsl; + +import com.intellij.util.ProcessingContext; +import org.jetbrains.plugins.groovy.dsl.toplevel.ClassContextFilter; + +/** + * @author peter + */ +public abstract class DslPointcut { + + abstract boolean matches(T t, ProcessingContext context); + + abstract boolean operatesOn(Class c); + + public static DslPointcut currentType(final Object arg) { + return new DslPointcut() { + @Override + boolean matches(GroovyClassDescriptor groovyClassDescriptor, ProcessingContext context) { + return ClassContextFilter.subtypeOf((String)arg).isApplicable(groovyClassDescriptor, context); + } + + @Override + boolean operatesOn(Class c) { + return GroovyClassDescriptor.class == c; + } + }; + } + + public static DslPointcut unknownPointcut() { + return new DslPointcut() { + @Override + boolean matches(T t, ProcessingContext context) { + return true; + } + + @Override + boolean operatesOn(Class c) { + return true; + } + }; + } +} diff --git a/plugins/groovy/src/org/jetbrains/plugins/groovy/dsl/GroovyDslExecutor.groovy b/plugins/groovy/src/org/jetbrains/plugins/groovy/dsl/GroovyDslExecutor.groovy index 2a1a9bafcb63..baba68c897fc 100644 --- a/plugins/groovy/src/org/jetbrains/plugins/groovy/dsl/GroovyDslExecutor.groovy +++ b/plugins/groovy/src/org/jetbrains/plugins/groovy/dsl/GroovyDslExecutor.groovy @@ -39,7 +39,7 @@ public class GroovyDslExecutor { def enhancer = new GdslMetaClassProperties(this) mc.methodMissing = { String name, Object args -> - return new Context([:]) + return DslPointcut.unknownPointcut() } // Fill script with necessary properties @@ -52,6 +52,12 @@ public class GroovyDslExecutor { def contribute = {cts, Closure toDo -> + if (cts instanceof DslPointcut) { + assert cts.operatesOn(GroovyClassDescriptor) : "A non top-level pointcut passed to contributor" + addClassEnhancer([new PointcutContextFilter(cts)], toDo) + return + } + if (cts instanceof Map) { cts = new Context(cts) } @@ -72,6 +78,8 @@ public class GroovyDslExecutor { StringUtil.compareVersionNumbers(ideaVersion, ver) >= 0 } + mc.currentType = { arg -> DslPointcut.currentType(arg) } + mc.initialize() script.metaClass = mc script.run() diff --git a/plugins/groovy/src/org/jetbrains/plugins/groovy/dsl/PointcutContextFilter.java b/plugins/groovy/src/org/jetbrains/plugins/groovy/dsl/PointcutContextFilter.java new file mode 100644 index 000000000000..7afccd92de0c --- /dev/null +++ b/plugins/groovy/src/org/jetbrains/plugins/groovy/dsl/PointcutContextFilter.java @@ -0,0 +1,20 @@ +package org.jetbrains.plugins.groovy.dsl; + +import com.intellij.util.ProcessingContext; +import org.jetbrains.plugins.groovy.dsl.toplevel.ContextFilter; + +/** + * @author peter + */ +public class PointcutContextFilter implements ContextFilter { + private final DslPointcut myPointcut; + + public PointcutContextFilter(DslPointcut pointcut) { + myPointcut = pointcut; + } + + @Override + public boolean isApplicable(GroovyClassDescriptor descriptor, ProcessingContext ctx) { + return myPointcut.matches(descriptor, ctx); + } +} 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 0e651b1d4101..7a9d23f76b79 100644 --- a/plugins/groovy/test/org/jetbrains/plugins/groovy/dsl/DsldTest.groovy +++ b/plugins/groovy/test/org/jetbrains/plugins/groovy/dsl/DsldTest.groovy @@ -13,10 +13,20 @@ class DsldTest extends LightGroovyTestCase { } public void testUnknownPointcut() { - def file = myFixture.addFileToProject('a.gdsl', "contribute(asdfsadf()) { property name:'foo', type:'String' }") + checkHighlighting "contribute(asdfsadf()) { property name:'foo', type:'String' }", + 'println foo.substring(2) + bar' + } + + public void testCurrentType() { + checkHighlighting 'contribute(currentType("java.lang.String")) { property name:"foo" }', + 'println "".foo + [].foo' + } + + private def checkHighlighting(String dsl, String code) { + def file = myFixture.addFileToProject('a.gdsl', dsl) GroovyDslFileIndex.activateUntilModification(file.virtualFile) - checkHighlighting('println foo.substring(2) + bar') + checkHighlighting(code) } private def checkHighlighting(String text) {