[ 
https://issues.apache.org/jira/browse/GROOVY-11265?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=17803243#comment-17803243
 ] 

Christopher Smith commented on GROOVY-11265:
--------------------------------------------

Now that I have a workaround for this (removing {{@CompileStatic}}), my test 
suite is launching (previously the rehydrate caused a constructor to throw), 
but I'm getting what looks to be a common-cause {{MissingMethodException}} in 
more mundane code:

{code}
groovy.lang.MissingMethodException: No signature of method: 
com.example.AdminOauthClientDto$_profileToDto_closure1$_closure2$_closure3.doCall()
 is applicable for argument types: (com.example.Identity...) values: 
[Identity(null, null, Envy TMS, null, [], [], 
Identity/10000000-0002-0000-0000-000000000004), ...]
Possible solutions: doCall(com.example.Identity, java.util.Set), findAll(), 
findAll()
{code}

where the closure in question is
{code:groovy}
clientProfile.roleIdentities.forEach { id, orgs ->
  clientDto.doSomethingWithOrgs(orgs)
}
{code}

The correct signature for the closure is {{(Identity, Set<Organization>)}}, and 
the bytecode does in fact show that as the signature for {{doCall}}, but 
apparently somehow the compiler is trying to invoke it with varargs of the 
first parameter?

> Runtime rehydrate error for closure in interface default method
> ---------------------------------------------------------------
>
>                 Key: GROOVY-11265
>                 URL: https://issues.apache.org/jira/browse/GROOVY-11265
>             Project: Groovy
>          Issue Type: Bug
>          Components: Compiler, Static compilation
>    Affects Versions: 4.0.13, 4.0.17
>            Reporter: Christopher Smith
>            Priority: Critical
>
> When using an interface default method (implemented in Groovy 4 as a trait) 
> that returns an instance of a functional interface defined by a lambda, 
> compilation succeeds but runtime invocation produces
> {code}
> groovy.lang.MissingMethodException: No signature of method: 
> com.example.MyInterface$Trait$Helper$$Lambda$2132/0x0000000800e24c40.rehydrate()
>  is applicable for argument types: (com.example.MyImplementation...) values: 
> [com.example.MyImplementation@2a7087a8, ...]
>         at 
> org.codehaus.groovy.runtime.ScriptBytecodeAdapter.unwrap(ScriptBytecodeAdapter.java:72)
>         at 
> org.codehaus.groovy.runtime.ScriptBytecodeAdapter.invokeMethodN(ScriptBytecodeAdapter.java:184)
>         at com.example.MyInterface$Trait$Helper.curry(MyInterface.groovy:19)
>         at com.example.MyImplementation.curry(MyImplementation.groovy)
> {code}
> Update: This appears to be a problem introduced between 4.0.12 and 4.0.13 and 
> shows up only when _the interface_ is defined as {{@CompileStatic}}. While I 
> understand that the party line is that traits and ASTTs aren't guaranteed to 
> be compatible, (1) this was working perfectly previously and (2) the 
> compiler's implementation of interface default methods as traits is an 
> implementation detail and should have as limited a blast radius as practical.



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

Reply via email to