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

Can't call private method from outer class when using anonymous inner classes and @CS

    XMLWordPrintableJSON

Details

    • Bug
    • Status: Closed
    • Major
    • Resolution: Fixed
    • 2.4.7
    • 2.5.0-alpha-1
    • None
    • None

    Description

      This example:

      import groovy.json.*
      import groovy.transform.*
      
      @CompileStatic
      class Bar {
          private Writable renderTemplate(Object o, Map args) {
          
          }
          def foo(Map map, Map arguments) {
          
              def writable = new Writable() {
                  @Override
                  Writer writeTo(Writer out) throws IOException {
                      StreamingJsonBuilder builder = new StreamingJsonBuilder(out)
                      builder.call {
                          for(key in map.keySet()) {
                              def o = map.get(key)
                              Writable writable = renderTemplate((Object)o, arguments)
                              call(key.toString(), writable)
                          }
                      }
                      return out
                  }
              }
          }
      }
      
      writable = new Bar().foo([one:'two'],[foo:'bar'])
      
      sw = new StringWriter()
      writable.writeTo(sw)
      println sw
      

      Results in a compilation error:

      [Static type checking] - Cannot find matching method Bar$1#renderTemplate(java.lang.Object, java.util.Map). Please check if the declared type is right and if the method exists.
       at line: 18, column: 45
      

      If you attempt to use Bar.this:

      Writable writable = Bar.this.renderTemplate((Object)o, arguments)
      

      The result is a VerifierError

      java.lang.VerifyError: (class: Bar$1$_writeTo_closure1, method: doCall signature: (Ljava/lang/Object;)Ljava/lang/Object;) Incompatible argument to function
      	at Bar$1.writeTo(ConsoleScript11:15)
      	at groovy.lang.Writable$writeTo.call(Unknown Source)
      	at org.codehaus.groovy.runtime.callsite.CallSiteArray.defaultCall(CallSiteArray.java:48)
      	at org.codehaus.groovy.runtime.callsite.AbstractCallSite.call(AbstractCallSite.java:113)
      	
      

      Attachments

        Issue Links

          Activity

            People

              paulk Paul King
              graemerocher1 Graeme Rocher
              Votes:
              0 Vote for this issue
              Watchers:
              3 Start watching this issue

              Dates

                Created:
                Updated:
                Resolved: