Well, `cfValues` is a bit upstream of the closure parameter. The expressions getting checked are more like:
cfValues['MultiGroupPicker']*.name.collect {it.toUpperCase()}.contains("AAA") So `it` is the closure parameter. Through my ClassCodeExpressionTransformer, Groovy knows the type of cfValues['MultiGroupPicker'], and so can infer that the `name` property is a string. It was actually handling expressions like cfValues['MultiGroupPicker']*.name*.toUpperCase().contains("AAA") just fine, which makes sense given that the bug was only happening in the parameter processing branch of the getType method. I did a local build off the 4.0 line with that cherry-picked commit (thanks for back-porting, btw!), and it resolved the problem with no ill side effects. Reckon we'll just need the next 4.x release and we'll be right as rain. :) On Thu, Jul 3, 2025 at 11:12 AM Milles, Eric (TR Technology) < eric.mil...@thomsonreuters.com> wrote: > So in your code, is "cfValues" a closure parameter that is supposed to be > helped by ClosureParams metadata? > > This should resolve the problem: > https://github.com/apache/groovy/commit/e0a02a28738736334ba3b14de5bfa34895710aff > > > ------------------------------ > *From:* Jonathan Carter <jonathanccar...@gmail.com> > *Sent:* Wednesday, July 2, 2025 8:39 PM > *To:* dev@groovy.apache.org <dev@groovy.apache.org> > *Cc:* Milles, Eric (TR Technology) <eric.mil...@thomsonreuters.com> > *Subject:* [EXT] Re: Static Type Checker Changes for Closure Parameters > in 4.0.19 onward > > *External Email:* Use caution with links and attachments. > > 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 > >