Björn Kautler created GROOVY-12454:
--------------------------------------

             Summary: "Target constructor for constructor call expression 
hasn't been set" when using map-constructor-call with method-returned map under 
static compilation
                 Key: GROOVY-12454
                 URL: https://issues.apache.org/jira/browse/GROOVY-12454
             Project: Groovy
          Issue Type: Bug
    Affects Versions: 6.0.0, 5.1.3, 4.0.33, 5.0.3, 3.0.25, 2.5.23
            Reporter: Björn Kautler


Given the snippet
{code:groovy}
class Person2 {
  def name
  def age
}
def <T> T record(T value) {
  value
}
Map recordMap(Map value) {
  value
}
@groovy.transform.CompileStatic
def foo() {
  [
    new Person2(record([name: 'fred', age: 25])),
    new Person2([name: 'fred', age: 25]),
    new Person2(recordMap([name: 'fred', age: 25]))
  ]
}
foo() {code}
 

With the {{CompileStatic}} line commented out, all versions mentioned as 
affected compile fine and run fine, returning a list with three identical 
person instances with the properties set.

With the snippet as given, none of the versions can compile the snippet due to 
the first and last constructor lines.

Except of 3.0.25 all versions tell for both lines "Target constructor for 
constructor call expression hasn't been set".

3.0.25 shows the same for the first one, and "Cannot find matching method 
Person2#<init>(java.util.Map). Please check if the declared type is correct and 
if the method exists." for the last one.

With {{TypeChecked}} instead of {{CompileStatic}} it also works fine in all 
versions except 3.0.25. 3.0.25 with only type-checke can compile the first line 
but still has the same error for the last line.z

 

So it seems the SC does not properly use the "map-constructor-call" semantics 
if a normal or generic method call returned type {{{}Map{}}}, plus 3.0.25 
having some additional problem.



--
This message was sent by Atlassian Jira
(v8.20.10#820010)

Reply via email to