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)