When a Map is the first parameter, it acts as a collector for any named 
parameters.

def foo(Map a, b, c) {
  // ...
}

foo(a:'a', 'b', 'c', x: 'also a')
________________________________
From: o...@ocs.cz <o...@ocs.cz>
Sent: Friday, April 11, 2025 9:16 AM
To: Groovy_Developers <dev@groovy.apache.org>
Subject: [EXT] Re: Lists in annotations

External Email: Use caution with links and attachments.

P.S. Sorry I see I forgot to add the test for the seconds case (caller side 
Map, no such thing at the receiver):
===
1054 ocs /tmp> <q.groovy
def foo(a, b, c) {
  println "a:$a b:$b c:$c"
}
foo([a:1], 'Hi', 'there')
1055 ocs /tmp> /usr/local/groovy-4.0.25/bin/groovy q
a:[a:1] b:Hi c:there
1056 ocs /tmp>
===

On 11. 4. 2025, at 16:12, o...@ocs.cz<mailto:o...@ocs.cz> wrote:

Christopher,

On 11. 4. 2025, at 15:55, Christopher Smith 
<chrylis+gro...@gmail.com<mailto:chrylis+gro...@gmail.com>> wrote:
I personally find it surprising and confusing that arguments are implicitly 
collected in method calls; I recently was baffled until I realized that the Map 
as a first argument was causing Groovy to group the leading arguments.

I am not sure what this means. What is a “leading argument”? Can you please 
show an example? With my testing, nothing is grouped (unless one uses named 
arguments, which of course go into that Map):
===
1052 ocs /tmp> <q.groovy
def foo(Map m=null, a, b, c) {
  println "m:$m a:$a b:$b c:$c"
}
foo('Hi', 'there', '!')
1053 ocs /tmp> /usr/local/groovy-4.0.25/bin/groovy q
m:null a:Hi b:there c:!
1054 ocs /tmp>
===

I appreciate Groovy's syntactic sugar for clear cases (such as trailing 
lambdas), but I would rather not have arguments collected if the signature 
isn't varargs.

Unless you limit your code by CompileStatic, that's technically impossible, 
since normally caller does not (need to) know the signature of the receiver 
until actually called.

All the best,
OC

On Fri, Apr 11, 2025, 05:22 Paul King 
<pa...@asert.com.au<mailto:pa...@asert.com.au>> wrote:
I think it is just the case that Java supports only a single value or
array notation, so that's what we did too (just adapting to Groovy
array/list notation).

We have certainly had folks ask if we could also support the curly
brace syntax but that clashes with a closure.

It would be interesting to see whether it is a simple or ugly change
at the grammar/early parsing level.

Cheers, Paul.

On Fri, Apr 11, 2025 at 7:19 PM Gianluca Sartori 
<g.sart...@gmail.com<mailto:g.sart...@gmail.com>> wrote:
>
> Hi folks,
>
> we use the following well known annotation in our Grails controllers:
>
> @Secured(['ROLE_USER', 'ROLE_OTHER'])
>
> I was wondering why we cannot write this instead:
>
> @Secured('ROLE_USER', 'ROLE_OTHER')
>
> like in method calls.
>
> To your knowledge is that a Groovy thing or it lies somewhere else?
>
> Cheers,
> Gianluca Sartori
>


Reply via email to