Eric Milles created GROOVY-11402:
------------------------------------
Summary: STC: inferred type of this.name within closure
Key: GROOVY-11402
URL: https://issues.apache.org/jira/browse/GROOVY-11402
Project: Groovy
Issue Type: Bug
Components: Static Type Checker
Affects Versions: 4.0.21, 3.0.21
Reporter: Eric Milles
Assignee: Eric Milles
Consider the following:
{code:groovy}
class C extends HashMap<String,String> {
private Object f = 'field'
private static Object g = 'field'
@groovy.transform.TypeChecked
void test() {
{->
def a = f
println a // entry
def b = g
println b // field
def c = this.f
println c // entry or field (if SC)
def d = this.g
println d // field
}()
}
}
new C().test()
{code}
GROOVY-11367, GROOVY-11401
Fixes in Groovy 3 [1] and 4 [2] have made it so that "g" and "this.g" resolve
to the static field (even from outer class). Groovy 5 has dropped this special
case and should go through the closure's {{getProperty}} protocol. This is at
least consistent with "g" and "this.g" appearing outside of a closure.
However, "f" and "this.f" have some inconsistencies. "f" resolves to entry for
STC and SC. "this.f" resolves to field at compile time for STC and SC. But to
entry for STC and field for SC at run time. Should "this.a" be entry within
closure as "a" is for all cases? Or should only the STC inferred type be fixed
to match the run time behavior -- leaving SC unchanged?
[1]
https://github.com/apache/groovy/commit/419ce2f91754f101d8e65977da4dc7e8e6b6265f
[2]
https://github.com/apache/groovy/commit/3c2266e053c4a9a9127be43921afb0c5135725f6
--
This message was sent by Atlassian Jira
(v8.20.10#820010)