[
https://issues.apache.org/jira/browse/GROOVY-11761?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel
]
Stephen Albrecht resolved GROOVY-11761.
---------------------------------------
Resolution: Not A Problem
Expected behavior
> mod overloads in older Groovy library fail 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
> Priority: Major
>
> 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 mentioned in release notes: "In Groovy 5,
> operator overloading for {{%}} is now handled by the {{remainder}} method.
> Fallback behavior is supported and workarounds exist for folks already using
> the {{mod}} method."
> 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)