Been debugging on this a bit. I've not yet been able to get a script that
reproduces the problem outside of my application. However, I think I've
tracked down the source of the problem and I'm *pretty* sure it's a bug?

org.codehaus.groovy.transform.stc.StaticTypeCheckingVisitor#getTemporaryTypesForExpression
changed in 4.0.19 so that it would always return an empty list. However,
that disrupts the logic of
org.codehaus.groovy.transform.stc.StaticTypeCheckingVisitor#getType, which
has checks like:

if (type == null && temporaryTypesForExpression == null) {

...which will basically never evaluate to true, meaning that

getTypeFromClosureArguments(parameter);

doesn't get hit.

Sorry for the stream of consciousness. I'll try and get a repro script & a
bug report together.

On Tue, Jun 17, 2025 at 8:28 AM Milles, Eric (TR Technology) via dev <
dev@groovy.apache.org> wrote:

> Could you provide a small script that demonstrates the issue?
>
> For your example, what is the type returned by "cfValues['SpecialKey']"?
> Is it a list, map or some user-defined type?  What is the expected type of
> "cfValues['SpecialKey']*.name" if you assigned it to a temporary variable?
>
> Determining the aggregate type when applying the * operator has had some
> fixes to it.  If you supply special metadata to help type on of the
> subexpressions, can you say what keys you are using or are you using a
> type-checker extension?
>
>
> ------------------------------
> *From:* Jonny <jonny...@apache.org>
> *Sent:* Monday, June 16, 2025 5:18 PM
> *To:* dev@groovy.apache.org <dev@groovy.apache.org>
> *Subject:* [EXT] Static Type Checker Changes for Closure Parameters in
> 4.0.19 onward
>
> *External Email:* Use caution with links and attachments.
>
> Cross-posting to the mailing list from Slack
> <https://urldefense.com/v3/__https://groovy-community.slack.com/archives/C2NEFCM55/p1750110654202509__;!!GFN0sa3rsbfR8OLyAw!YZyV0o3N2Xf4XCeQ_ksNawkcRNlQN2eVfW0Z6J8my3GZOuFXbV_v5_Bp1S1rbqvW8x3WewID0n1WMO6C9zhl6V9g$>
> .
>
> I'm trying to debug an issue with the static type checker and closure
> method parameters. It seems like in Groovy 4.0.19, something changed that
> has broken type checking for statements like:
>
> cfValues['SpecialKey']*.name.collect {it.toUpperCase()}
>
> Some context: cfValues is a binding variable that I provide custom type
> information for via a ClassCodeExpressionTransformer.
>
> In this case, the static type checker seems to know that
> cfValues['SpecialKey'] returns a value of the expected type which, in turn,
> has a name property that is a String. Statements like:
>
> cfValues['SpecialKey']*.name*.toUpperCase()
>
> compile just fine. But from Groovy 4.0.19 onward, the static type checker
> only seems to think that the it Closure parameter is an Object, not a
> String. I've been poring over the diff, the changelog
> <https://urldefense.com/v3/__https://groovy-lang.org/changelogs/changelog-4.0.19.html__;!!GFN0sa3rsbfR8OLyAw!YZyV0o3N2Xf4XCeQ_ksNawkcRNlQN2eVfW0Z6J8my3GZOuFXbV_v5_Bp1S1rbqvW8x3WewID0n1WMO6C9xN9UByT$>,
> and stepping through the debugger to figure out what changed, but I haven't
> been able to fathom it out. Does this ring a bell for anyone?
>
> Thanks for any pointers.
>
> Best,
>
> Jonny Carter
>

Reply via email to