From d2b9a05a4db922dfefcd9c1b04593758cdc02ad1 Mon Sep 17 00:00:00 2001 From: PascalSchumacher Date: Sun, 20 Dec 2015 13:47:22 +0100 Subject: [PATCH] GROOVY-7074: DelegatingScript does not work with Builder as delegate Patch supplied by Jochen Kemnade --- src/main/groovy/util/DelegatingScript.java | 6 +++++- .../groovy/util/DelegatingScriptTest.groovy | 18 ++++++++++++++++++ 2 files changed, 23 insertions(+), 1 deletion(-) diff --git a/src/main/groovy/util/DelegatingScript.java b/src/main/groovy/util/DelegatingScript.java index 18594cd472a..959c8e8887a 100644 --- a/src/main/groovy/util/DelegatingScript.java +++ b/src/main/groovy/util/DelegatingScript.java @@ -19,6 +19,7 @@ package groovy.util; import groovy.lang.Binding; +import groovy.lang.GroovyObject; import groovy.lang.MetaClass; import groovy.lang.MissingMethodException; import groovy.lang.MissingPropertyException; @@ -107,7 +108,10 @@ public void setDelegate(Object delegate) { @Override public Object invokeMethod(String name, Object args) { try { - return metaClass.invokeMethod(delegate,name,args); + if (delegate instanceof GroovyObject) { + return ((GroovyObject) delegate).invokeMethod(name, args); + } + return metaClass.invokeMethod(delegate, name, args); } catch (MissingMethodException mme) { return super.invokeMethod(name, args); } diff --git a/src/test/groovy/util/DelegatingScriptTest.groovy b/src/test/groovy/util/DelegatingScriptTest.groovy index b4ec9771f63..162ff3cd6f7 100644 --- a/src/test/groovy/util/DelegatingScriptTest.groovy +++ b/src/test/groovy/util/DelegatingScriptTest.groovy @@ -19,6 +19,8 @@ package groovy.util import org.codehaus.groovy.control.CompilerConfiguration +import groovy.xml.MarkupBuilder +import java.io.StringWriter public class DelegatingScriptTest extends GroovyTestCase { public void testDelegatingScript() throws Exception { @@ -37,6 +39,22 @@ public class DelegatingScriptTest extends GroovyTestCase { assert dsl.foo==6; assert dsl.innerBar()=='testset'; } + + public void testUseMarkupBuilderAsDelegate() throws Exception { + def cc = new CompilerConfiguration() + cc.scriptBaseClass = DelegatingScript.class.name + def sh = new GroovyShell(new Binding(), cc) + def script = sh.parse(''' foo{ bar() } + ''') + StringWriter sw = new StringWriter() + def markupBuilder = new MarkupBuilder(sw) + script.setDelegate(markupBuilder) + script.run() + + assert sw.toString() == """ + +""" + } } class MyDSL {