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

Closure property in Binding used as Closure delegate cannot be called

    Details

    • Type: Bug
    • Status: Open
    • Priority: Major
    • Resolution: Unresolved
    • Affects Version/s: 1.8.6
    • Fix Version/s: 3.x
    • Component/s: groovy-runtime
    • Labels:
      None

      Description

      In a script, this works:

      c =

      { println 'works' }

      c()

      whereas this one doesn't:

      def bind = new Binding(c:

      { println 'does not work' }

      )
      def t =

      { c() }

      t.delegate = bind
      t()

      They both define a 'c' property in the binding which happens to be a closure. In the first case, the closure get's called as Groovy apparently tries to get the binding property and invoke it if it's a closure; in the latter, the delegate of the closure is a binding with a property 'c' that is a closure, but c() still doesn't work.

      I debugged this and there is actually an if in MetaClassImpl that checks if the 'this' object is a Script, and if so, a property with the name is retrieved and a call() method is called. (MetaClassImpl#invokePropertyOrMissing:1089 in Groovy 1.8.6-all from maven central).

        Attachments

          Activity

            People

            • Assignee:
              Unassigned
              Reporter:
              wujek Wujek
            • Votes:
              1 Vote for this issue
              Watchers:
              2 Start watching this issue

              Dates

              • Created:
                Updated: