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 f4375d2004b5..b37141a3d296 100644 --- a/plugins/groovy/src/org/jetbrains/plugins/groovy/dsl/DslPointcut.java +++ b/plugins/groovy/src/org/jetbrains/plugins/groovy/dsl/DslPointcut.java @@ -11,6 +11,18 @@ import java.util.*; * @author peter */ public abstract class DslPointcut { + public static final DslPointcut UNKNOWN = new DslPointcut() { + + @Override + List matches(Object src, ProcessingContext context) { + return Collections.emptyList(); + } + + @Override + boolean operatesOn(Class c) { + return true; + } + }; public static Key> BOUND = Key.create("gdsl.bound"); @Nullable @@ -63,18 +75,4 @@ public abstract class DslPointcut { }; } - public static DslPointcut unknownPointcut() { - return new DslPointcut() { - - @Override - List matches(Object src, ProcessingContext context) { - return Collections.emptyList(); - } - - @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 202f653a934d..279b26c347e3 100644 --- a/plugins/groovy/src/org/jetbrains/plugins/groovy/dsl/GroovyDslExecutor.groovy +++ b/plugins/groovy/src/org/jetbrains/plugins/groovy/dsl/GroovyDslExecutor.groovy @@ -43,11 +43,11 @@ public class GroovyDslExecutor { def mc = new ExpandoMetaClass(script.class, false) - mc.methodMissing = { String name, Object args -> - return DslPointcut.unknownPointcut() - } + mc.methodMissing = { String name, Object args -> return DslPointcut.UNKNOWN } def contribute = {cts, Closure toDo -> + cts = handleImplicitBind(cts) + if (cts instanceof DslPointcut) { assert cts.operatesOn(GroovyClassDescriptor) : "A non top-level pointcut passed to contributor" addClassEnhancer([new PointcutContextFilter(cts)], toDo) @@ -70,7 +70,7 @@ public class GroovyDslExecutor { mc.contributor = contribute mc.contribute = contribute - mc.currentType = { arg -> DslPointcut.currentType(arg) } + mc.currentType = { arg -> DslPointcut.currentType(handleImplicitBind(arg)) } mc.bind = { arg -> DslPointcut.bind(arg) } oldStylePrimitives(mc) @@ -82,6 +82,13 @@ public class GroovyDslExecutor { locked = true } + private def handleImplicitBind(arg) { + if (arg instanceof Map && arg.size() == 1 && arg.keySet().iterator().next() instanceof String && arg.values().iterator().next() instanceof DslPointcut) { + return DslPointcut.bind(arg) + } + return arg + } + private void oldStylePrimitives(MetaClass mc) { mc.supportsVersion = { String ver -> StringUtil.compareVersionNumbers(ideaVersion, ver) >= 0 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 1f5e8b1bb859..91c1ff178a7f 100644 --- a/plugins/groovy/test/org/jetbrains/plugins/groovy/dsl/DsldTest.groovy +++ b/plugins/groovy/test/org/jetbrains/plugins/groovy/dsl/DsldTest.groovy @@ -27,6 +27,11 @@ class DsldTest extends LightGroovyTestCase { 'println "".ing + "".foo' } + public void testImplicitBind() { + checkHighlighting 'contribute(types:currentType("java.lang.CharSequence")) { property name:types[0].name[-3..-1] }', + 'println "".ing + "".foo' + } + private def checkHighlighting(String dsl, String code) { def file = myFixture.addFileToProject('a.gdsl', dsl) GroovyDslFileIndex.activateUntilModification(file.virtualFile)