diff --git a/compiler/frontend/src/jet/Ranges.jet b/compiler/frontend/src/jet/Ranges.jet index ee0635bf3a4..e4e3a01c092 100644 --- a/compiler/frontend/src/jet/Ranges.jet +++ b/compiler/frontend/src/jet/Ranges.jet @@ -13,8 +13,6 @@ public class IntRange(public val start : Int, public val size : Int) : Range, jet.ByteIterable { public final val isReversed: jet.Boolean public open override /*1*/ fun iterator(): jet.ByteIterator public final val iteratorStart: jet.Byte - public final fun minus(): jet.ByteRange public final val size: jet.Int public final val start: jet.Byte public final fun step(/*0*/ step: jet.Int): jet.ByteIterator @@ -220,7 +219,6 @@ public final class jet.CharRange : jet.Range, jet.CharIterable { public final val isReversed: jet.Boolean public open override /*1*/ fun iterator(): jet.CharIterator public final val iteratorStart: jet.Char - public final fun minus(): jet.CharRange public final val size: jet.Int public final val start: jet.Char public final fun step(/*0*/ step: jet.Int): jet.CharIterator @@ -323,7 +321,6 @@ public final class jet.DoubleRange : jet.Range { public open override /*1*/ fun contains(/*0*/ elem: jet.Double): jet.Boolean public final val end: jet.Double public final val isReversed: jet.Boolean - public final fun minus(): jet.DoubleRange public final val size: jet.Double public final val start: jet.Double public final fun step(/*0*/ step: jet.Double): jet.DoubleIterator @@ -511,7 +508,6 @@ public final class jet.FloatRange : jet.Range { public open override /*1*/ fun contains(/*0*/ elem: jet.Float): jet.Boolean public final val end: jet.Float public final val isReversed: jet.Boolean - public final fun minus(): jet.FloatRange public final val size: jet.Float public final val start: jet.Float public final fun step(/*0*/ step: jet.Float): jet.FloatIterator @@ -712,7 +708,6 @@ public final class jet.IntRange : jet.Range, jet.IntIterable { public final val isReversed: jet.Boolean public open override /*1*/ fun iterator(): jet.IntIterator public final val iteratorStart: jet.Int - public final fun minus(): jet.IntRange public final val size: jet.Int public final val start: jet.Int public final fun step(/*0*/ step: jet.Int): jet.IntIterator @@ -824,7 +819,6 @@ public final class jet.LongRange : jet.Range, jet.LongIterable { public final val isReversed: jet.Boolean public open override /*1*/ fun iterator(): jet.LongIterator public final val iteratorStart: jet.Long - public final fun minus(): jet.LongRange public final val size: jet.Long public final val start: jet.Long public final fun step(/*0*/ step: jet.Long): jet.LongIterator @@ -940,7 +934,6 @@ public final class jet.ShortRange : jet.Range, jet.ShortIterable { public final val isReversed: jet.Boolean public open override /*1*/ fun iterator(): jet.ShortIterator public final val iteratorStart: jet.Short - public final fun minus(): jet.ShortRange public final val size: jet.Int public final val start: jet.Short public final fun step(/*0*/ step: jet.Int): jet.ShortIterator diff --git a/compiler/testData/codegen/regressions/kt1076.kt b/compiler/testData/codegen/regressions/kt1076.kt index 971acf266da..918713f681f 100644 --- a/compiler/testData/codegen/regressions/kt1076.kt +++ b/compiler/testData/codegen/regressions/kt1076.kt @@ -4,7 +4,7 @@ fun box() : String { cnt++ } - for (n in -(1..5)) + for (n in (1..5).reversed) cnt++ return if(cnt == 9) "OK" else cnt.toString() diff --git a/libraries/stdlib/src/kotlin/Ranges.kt b/libraries/stdlib/src/kotlin/Ranges.kt new file mode 100644 index 00000000000..953c29873b1 --- /dev/null +++ b/libraries/stdlib/src/kotlin/Ranges.kt @@ -0,0 +1,23 @@ +package kotlin + +public val CharRange.reversed: CharRange + get() = CharRange(end, if (start < end) -size else size) + +public val ByteRange.reversed: ByteRange + get() = ByteRange(end, if (start < end) -size else size) + +public val ShortRange.reversed: ShortRange + get() = ShortRange(end, if (start < end) -size else size) + +public val IntRange.reversed: IntRange + get() = IntRange(end, if (start < end) -size else size) + +public val FloatRange.reversed: FloatRange + get() = FloatRange(end, if (start < end) -size else size) + +public val LongRange.reversed: LongRange + get() = LongRange(end, if (start < end) -size else size) + +public val DoubleRange.reversed: DoubleRange + get() = DoubleRange(end, if (start < end) -size else size) + diff --git a/libraries/stdlib/test/language/RangeTest.kt b/libraries/stdlib/test/language/RangeTest.kt index a31c1a08042..239a402f5dc 100644 --- a/libraries/stdlib/test/language/RangeTest.kt +++ b/libraries/stdlib/test/language/RangeTest.kt @@ -23,4 +23,23 @@ class RangeTest { assertTrue(range.contains(9)) assertFalse(range.contains(10)) } + + test fun reversedRanges() { + val intRange = 0..9 + val reversedIntRange = intRange.reversed + assertEquals(10, reversedIntRange.size) + assertEquals(9, reversedIntRange.start) + assertEquals(0, reversedIntRange.end) + assertEquals(intRange, reversedIntRange.reversed) + + val doubleRange = 0.0..9.0 + val reversedDoubleRange = doubleRange.reversed + assertEquals(9.0, reversedDoubleRange.size) + assertEquals(9.0, reversedDoubleRange.start) + assertEquals(0.0, reversedDoubleRange.end) + assertEquals(doubleRange, reversedDoubleRange.reversed) + + assertEquals(IntRange.EMPTY, IntRange.EMPTY.reversed) + assertEquals(FloatRange.EMPTY, FloatRange.EMPTY.reversed) + } } \ No newline at end of file diff --git a/runtime/src/jet/ByteRange.java b/runtime/src/jet/ByteRange.java index 10d5c3005e3..7a51037fd00 100644 --- a/runtime/src/jet/ByteRange.java +++ b/runtime/src/jet/ByteRange.java @@ -93,10 +93,6 @@ public final class ByteRange implements Range, ByteIterable { return new MyIterator(start, count, step); } - public ByteRange minus() { - return new ByteRange(getEnd(), -count); - } - @Override public ByteIterator iterator() { return new MyIterator(start, count, 1); diff --git a/runtime/src/jet/CharRange.java b/runtime/src/jet/CharRange.java index ae044bb5add..2059ceb7ade 100644 --- a/runtime/src/jet/CharRange.java +++ b/runtime/src/jet/CharRange.java @@ -86,10 +86,6 @@ public final class CharRange implements Range, CharIterable { return count < 0 ? -count : count; } - public CharRange minus() { - return new CharRange(getEnd(), -count); - } - public CharIterator step(int step) { if (step < 0) return new MyIterator(getEnd(), -count, -step); diff --git a/runtime/src/jet/DoubleRange.java b/runtime/src/jet/DoubleRange.java index 01bb39f361f..d38d841faf4 100644 --- a/runtime/src/jet/DoubleRange.java +++ b/runtime/src/jet/DoubleRange.java @@ -87,10 +87,6 @@ public final class DoubleRange implements Range { return size < 0 ? -size : size; } - public DoubleRange minus() { - return new DoubleRange(getEnd(), -size); - } - public static DoubleRange count(int length) { return new DoubleRange(0, length); } diff --git a/runtime/src/jet/FloatRange.java b/runtime/src/jet/FloatRange.java index 8962310deea..fb3af3a68b1 100644 --- a/runtime/src/jet/FloatRange.java +++ b/runtime/src/jet/FloatRange.java @@ -83,10 +83,6 @@ public final class FloatRange implements Range { return size < 0 ? -size : size; } - public FloatRange minus() { - return new FloatRange(getEnd(), -size); - } - public static FloatRange count(int length) { return new FloatRange(0, length); } diff --git a/runtime/src/jet/IntRange.java b/runtime/src/jet/IntRange.java index f73d7a8331a..2d84304fcfd 100644 --- a/runtime/src/jet/IntRange.java +++ b/runtime/src/jet/IntRange.java @@ -102,10 +102,6 @@ public final class IntRange implements Range, IntIterable { return count < 0 ? -count : count; } - public IntRange minus() { - return new IntRange(getEnd(), -count); - } - @Override public IntIterator iterator() { return new MyIterator(start, count, 1); diff --git a/runtime/src/jet/LongRange.java b/runtime/src/jet/LongRange.java index 114155d0123..3e03d9f95d8 100644 --- a/runtime/src/jet/LongRange.java +++ b/runtime/src/jet/LongRange.java @@ -93,10 +93,6 @@ public final class LongRange implements Range, LongIterable { return count < 0 ? -count : count; } - public LongRange minus() { - return new LongRange(getEnd(), -count); - } - @Override public LongIterator iterator() { return new MyIterator(start, count, 1); diff --git a/runtime/src/jet/ShortRange.java b/runtime/src/jet/ShortRange.java index d94206c0894..0cc3d603065 100644 --- a/runtime/src/jet/ShortRange.java +++ b/runtime/src/jet/ShortRange.java @@ -93,10 +93,6 @@ public final class ShortRange implements Range, ShortIterable { return count < 0 ? -count : count; } - public ShortRange minus() { - return new ShortRange(getEnd(), -count); - } - @Override public ShortIterator iterator() { return new MyIterator(start, count, 1);