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

Wrong Closure delegation for property access when using @CompileStatic and DELEGATE_FIRST / DELEGATE_ONLY

    XMLWordPrintableJSON

Details

    • Bug
    • Status: Closed
    • Major
    • Resolution: Fixed
    • 2.3.11, 2.6.0-alpha-3, 3.0.0-alpha-2, 2.5.0-rc-1, 2.4.15
    • 2.5.0
    • Static compilation
    • None

    Description

      Closures resolve to owner property although `DELEGATE_FIRST` or `DELEGATE_ONLY` are set as `resolveStrategy`.
      This only happens when `@CompileStatic` is used.
      This does not apply to method calls.
      For Groovy 2.3.11 this only affects read operations.

      Only the versions 2.5.0-rc-1, 2.4.15, 2.3.11 have been tested yet.
      I will add tests for newer versions, but this requires a different test framework than Spock.

      I have created a demo project at https://github.com/MeneDev/groovy-bugreport-closure-strategy

       

      class ADelegate {
          def x = "delegate"
      }
      
      @CompileStatic
      class AClass {
          public <T> T closureExecuter(
                  ADelegate d,
                  @DelegatesTo(value = ADelegate, strategy = DELEGATE_ONLY) Closure<T> c) {
              c.resolveStrategy = DELEGATE_ONLY
              c.delegate = d
              return c()
          }
      
          def x = "owner"
          
          def test() {
              def theDelegate = new ADelegate()
              def res = closureExecuter(theDelegate) {
                  return x
              }
              
              // is "owner" instead of "delegate"
              return res
          }
      }
      

      Attachments

        Issue Links

          Activity

            People

              paulk Paul King
              Mene Michael Arndt
              Votes:
              0 Vote for this issue
              Watchers:
              3 Start watching this issue

              Dates

                Created:
                Updated:
                Resolved: