groovy-notifications mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From "Paul King (JIRA)" <>
Subject [jira] [Commented] (GROOVY-7956) Allow @DelegatesTo on named arguments
Date Fri, 07 Oct 2016 07:24:20 GMT


Paul King commented on GROOVY-7956:

It's also interesting to examine some of Groovy's own examples of map params, e.g. {{groovy.sql.Sql}}
has several examples including {{newInstance}}:
def sql = Sql.newInstance(
    url: 'jdbc:hsqldb:mem:testDB',
    user: 'sa',
    password: '',
    driver: 'org.hsqldb.jdbc.JDBCDriver',
    cacheStatements: true,
    resultSetConcurrency: CONCUR_READ_ONLY
Some of the arguments are required and the method also supports an optional 'properties' named
argument which can't be used in combination with some of the other arguments.

The first 4 of these are picked out and determine which {{getConnection}} method will be called
under the covers. The last two cause appropriate calls to the various setters of the created

It is interesting to think ahead for how we might get type assistance for this case in the
future even if we don't implement that straight away.

> Allow @DelegatesTo on named arguments
> -------------------------------------
>                 Key: GROOVY-7956
>                 URL:
>             Project: Groovy
>          Issue Type: New Feature
>          Components: GEP
>            Reporter: Graeme Rocher
> In order to aid static compilation for builders we have {{@DelegatesTo}} which allows
statically compiled code to know what the delegate of a closure is.
> This proposal is to allow {{@DelegatesTo}} on {{Map}} types such that IDEs and the static
compiler can resolve the target type the named arguments are to be used on.
> For example:
> {code}
> class Farm {
>      void animal(@DelegatesTo(Animal) Map arguments, @DelegatesTo(AnimalBuilder) Closure
callable) {
>              def animal = new Animal(arguments)
>              // handle closure
>     }
> } 
> class Animal { String name }
> {code}
> The following code would then fail to compile :
> {code}
> def farm = new Farm()
> // compilation failure, no name property on Animal
> farm.animal(nam: "Dog")  { 
> }
> {code}
> It would then be down to IDEs to also provide support for code completion etc.

This message was sent by Atlassian JIRA

View raw message