I updated that old comment. It does now work with
@TypeChecked/@CompileStatic. The "dangling" method comment was short
for, the "with" method (in previous PR) isn't recognized as having a
functional interface.

Paul.

On Sun, Jul 21, 2024 at 8:35 AM MG <mg...@arscreat.com> wrote:
>
> Hi Paul,
>
> is this commentz still valid: "As currently designed, it works for dynamic 
> Groovy and fails when using static compilation. This is kind of as I'd expect 
> since we have a "dangling" method reference not associated with a functional 
> interface."
>
> Applied to your example, why would Person::validate be dangling under static 
> compilation ? Is it "just" that at the point in time when the Groovy compiler 
> tries to process  Person::validate, it is not yet resolved/resolvable ? Would 
> that also mean it would currently not work under @TypeChecked ?
>
> Cheers,
> mg
>
>
> On 20/07/2024 13:14, Paul King wrote:
>
> Hi folks,
>
> I created a PR here:
>
> https://github.com/apache/groovy/pull/2097
>
> For issue GROOVY-11432:
>
> https://issues.apache.org/jira/browse/GROOVY-11432
>
> It provides a fairly simple mechanism to support method
> references/method pointers in annotation members. It piggybacks on the
> existing closure support. Basically for an example using a closure:
>
> @TupleConstructor(post={ assert first && last })
> class Person {
>     final String first, last
> }
>
> You could now rewrite like this (to allow the validate method to be
> used also in other contexts):
>
> @TupleConstructor(post=Person::validate)
> class Person {
>     final String first, last
>     void validate() { assert first && last }
> }
>
> It is rewritten to this:
>
> @TupleConstructor(post={ this.withClosureMethod(Person::validate) })
> class Person {
>     final String first, last
>     void validate() { assert first && last }
> }
>
> There is nothing to stop other AST transforms from re-wrapping the
> call to withClosureMethod to be a direct call to some
> java.util.function.Function/Supplier/Consumer. Note: I added the
> DGM#withClosureMethod to provide a hook that would work for both
> dynamic and static Groovy.
>
> I believe it would work well for the scenario posed for
> Timefold/Optaplanner as well as various tweaks we could make to our
> existing AST transforms and for frameworks like Grails. It also works
> well with the recent GROOVY-11443 enhancement for design-by-contract
> scenarios where method references could now be mixed with other method
> references, or ad-hoc closures to specify pre/post-conditions &
> invariants.
>
> Also, by piggybacking in this way, should Java ever support this
> feature (as they discussed in [1]), the Java mechanism should not be
> impacted by this mechanism
>
> Let me know if you have any thoughts.
> .
> Cheers, Paul.
> [1] https://mail.openjdk.org/pipermail/core-libs-dev/2018-November/056596.html
>
>
>
> Cheers, Paul.
>
>

Reply via email to