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)