Since the delegation is effectively a part of a closure type, I’d expect 
@DelegatesTo to have TYPE_USE target.

Of course, it’s now tailored for parameters, so it probably should be a 
different annotation.
`genericTypeIndex` and `target` doesn’t make sense in TYPE_USE, so we are left 
with `value`, `strategy`, and `type`. 
I don’t believe it’s possible to define an owner of such closure reasonably, 
because it’s kind of dangling around, and without an owner the `strategy` 
doesn’t make sense. Now, `value` and `type` are essentially the same, but 
`type` supports generics. I don’t have a use case for `type`, but `value` could 
be covered by the following, if Groovy would support something like this:

```
@interface Requires {
  Class<? extends Precondition> value()
}

abstract class Precondition {
  def os = …
  abstract boolean checkRequirement() // SAM target
}

@Requires({ os.windows }) // or @Requires { os.windows } could be supported
class X {}

// which should be compiled to
@Requires(X$1)
class X {

  static class 1 extends Precondition {
    boolean checkRequirement() {
      os.windows
    }
  }
}
```

And with this approach there is no need for an annotation.

—

Daniil Ovchinnikov
JetBrains

> On 4 Aug 2021, at 22:00, Leonard Brünings <groovy-...@bruenings-it.net> wrote:
> 
> It is possible to define Closures for annotations, e.g., Spock's
> `@Requires({ os.windows })`.
> However, it is currently impossible to tell the IDE what this annotation
> will delegate to, as @DelegatesTo is only applicable for parameters.
> 
> Could we either allow @DelegatesTo for TYPE_USE or mabe add a new
> dedicated annotation for that.
> 
> public @interface Requires {
>   Class<DelegatesTo(PreconditionContext.class) ? extends Closure> value();
> }
> 
> Alternatively, we could add METHOD as target, to the annotation.
> 
> public @interface Requires {
>   DelegatesTo(PreconditionContext.class)
>   Class<? extends Closure> value();
> }
> 
> Cheers Leonard
> 

Reply via email to