There are a couple open bugs related to STC handling of closure shared 
variables.  When a shared variable is assigned a value within the closure, the 
assigned type is not included in the inferred type outside the closure/lambda 
and this leads to some problems.

If this behavior is changed to save the LUB(A,B) as the inferred type of "x", 
as is suggested in 9516 and seems required by 9344, the second pass checks for 
method calls will be replaced by no matching method errors.  That is "Cannot 
find matching method java.lang.Object#something(). Please check if the declared 
type is correct and if the method exists." will replace "A closure shared 
variable [x] has been assigned with various types and the method [charAt(int)] 
does not exist in the lowest upper bound...".  Is this an acceptable change in 
STC behavior?


@groovy.transform.CompileStatic
void test() {
  def x = new A();
  { -> x = new B() } // may also be called immediately
  x.something() // current STC infers typeof(x) == A
}

I think it was done this way because you could define the closure but not call 
it (like above).  Or call it asynchronously:

@groovy.transform.CompileStatic
void test() {
  def x = new A();
  Thread.start { -> x = new B() }
  x.something() // current STC infers typeof(x) == A
}

https://issues.apache.org/jira/browse/GROOVY-9516
https://issues.apache.org/jira/browse/GROOVY-9344
https://issues.apache.org/jira/browse/GROOVY-5874

This e-mail is for the sole use of the intended recipient and contains 
information that may be privileged and/or confidential. If you are not an 
intended recipient, please notify the sender by return e-mail and delete this 
e-mail and any attachments. Certain required legal entity disclosures can be 
accessed on our website: 
https://www.thomsonreuters.com/en/resources/disclosures.html

Reply via email to