If this snippet, "this" will always refer to the enclosing class, never the 
delegate "list" or the owner (which may be the enclosing closure or "this" if 
no enclosing closure).  That is, the choice of "this" has already frozen where 
"contains" can come from.


with(list) {

  SpockRuntime.verifyMethodCondition(this, "contains", [1])
}


From: Leonard Brünings [mailto:groovy-...@bruenings-it.net]
Sent: Monday, November 20, 2017 5:52 PM
To: dev@groovy.apache.org
Subject: Re: Get reference to enclosing closure


Spock doesn't rewrite it to `this.getThisObject()`.

This is what Spock does

with(list) {

  SpockRuntime.verifyMethodCondition(this, "contains", [1])
}

The transformation from `this` to `this.getThisObject()` is done by groovy at a 
later stage.
My guess somewhere in the AST-to-Bytecode ASM code as I can see the upper 
version in the
last stage of the AST-Transforms.


with(list) {

  SpockRuntime.verifyMethodCondition(this.getThisObject(), "contains", [1])
}
Am 20.11.2017 um 22:09 schrieb 
eric.mil...@thomsonreuters.com<mailto:eric.mil...@thomsonreuters.com>:
When you rewrite to this form:


with(list) {

  SpockRuntime.verifyMethodCondition(this.getThisObject(), "contains", [1])
}

You've esentially frozen your choice of delegate, owner or this.  The dynamic 
resolution of "implicit this" to one of those is no longer going to happen.  I 
guess you'd need to re-implement the resolution strategy.

Reply via email to