groovy-users mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From "" <>
Subject Re: @Delegate and Date
Date Tue, 25 Oct 2016 22:08:27 GMT
Hello there,

> On 25. 10. 2016, at 11:40 PM, David Karr <> wrote:
> On Tue, Oct 25, 2016 at 1:34 PM, Dinko Srko─Ź <> wrote:
>> On 25 October 2016 at 16:02, VG <> wrote:
>>> why this does not work?
>>> class Example {
>>>    @Delegate Date when
>>> }
>>> def x = new Example(when: new Date())
>>>  // fails
>>> I checked
>>> and
>>> the next method is available there? Should not the method next be available
>>> through @delegate?
>> `next()` is not really a method on `java.util.Date`, but a Groovy's extension.
>> `Date`'s methods are all there. E.g.
>>    x.time // works
> And just to interject the question the OP is probably going to ask:
> Why should it matter whether it's an "extension" or not?  Is it
> documented that the methods available on a Delegate exclude what
> Groovy has added to the class?

Jochen or someone other probably could give a better explanation, but myself, I would dare
a guess that the problem is that @Delegate is not a true redirector (which I am still not
quite sure is even possible to write Java-side!), but (essentially) a request for the compiler
to add redirection stubs for all the known delegate methods.

The trick is that Groovy extensions are *not* known methods: they are not part of the class
API, instead, they are added metaclass-level. Thus, the @Delegate AST does not know of them,
and does not add appropriate stubs.

If you stayed completely at the dynamic side instead of using generated stubs through @Delegate,
it would work; on the other hand, it would not work from Java code:

class Example {
   Date when
   def methodMissing(String name, args) {
def x = new Example(when: new Date())
println  // works

Finally, as for the presumed question whether the @Delegate AST _could_ find the methods added
through extensions... I am not entirely sure. I think it could, but it might get a bit difficult
and perhaps even sort of unreliable. Definitely it would be problematic if called from Java.

All the best,

View raw message