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 44d7dad25b24..2a1a9bafcb63 100644 --- a/plugins/groovy/src/org/jetbrains/plugins/groovy/dsl/GroovyDslExecutor.groovy +++ b/plugins/groovy/src/org/jetbrains/plugins/groovy/dsl/GroovyDslExecutor.groovy @@ -6,10 +6,11 @@ import com.intellij.openapi.util.text.StringUtil import com.intellij.util.ProcessingContext import org.jetbrains.plugins.groovy.dsl.psi.PsiEnhancerCategory import org.jetbrains.plugins.groovy.dsl.toplevel.CompositeContextFilter +import org.jetbrains.plugins.groovy.dsl.toplevel.Context import org.jetbrains.plugins.groovy.dsl.toplevel.ContextFilter import org.jetbrains.plugins.groovy.dsl.toplevel.GdslMetaClassProperties - /** +/** * @author ilyas */ @@ -37,6 +38,10 @@ public class GroovyDslExecutor { def mc = new ExpandoMetaClass(script.class, false) def enhancer = new GdslMetaClassProperties(this) + mc.methodMissing = { String name, Object args -> + return new Context([:]) + } + // Fill script with necessary properties def properties = enhancer.metaClass.properties for (MetaProperty p in properties) { @@ -45,6 +50,24 @@ public class GroovyDslExecutor { } } + + def contribute = {cts, Closure toDo -> + if (cts instanceof Map) { + cts = new Context(cts) + } + if (!(cts instanceof List)) { + assert cts instanceof Context: "The contributor() argument must be a context" + cts = [cts] + } + def contexts = cts.findAll { it != null } as List + if (contexts) { + def filters = contexts.collect { return it.filter } + addClassEnhancer(filters, toDo) + } + } + mc.contributor = contribute + mc.contribute = contribute + mc.supportsVersion = { String ver -> StringUtil.compareVersionNumbers(ideaVersion, ver) >= 0 } diff --git a/plugins/groovy/src/org/jetbrains/plugins/groovy/dsl/toplevel/GdslMetaClassProperties.groovy b/plugins/groovy/src/org/jetbrains/plugins/groovy/dsl/toplevel/GdslMetaClassProperties.groovy index 4f01083eaee6..e2149586f6a1 100644 --- a/plugins/groovy/src/org/jetbrains/plugins/groovy/dsl/toplevel/GdslMetaClassProperties.groovy +++ b/plugins/groovy/src/org/jetbrains/plugins/groovy/dsl/toplevel/GdslMetaClassProperties.groovy @@ -24,24 +24,6 @@ class GdslMetaClassProperties { */ Closure context = {Map args -> return new Context(args) } - /** - * Contributor definition - */ - Closure contributor = {cts, Closure toDo -> - if (cts instanceof Map) { - cts = new Context(cts) - } - if (!(cts instanceof List)) { - assert cts instanceof Context: "The contributor() argument must be a context" - cts = [cts] - } - def contexts = cts.findAll { it != null } as List - if (contexts) { - def filters = contexts.collect { return it.filter } - myExecutor.addClassEnhancer(filters, toDo) - } - } - /** * Auxiliary methods for context definition */ diff --git a/plugins/groovy/test/org/jetbrains/plugins/groovy/dsl/DsldTest.groovy b/plugins/groovy/test/org/jetbrains/plugins/groovy/dsl/DsldTest.groovy new file mode 100644 index 000000000000..0e651b1d4101 --- /dev/null +++ b/plugins/groovy/test/org/jetbrains/plugins/groovy/dsl/DsldTest.groovy @@ -0,0 +1,27 @@ +package org.jetbrains.plugins.groovy.dsl + +import org.jetbrains.plugins.groovy.LightGroovyTestCase +import org.jetbrains.plugins.groovy.codeInspection.untypedUnresolvedAccess.GroovyUnresolvedAccessInspection + +/** + * @author peter + */ +class DsldTest extends LightGroovyTestCase { + @Override + protected String getBasePath() { + return '' + } + + public void testUnknownPointcut() { + def file = myFixture.addFileToProject('a.gdsl', "contribute(asdfsadf()) { property name:'foo', type:'String' }") + GroovyDslFileIndex.activateUntilModification(file.virtualFile) + + checkHighlighting('println foo.substring(2) + bar') + } + + private def checkHighlighting(String text) { + myFixture.configureByText('a.groovy', text) + myFixture.enableInspections(new GroovyUnresolvedAccessInspection()) + myFixture.checkHighlighting(true, false, false) + } +}