[
https://issues.apache.org/jira/browse/GROOVY-9662?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=17165862#comment-17165862
]
Eric Milles edited comment on GROOVY-9662 at 9/27/20, 9:58 PM:
---------------------------------------------------------------
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 { ... args ->
println "C.test.with"
call (123) {
println "C.test.with.call"
}
}
}
}
new C().test()
{code}
I get a stack overflow for "call" in dynamic mode, so the runtime is resolving
"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.
was (Author: emilles):
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
> Assignee: Eric Milles
> 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)