Uploaded image for project: 'Groovy'
  1. Groovy
  2. GROOVY-131

Variable visibility issue within nested closures

    XMLWordPrintableJSON

Details

    • Bug
    • Status: Closed
    • Major
    • Resolution: Fixed
    • None
    • 1.0-beta-4
    • None
    • None

    Description

      There is a nested closures variable scope visibility issue.
      (var a; closure-one("a is visible" closure-two("a is not visible"))

      I've attached a test case which illustrate that better :
      ClosureInClosureBug.groovy

      Don't forget to uncomment the commented line to see the issue.
      Otherwise the test will pass of course !

      Here is the stacktrace I caught with this test case:

      Caught: groovy.lang.MissingPropertyException: No such property: text for class: ClosureInClosureBug$2
      groovy.lang.MissingPropertyException: No such property: text for class: ClosureInClosureBug$2
      at groovy.lang.MetaClass.getProperty(MetaClass.java:398)
      at groovy.lang.Closure.getProperty(Closure.java:89)
      at org.codehaus.groovy.runtime.Invoker.getProperty(Invoker.java:437)
      at org.codehaus.groovy.runtime.InvokerHelper.getProperty(InvokerHelper.java:139)
      at ClosureInClosureBug$2.doCall(D:\groovy\samples\ClosureInClosureBug.groovy)
      at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
      at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
      at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
      at java.lang.reflect.Method.invoke(Method.java:324)
      at groovy.lang.MetaClass.doMethodInvoke(MetaClass.java:758)
      at groovy.lang.MetaClass.invokeMethod(MetaClass.java:214)
      at groovy.lang.MetaClass.invokeMethod(MetaClass.java:188)
      at groovy.lang.Closure.invokeMethod(Closure.java:69)
      at org.codehaus.groovy.runtime.Invoker.invokeMethod(Invoker.java:114)
      at org.codehaus.groovy.runtime.InvokerHelper.invokeMethod(InvokerHelper.java:92)
      at groovy.lang.Closure.call(Closure.java:145)
      at org.codehaus.groovy.runtime.DefaultGroovyMethods.each(DefaultGroovyMethods.java:256)
      at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
      at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
      at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
      at java.lang.reflect.Method.invoke(Method.java:324)
      at groovy.lang.MetaClass.doMethodInvoke(MetaClass.java:758)
      at groovy.lang.MetaClass.invokeMethod(MetaClass.java:236)
      at org.codehaus.groovy.runtime.Invoker.invokeMethod(Invoker.java:127)
      at org.codehaus.groovy.runtime.InvokerHelper.invokeMethod(InvokerHelper.java:92)
      at ClosureInClosureBug$1.doCall(D:\groovy\samples\ClosureInClosureBug.groovy:21)
      at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
      at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
      at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
      at java.lang.reflect.Method.invoke(Method.java:324)
      at groovy.lang.MetaClass.doMethodInvoke(MetaClass.java:758)
      at groovy.lang.MetaClass.invokeMethod(MetaClass.java:214)
      at groovy.lang.MetaClass.invokeMethod(MetaClass.java:188)
      at groovy.lang.Closure.invokeMethod(Closure.java:69)
      at org.codehaus.groovy.runtime.Invoker.invokeMethod(Invoker.java:114)
      at org.codehaus.groovy.runtime.InvokerHelper.invokeMethod(InvokerHelper.java:92)
      at groovy.lang.Closure.call(Closure.java:145)
      at org.codehaus.groovy.runtime.DefaultGroovyMethods.each(DefaultGroovyMethods.java:256)
      at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
      at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
      at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
      at java.lang.reflect.Method.invoke(Method.java:324)
      at groovy.lang.MetaClass.doMethodInvoke(MetaClass.java:758)
      at groovy.lang.MetaClass.invokeMethod(MetaClass.java:236)
      at org.codehaus.groovy.runtime.Invoker.invokeMethod(Invoker.java:127)
      at org.codehaus.groovy.runtime.InvokerHelper.invokeMethod(InvokerHelper.java:92)
      at ClosureInClosureBug.testInvisibleVariable(D:\groovy\samples\ClosureInClosureBug.groovy:18)
      at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
      at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
      at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
      at java.lang.reflect.Method.invoke(Method.java:324)
      at groovy.lang.MetaClass.doMethodInvoke(MetaClass.java:758)
      at groovy.lang.MetaClass.invokeMethod(MetaClass.java:214)
      at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
      at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
      at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
      at java.lang.reflect.Method.invoke(Method.java:324)
      at groovy.lang.MetaClass.doMethodInvoke(MetaClass.java:758)
      at groovy.lang.MetaClass.invokeMethod(MetaClass.java:214)
      at org.codehaus.groovy.runtime.Invoker.invokeMethod(Invoker.java:127)
      at org.codehaus.groovy.runtime.InvokerHelper.invokeMethod(InvokerHelper.java:92)
      at ClosureInClosureBug.invokeMethod(D:\groovy\samples\ClosureInClosureBug.groovy)
      at org.codehaus.groovy.runtime.Invoker.invokeMethod(Invoker.java:114)
      at org.codehaus.groovy.runtime.InvokerHelper.invokeMethod(InvokerHelper.java:92)
      at ClosureInClosureBug.main(D:\groovy\samples\ClosureInClosureBug.groovy:31)
      at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
      at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
      at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
      at java.lang.reflect.Method.invoke(Method.java:324)
      at groovy.lang.MetaClass.doMethodInvoke(MetaClass.java:758)
      at groovy.lang.MetaClass.invokeStaticMethod(MetaClass.java:273)
      at org.codehaus.groovy.runtime.Invoker.invokeMethod(Invoker.java:121)
      at org.codehaus.groovy.runtime.InvokerHelper.invokeMethod(InvokerHelper.java:92)
      at groovy.lang.GroovyShell.run(GroovyShell.java:171)
      at groovy.lang.GroovyShell.main(GroovyShell.java:85)
      at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
      at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
      at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
      at java.lang.reflect.Method.invoke(Method.java:324)
      at org.codehaus.classworlds.Launcher.launchStandard(Launcher.java:410)
      at org.codehaus.classworlds.Launcher.launch(Launcher.java:344)
      at org.codehaus.classworlds.Launcher.main(Launcher.java:474)

      Attachments

        1. ClosureInClosureBug.groovy
          0.8 kB
          Guillaume Sauthier

        Issue Links

          Activity

            People

              Unassigned Unassigned
              guillaume Guillaume Sauthier
              Votes:
              0 Vote for this issue
              Watchers:
              0 Start watching this issue

              Dates

                Created:
                Updated:
                Resolved: