This is an automated email from the ASF dual-hosted git repository. paulk pushed a commit to branch GROOVY_2_5_X in repository https://gitbox.apache.org/repos/asf/groovy.git
The following commit(s) were added to refs/heads/GROOVY_2_5_X by this push: new 0495ea1 Fix GROOVY-8966 fix NumberRange with getAt (port to 2_5_X) 0495ea1 is described below commit 0495ea1c6adf16f875c533a11b1974cde3f743b3 Author: Bo Zhang <zhangbo...@gmail.com> AuthorDate: Wed Jan 15 23:10:13 2020 +0800 Fix GROOVY-8966 fix NumberRange with getAt (port to 2_5_X) Previously, when a exclusive NumberRange constructed from non-int type (e.g. long) is used in List.getAt(), it will be incorrectly converted to inclusive. This commit fixes this issue by introducing a subListBorders() method to NumberRange, which is similar to IntRange. (cherry picked from commit a46c601eadf6b06a850a8a6e27dda8d35c7263d4) --- src/main/groovy/groovy/lang/IntRange.java | 4 ++++ src/main/groovy/groovy/lang/NumberRange.java | 15 +++++++++++++++ .../groovy/runtime/DefaultGroovyMethodsSupport.java | 6 +++++- src/test/groovy/bugs/groovy8966/Groovy8966.groovy | 17 +++++++++++++++++ 4 files changed, 41 insertions(+), 1 deletion(-) diff --git a/src/main/groovy/groovy/lang/IntRange.java b/src/main/groovy/groovy/lang/IntRange.java index 79a57b0..da11291 100644 --- a/src/main/groovy/groovy/lang/IntRange.java +++ b/src/main/groovy/groovy/lang/IntRange.java @@ -219,6 +219,10 @@ public class IntRange extends AbstractList<Integer> implements Range<Integer> { if (inclusive == null) { throw new IllegalStateException("Should not call subListBorders on a non-inclusive aware IntRange"); } + return subListBorders(from, to, inclusive, size); + } + + static RangeInfo subListBorders(int from, int to, boolean inclusive, int size) { int tempFrom = from; if (tempFrom < 0) { tempFrom += size; diff --git a/src/main/groovy/groovy/lang/NumberRange.java b/src/main/groovy/groovy/lang/NumberRange.java index 52ef856..7b9c0e3 100644 --- a/src/main/groovy/groovy/lang/NumberRange.java +++ b/src/main/groovy/groovy/lang/NumberRange.java @@ -21,6 +21,7 @@ package groovy.lang; import org.codehaus.groovy.runtime.InvokerHelper; import org.codehaus.groovy.runtime.IteratorClosureAdapter; +import org.codehaus.groovy.runtime.RangeInfo; import java.math.BigDecimal; import java.math.BigInteger; @@ -177,6 +178,20 @@ public class NumberRange extends AbstractList<Comparable> implements Range<Compa } /** + * A method for determining from and to information when using this IntRange to index an aggregate object of the specified size. + * Normally only used internally within Groovy but useful if adding range indexing support for your own aggregates. + * + * @param size the size of the aggregate being indexed + * @return the calculated range information (with 1 added to the to value, ready for providing to subList + */ + public RangeInfo subListBorders(int size) { + if (stepSize.intValue() != 1) { + throw new IllegalStateException("Step must be 1 when used by subList!"); + } + return IntRange.subListBorders(((Number) from).intValue(), ((Number) to).intValue(), inclusive, size); + } + + /** * For a NumberRange with step size 1, creates a new NumberRange with the same * <code>from</code> and <code>to</code> as this NumberRange * but with a step size of <code>stepSize</code>. diff --git a/src/main/java/org/codehaus/groovy/runtime/DefaultGroovyMethodsSupport.java b/src/main/java/org/codehaus/groovy/runtime/DefaultGroovyMethodsSupport.java index 3838fdc..afb3d81 100644 --- a/src/main/java/org/codehaus/groovy/runtime/DefaultGroovyMethodsSupport.java +++ b/src/main/java/org/codehaus/groovy/runtime/DefaultGroovyMethodsSupport.java @@ -20,6 +20,7 @@ package org.codehaus.groovy.runtime; import groovy.lang.EmptyRange; import groovy.lang.IntRange; +import groovy.lang.NumberRange; import groovy.lang.Range; import org.codehaus.groovy.runtime.typehandling.DefaultTypeTransformation; @@ -73,7 +74,10 @@ public class DefaultGroovyMethodsSupport { // helper method for getAt and putAt protected static RangeInfo subListBorders(int size, Range range) { if (range instanceof IntRange) { - return ((IntRange)range).subListBorders(size); + return ((IntRange) range).subListBorders(size); + } + if (range instanceof NumberRange) { + return ((NumberRange) range).subListBorders(size); } int from = normaliseIndex(DefaultTypeTransformation.intUnbox(range.getFrom()), size); int to = normaliseIndex(DefaultTypeTransformation.intUnbox(range.getTo()), size); diff --git a/src/test/groovy/bugs/groovy8966/Groovy8966.groovy b/src/test/groovy/bugs/groovy8966/Groovy8966.groovy new file mode 100644 index 0000000..bc65eab --- /dev/null +++ b/src/test/groovy/bugs/groovy8966/Groovy8966.groovy @@ -0,0 +1,17 @@ +package groovy.bugs.groovy8966 + +import groovy.transform.CompileStatic +import org.junit.Test + +@CompileStatic +final class Groovy8966 extends GroovyTestCase { + @Test + void test() { + assertScript ''' + def array = [0, 1, 2] + int a = 2 + long b = 3 + assert array[a..<b] == [2] + ''' + } +} \ No newline at end of file