Mykola Golubyev created GROOVY-11056:
----------------------------------------

             Summary: modified behavior of variable resolution within Closure 
                 Key: GROOVY-11056
                 URL: https://issues.apache.org/jira/browse/GROOVY-11056
             Project: Groovy
          Issue Type: Bug
          Components: groovy-runtime
    Affects Versions: 3.0.16
            Reporter: Mykola Golubyev


Groovy stopped seeing statically imported instances when called within Closure 
within Closure. And instead it thinks it is some method call.

Below is the example to repro. At the moment it affects all our users written 
test scripts and we rolled back to 3.0.15 where behavior is still as expected.

Tried various closure resolution strategies to no result 
{code:java}
import static org.testingisdocumenting.webtau.persona.ReproPersonaList.Admin

class ClosureResolveRepro {
    static void main(String[] args) {
        def LocalAdmin = new ReproPersona("local-admin")

        wrapper {
            LocalAdmin { // <-- no issue here as it can correctly see LocalAdmin
            }
        }

        wrapper {
            Admin { // <--- issue is here, for some reason it doesn't see 
statically imported instance. It works as expected in 3.0.15
            }
        }
    }

    private static void wrapper(Closure code) { // this wrapper is required to 
reproduce 
        code.run()
    }
}
 {code}
{code:java}
person: local-adminException in thread "main" 
groovy.lang.MissingMethodException: No signature of method: 
org.testingisdocumenting.webtau.persona.ClosureResolveRepro$_main_closure2.Admin()
 is applicable for argument types: 
(org.testingisdocumenting.webtau.persona.ClosureResolveRepro$_main_closure2$_closure4)
 values: 
[org.testingisdocumenting.webtau.persona.ClosureResolveRepro$_main_closure2$_closure4@40f08448]Possible
 solutions: find(), dump(), find(), dump(), any(), any() at 
org.codehaus.groovy.runtime.metaclass.ClosureMetaClass.invokeMethod(ClosureMetaClass.java:380)
 at groovy.lang.MetaClassImpl.invokeMethod(MetaClassImpl.java:1035) at 
org.codehaus.groovy.runtime.callsite.PogoMetaClassSite.callCurrent(PogoMetaClassSite.java:73)
 at 
org.codehaus.groovy.runtime.callsite.CallSiteArray.defaultCallCurrent(CallSiteArray.java:51)
 at 
org.codehaus.groovy.runtime.callsite.AbstractCallSite.callCurrent(AbstractCallSite.java:171)
 at 
org.codehaus.groovy.runtime.callsite.AbstractCallSite.callCurrent(AbstractCallSite.java:185)
 at 
org.testingisdocumenting.webtau.persona.ClosureResolveRepro$_main_closure2.doCall(ClosureResolveRepro.groovy:31)
 at 
org.testingisdocumenting.webtau.persona.ClosureResolveRepro$_main_closure2.doCall(ClosureResolveRepro.groovy)
 at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at 
sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) 
at 
sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
 at java.lang.reflect.Method.invoke(Method.java:498) at 
org.codehaus.groovy.reflection.CachedMethod.invoke(CachedMethod.java:107) at 
groovy.lang.MetaMethod.doMethodInvoke(MetaMethod.java:323) at 
org.codehaus.groovy.runtime.metaclass.ClosureMetaClass.invokeMethod(ClosureMetaClass.java:274)
 at groovy.lang.MetaClassImpl.invokeMethod(MetaClassImpl.java:1035) at 
groovy.lang.Closure.call(Closure.java:412) at 
groovy.lang.Closure.call(Closure.java:406) at 
groovy.lang.Closure.run(Closure.java:493) at 
sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at 
sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) 
at 
sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
 at java.lang.reflect.Method.invoke(Method.java:498) at 
org.codehaus.groovy.reflection.CachedMethod.invoke(CachedMethod.java:107) at 
groovy.lang.MetaMethod.doMethodInvoke(MetaMethod.java:323) at 
org.codehaus.groovy.runtime.metaclass.ClosureMetaClass.invokeMethod(ClosureMetaClass.java:274)
 at groovy.lang.MetaClassImpl.invokeMethod(MetaClassImpl.java:1035) at 
org.codehaus.groovy.runtime.callsite.PogoMetaClassSite.call(PogoMetaClassSite.java:38)
 at 
org.codehaus.groovy.runtime.callsite.CallSiteArray.defaultCall(CallSiteArray.java:47)
 at 
org.codehaus.groovy.runtime.callsite.PogoMetaClassSite.call(PogoMetaClassSite.java:53)
 at 
org.codehaus.groovy.runtime.callsite.AbstractCallSite.call(AbstractCallSite.java:130)
 at 
org.testingisdocumenting.webtau.persona.ClosureResolveRepro.wrapper(ClosureResolveRepro.groovy:37)
 at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at 
sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) 
at 
sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
 at java.lang.reflect.Method.invoke(Method.java:498) at 
org.codehaus.groovy.reflection.CachedMethod.invoke(CachedMethod.java:107) at 
org.codehaus.groovy.runtime.callsite.StaticMetaMethodSite$StaticMetaMethodSiteNoUnwrapNoCoerce.invoke(StaticMetaMethodSite.java:149)
 at 
org.codehaus.groovy.runtime.callsite.StaticMetaMethodSite.callStatic(StaticMetaMethodSite.java:100)
 at 
org.codehaus.groovy.runtime.callsite.CallSiteArray.defaultCallStatic(CallSiteArray.java:55)
 at 
org.codehaus.groovy.runtime.callsite.AbstractCallSite.callStatic(AbstractCallSite.java:217)
 at 
org.codehaus.groovy.runtime.callsite.AbstractCallSite.callStatic(AbstractCallSite.java:231)
 at 
org.testingisdocumenting.webtau.persona.ClosureResolveRepro.main(ClosureResolveRepro.groovy:30)
{code}
 
{code:java}
class ReproPersona {
    private String id

    ReproPersona(String id) {
        this.id = id
    }

    void call(Closure code) {
        println "person: $id"
    }
} {code}
{code:java}
class ReproPersonaList {
    public static def Admin = new ReproPersona("admin")
} {code}
 



--
This message was sent by Atlassian Jira
(v8.20.10#820010)

Reply via email to