Couldn't we rather consider phasing out the whole construct ? Allowing a ctor 
to be called without new only in this special case seems awfully 
inconsistent....
And with the new @MapConstructor / @NamedVariant/... and @Newify(pattern=...) 
support, one can achieve the same thing from modular annotation building blocks 
- just without the confusing square brackets syntax (which does not work for 
method calls taking a map argument).
-------- Ursprüngliche Nachricht --------Von: Paul King <[email protected]> 
Datum: 04.09.18  00:30  (GMT+01:00) An: [email protected] Betreff: 
Constructor call short-hand syntax 

Groovy has a rarely used shorthand syntax for constructors:
println Date[time:0] // same as new Date(time:0)println Date[year: 118, month: 
8, date: 3] // same as new Date(year: 118, month: 8, date: 3)
GROOVY-8602points out that the safe args version isn't supported, e.g.:
println Date?[time:0]
I was thinking of closing this as won't fix since we only support this 
shorthand for class constants.
Any objections?
Also, I noticed that the empty map isn't catered for:
println Date[:] // as per above, might be expected to be the same as new 
Date([:]) or new Date()
// currently NPE: Cannot get property '{}' on null object
So, the map isn't found and the expression becomes "println Date" which returns 
void and then we convert the map to a String and look for that property.
I realise this is a weird edge case but I was thinking of creating an issue to 
fix this for consistency (just Groovy 3). We already support this:

def map = [:]println Date[*:map]
Let me know if you have other thoughts.

Cheers, Paul.

Reply via email to