You are viewing a plain text version of this content. The canonical link for it is here.
Posted to notifications@groovy.apache.org by "Eric Milles (Jira)" <ji...@apache.org> on 2022/02/01 18:03:00 UTC

[jira] [Updated] (GROOVY-10312) MissingMethodException in method with default parameter in trait - regression in 3.0.9

     [ https://issues.apache.org/jira/browse/GROOVY-10312?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel ]

Eric Milles updated GROOVY-10312:
---------------------------------
    Fix Version/s: 2.5.16

> MissingMethodException in method with default parameter in trait - regression in 3.0.9
> --------------------------------------------------------------------------------------
>
>                 Key: GROOVY-10312
>                 URL: https://issues.apache.org/jira/browse/GROOVY-10312
>             Project: Groovy
>          Issue Type: Bug
>    Affects Versions: 4.0.0-beta-1, 3.0.9
>            Reporter: Marcin Zajaczkowski
>            Assignee: Eric Milles
>            Priority: Minor
>              Labels: trait, traits
>             Fix For: 4.0.0-beta-2, 2.5.16, 3.0.10
>
>
> After switch from 3.0.8 to 3.0.9 Groovy throws at runtime MissingMethodException for static method in a trait called from another trait, but only if a given method has a default parameter.
> A stripped down code to reproduce problem:
> {code:java}
> class StaticStaticInTraitProblem implements TLevel1 {
>     static void main(String[] args) {
>         staticMethodWithDefaultParameter()
>     }
> }
> trait TLevel1 extends TLevel2 {
>     static void staticMethodWithDefaultParameter(String params = "") { //default param is required to make it fail at runtime
>         static2() //fails with MissingMethodException: No signature of method: static foobar.TLevel1.static2() is applicable ...
>     }
> }
> trait TLevel2 {
>     static void static2() {}
> }{code}
> A stacktrace:
> {code:java}
> Exception in thread "main" groovy.lang.MissingMethodException: No signature of method: static foobar.TLevel1.static2() is applicable for argument types: () values: []
> Possible solutions: wait(), wait(long), split(groovy.lang.Closure), wait(long, int), notify(), stream()
>     at groovy.lang.MetaClassImpl.invokeStaticMissingMethod(MetaClassImpl.java:1584)
>     at groovy.lang.MetaClassImpl.invokeStaticMethod(MetaClassImpl.java:1570)
>     at org.codehaus.groovy.runtime.InvokerHelper.invokeMethod(InvokerHelper.java:1003)
>     at org.codehaus.groovy.runtime.ScriptBytecodeAdapter.invokeMethodN(ScriptBytecodeAdapter.java:180)
>     at foobar.TLevel1$Trait$Helper.$static_methodMissing(StaticStaticInTraitProblem2Spec.groovy)
>     at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
>     at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:78)
>     at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
>     at java.base/java.lang.reflect.Method.invoke(Method.java:567)
>     at org.codehaus.groovy.reflection.CachedMethod.invoke(CachedMethod.java:107)
>     at groovy.lang.MetaClassImpl.invokeStaticMissingMethod(MetaClassImpl.java:1582)
>     at groovy.lang.MetaClassImpl.invokeStaticMethod(MetaClassImpl.java:1570)
>     at org.codehaus.groovy.runtime.callsite.StaticMetaClassSite.call(StaticMetaClassSite.java:50)
>     at org.codehaus.groovy.runtime.callsite.CallSiteArray.defaultCall(CallSiteArray.java:47)
>     at org.codehaus.groovy.runtime.callsite.AbstractCallSite.call(AbstractCallSite.java:125)
>     at org.codehaus.groovy.runtime.callsite.AbstractCallSite.call(AbstractCallSite.java:130)
>     at foobar.TLevel1$Trait$Helper.staticMethodWithDefaultParameter(StaticStaticInTraitProblem2Spec.groovy:11)
>     at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
>     at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:78)
>     at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
>     at java.base/java.lang.reflect.Method.invoke(Method.java:567)
>     at org.codehaus.groovy.reflection.CachedMethod.invoke(CachedMethod.java:107)
>     at groovy.lang.MetaMethod.doMethodInvoke(MetaMethod.java:323)
>     at org.codehaus.groovy.runtime.callsite.StaticMetaMethodSite.invoke(StaticMetaMethodSite.java:44)
>     at org.codehaus.groovy.runtime.callsite.StaticMetaMethodSite.callStatic(StaticMetaMethodSite.java:100)
>     at org.codehaus.groovy.runtime.callsite.CallSiteArray.defaultCallStatic(CallSiteArray.java:55)
>     at org.codehaus.groovy.runtime.callsite.AbstractCallSite.callStatic(AbstractCallSite.java:217)
>     at org.codehaus.groovy.runtime.callsite.AbstractCallSite.callStatic(AbstractCallSite.java:240)
>     at foobar.TLevel1$Trait$Helper.staticMethodWithDefaultParameter(StaticStaticInTraitProblem2Spec.groovy)
>     at foobar.TLevel1$Trait$Helper$staticMethodWithDefaultParameter.call(Unknown Source)
>     at org.codehaus.groovy.runtime.callsite.CallSiteArray.defaultCall(CallSiteArray.java:47)
>     at org.codehaus.groovy.runtime.callsite.AbstractCallSite.call(AbstractCallSite.java:125)
>     at org.codehaus.groovy.runtime.callsite.AbstractCallSite.call(AbstractCallSite.java:139)
>     at foobar.StaticStaticInTraitProblem2Spec.staticMethodWithDefaultParameter(StaticStaticInTraitProblem2Spec.groovy)
>     at foobar.StaticStaticInTraitProblem2Spec.main(StaticStaticInTraitProblem2Spec.groovy:5) 
>  {code}
> Trying to minimize the original case, I reach similar error also with the other construction:
> {code:java}
> class StaticInTraitProblem implements StaticTrait {
>     static void main(String[] args) {
>         staticMethodWithDefaultParameter()
>     }
> }
> trait StaticTrait {
>     public static final String CONSTANT = ""
>     static void staticMethodWithDefaultParameter(String params = "") {  //default param is required to make it fail at runtime
>         CONSTANT  //Fails with: MissingMethodException: No signature of method: static foobar.StaticTrait.foobar_StaticTrait__CONSTANT$get() is applicable for argument types: () values: []
>     }
> }  {code}
> It worked fine with 3.0.8.



--
This message was sent by Atlassian Jira
(v8.20.1#820001)