Marcin Zajaczkowski created GROOVY-10312:
--------------------------------------------

             Summary: 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: Improvement
    Affects Versions: 3.0.9
            Reporter: Marcin Zajaczkowski


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 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.3.4#803005)

Reply via email to