Anton Pryamostanov created GROOVY-8881:
------------------------------------------

             Summary: Inner class - qualified "this" reference cast exception 
inside 2 closures
                 Key: GROOVY-8881
                 URL: https://issues.apache.org/jira/browse/GROOVY-8881
             Project: Groovy
          Issue Type: Bug
          Components: Compiler, groovy-runtime
            Reporter: Anton Pryamostanov


Let's consider the below example of qualified (Outer class) "this" reference 
from within the Inner class, used inside a closure defined inside another 
closure (2 layers of closures):
{code:java}
class OuterClass implements Runnable {

    class InnerClass {

        String bar() {
            Closure closureOne = {
                Closure closureTwo = {
                    OuterClass outerClassViaQualifiedThisReference = 
OuterClass.this
                    return outerClassViaQualifiedThisReference
                }
                return closureTwo.call()
            }
            closureOne.call()
        }

    }

    String toString() {
        return "OuterClass"
    }

    void run() {
        System.out.println(new InnerClass().bar())
    }
}
{code}

It produces the below runtime exception:
{code}
java.lang.ClassCastException: OuterClass$InnerClass cannot be cast to 
OuterClass$InnerClass$_bar_closure1
        at 
OuterClass$InnerClass$_bar_closure1$_closure2.doCall(ConsoleScript279:8)
        at 
OuterClass$InnerClass$_bar_closure1$_closure2.doCall(ConsoleScript279)
        at OuterClass$InnerClass$_bar_closure1.doCall(ConsoleScript279:11)
        at OuterClass$InnerClass$_bar_closure1.doCall(ConsoleScript279)
        at OuterClass$InnerClass.bar(ConsoleScript279:13)
        at OuterClass$InnerClass$bar.call(Unknown Source)
        at OuterClass.run(ConsoleScript279:23)
{code}

However the below code runs fine (if only 1 closure is used):
{code:groovy}
class OuterClass implements Runnable {

    class InnerClass {

        String bar() {
            Closure closureOne = {
                //Closure closureTwo = {
                    OuterClass outerClassViaQualifiedThisReference = 
OuterClass.this
                    return outerClassViaQualifiedThisReference
                //}
                //return closureTwo.call()
            }
            closureOne.call()
        }

    }

    String toString() {
        return "OuterClass"
    }

    void run() {
        System.out.println(new InnerClass().bar())
    }
}
{code}

*Expected result*:

Code should run in both cases without runtime exceptions and should output 
"OuterClass".



--
This message was sent by Atlassian JIRA
(v7.6.3#76005)

Reply via email to