[
https://issues.apache.org/jira/browse/GROOVY-9662?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=17165862#comment-17165862
]
Eric Milles commented on GROOVY-9662:
-------------------------------------
When I try this:
{code:groovy}
class D {
def call(... args) {
println "D.call(${args})"
args[1].call(args[0])
}
}
class C {
def test() {
new D().with {
println "C.test.with"
call (123) {
println "C.test.with.call"
}
}
}
}
new C().test()
{code}
I get a MissingMethodException for "call" in dynamic mode, so it seems the
runtime is trying to resolve call against the Closure instance and not the
delegate. Thus, I'm hesitant to change the SC precedence of Closure methods.
Adding a "delegate." qualifier is a safer long-term bet that is also
cross-compatible with pre-3.0.5 Groovy.
> Groovy 3.0.5: Closure delegate is not working properly
> ------------------------------------------------------
>
> Key: GROOVY-9662
> URL: https://issues.apache.org/jira/browse/GROOVY-9662
> Project: Groovy
> Issue Type: Bug
> Affects Versions: 3.0.2, 3.0.3, 3.0.4, 3.0.5
> Reporter: Puneet Behl
> Priority: Major
>
> In Grails Views, we are using closures to generate JSON using
> `StreamingJsonBuilder`. The HAL implementation for an entity now generates an
> incorrect JSON after updating to Groovy 3.
>
> Here is the problem code snipped from Grails Views:
> {code:java}
> jsonDelegate.call(LINKS_ATTRIBUTE) {
> call(SELF_ATTRIBUTE) {
> call HREF_ATTRIBUTE, viewHelper.link(resource: object, method:
> HttpMethod.GET, absolute: true)
> call HREFLANG_ATTRIBUTE, locale.toString()
> call TYPE_ATTRIBUTE, contentType
> }
> Set<Link> links = getLinks(object)
> for (link in links) {
> call(link.rel) {
> call HREF_ATTRIBUTE, link.href
> call HREFLANG_ATTRIBUTE, link.hreflang?.toString() ?:
> locale.toString()
> def linkType = link.contentType
> if (linkType) {
> call TYPE_ATTRIBUTE, linkType
> }
> }
> }
> }
> {code}
>
> Although the `resolveStatergy` for the closures is `DELEGATE_FIRST` but I
> believe that is not working correctly because it works if I change the above
> to:
> {code:java}
> delegate.call (...
> {code}
>
> To reproduce the issue please checkout
> https://github.com/grails/grails-views/commits/bugs/groovy-9962
>
--
This message was sent by Atlassian Jira
(v8.3.4#803005)