[ 
https://issues.apache.org/jira/browse/GROOVY-11056?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=17722936#comment-17722936
 ] 

Eric Milles commented on GROOVY-11056:
--------------------------------------

If you need this to work with Groovy 3.0.16, you can replace "Admin" with 
"Admin.call".

> 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
>            Assignee: Eric Milles
>            Priority: Major
>
> 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