Stephen Albrecht created GROOVY-11761:
-----------------------------------------

             Summary: mod overloads in older Groovy library fails in Groovy 5
                 Key: GROOVY-11761
                 URL: https://issues.apache.org/jira/browse/GROOVY-11761
             Project: Groovy
          Issue Type: Bug
    Affects Versions: 5.0.1
            Reporter: Stephen Albrecht


I found this issue in GrooCSS, an older library for writing CSS in Groovy with 
a DSL. It depends on Groovy 2.5.8 but using it with newer versions worked until 
5.0.1.

Possibly related to GROOVY-10800

example build.gradle dependencies

 
{code:java}
dependencies {
    implementation 'org.apache.groovy:groovy:4.0.28'
    implementation 'org.groocss:groocss:1.0-GA'
}{code}
This simple program outputs some CSS.

 

 
{code:java}
package org.example

import org.groocss.GrooCSS
import org.groocss.Selector

static void main(String[] args) {
    println GrooCSS.process {
        keyframes('fadeOutBackground') {
            0 % { backgroundColor blue }
        }
        a.foo {
            color red
        }
        Selector s = a % link
        s.foo {
            extend(a.foo)
        }
    }.toString()
} {code}
Output (Groovy 4.0.28)

 
{code:java}
a.foo,a:link.foo {
    color: Red;
}
@keyframes fadeOutBackground {
    0% {
        background-color: Blue;
    }
}@-webkit-keyframes fadeOutBackground {
    0% {
        background-color: Blue;
    }
}{code}
 

 

Updating to Groovy 5.0.1 breaks at runtime on the mod overload for keyframes

 
{code:java}
groovy.lang.MissingMethodException: No signature of method: remainder for 
class: java.lang.Integer is applicable for argument types: 
(org.example.Main$_main_closure1$_closure2$_closure5) values: 
[org.example.Main$_main_closure1$_closure2$_closure5@24fabd0f]
Possible solutions: remainder(java.lang.Number)
 at org.example.Main$_main_closure1$_closure2.doCall(Main.groovy:10)
 at org.groocss.GrooCSS.kf(GrooCSS.groovy:368)
 at org.groocss.GrooCSS.keyframes(GrooCSS.groovy:361)
 at org.example.Main$_main_closure1.doCall(Main.groovy:9) {code}
defined 
[here|https://github.com/adamldavis/groocss/blob/develop/src/main/groovy/org/groocss/ext/NumberExtension.groovy#L62]

 
{code:java}
class NumberExtension {
    // ... other overloads
    static KeyFrames mod(
        Integer n,
        @DelegatesTo(value=StyleGroup, strategy = Closure.DELEGATE_FIRST) 
Closure frameCl
    ) {
        def css = GrooCSS.threadLocalInstance.get()
        if (css) css.currentKf.frame(n, frameCl)
    }
}{code}
If you comment out the keyframes call, the result of `a % link` now returns 
null when it used to return a Selector object. That mod method is defined 
[here|https://github.com/adamldavis/groocss/blob/develop/src/main/groovy/org/groocss/Selector.groovy#L145]:

 
{code:java}
class Selector extends Selectable {
    // others
    Selector mod(PseudoClass pc) {
        new Selector("$value$pc", owner)
    }
}{code}
 

 

 

 

 



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

Reply via email to