I did some research with Groovy 2.5 that I happened to have installed on 
path... It seems that CompileStatic bakes in the resolve strategy at the time 
the closure is created. So my 2.4 project, assuming 2.5 works the same as 2.4, 
is operating as OWNER_FIRST, even though it's passed to with (unless the 
closure was compiled in dynamic mode).

It seems for me, the proper solution then is to not use "with" but instead 
create a new variation of "with" that works with OWNER_FIRST and call that 
instead. It seems also that this message might be better as a warning than an 
error, or to have a flag have it be a warning, since it looks like it can work 
as the old code in runtime, although I agree, any new code written should not 
have this pattern because it is so misleading.

Jason



Sensitivity: Internal
From: Winnebeck, Jason <jason.winneb...@windstream.com>
Sent: Tuesday, August 18, 2020 12:22 AM
To: users@groovy.apache.org
Subject: Groovy 3 OWNER_FIRST closure passed to method with resolve strategy 
DELEGATE_FIRST

I'm upgrading a project from Groovy 2.4.19 to 3.0.5 with 100s of classes almost 
all @CompileStatic code on JDK 8. Upon upgrading I get compiler errors about 
static type checker knowing or not knowing anymore of objects, which is par for 
the course for any Groovy upgrade. But most of the errors I get are this:

Closure parameter with resolve strategy OWNER_FIRST passed to method with 
resolve strategy DELEGATE_FIRST

The pattern that I am using is having a method that takes a Closure, and passes 
it to Object.with:

void run(@DelegatesTo(X) Closure closure) {
  println "I'm running!"
  something.with(closure)
}

run { println prop }

So I know what OWNER_FIRST and DELEGATE_FIRST mean. And I see that the default 
in @DelegatesTo (or no annotation presumably) is OWNER_FIRST, and with clones 
the closure and sets its resolve strategy to DELEGATE_FIRST.

I can't find documentation on this message. Does the message being an error 
imply that the resolve strategy on a closure is "baked in" in CompileStatic? 
Did that change since 2.4? What is the best practice solution?

Other notes:

  1.  I build with IDEA and the default 700mb heap was not enough to build, I 
needed 5GB heap to build without OutOfMemoryError is that expected?
  2.  I'm trying to upgrade from 2.4.19 because I encountered a bug in static 
compile, in an expression x.value = someEnum, there is x.setValue(boolean) and 
x.setValue(String). 90% of the time the static compiler picks the 
setValue(String) for all such call sites in a build, 10% of the time it picks 
setValue(boolean) for all such call sites. I didn't receive any compiler errors 
on that expression as I'd expect it to be ambiguous (or at least pick same each 
time), is that expected to fail compile in Groovy 3?

Thanks,

Jason Winnebeck


Sensitivity: Internal
This email message and any attachments are for the sole use of the intended 
recipient(s). Any unauthorized review, use, disclosure or distribution is 
prohibited. If you are not the intended recipient, please contact the sender by 
reply email and destroy all copies of the original message and any attachments.

Reply via email to