From 3f4430087e391dcc3f96eaf3d7a8963c5b6e28e9 Mon Sep 17 00:00:00 2001 From: Ilya Gorbunov Date: Fri, 13 Nov 2015 06:00:38 +0300 Subject: [PATCH] Do not call deprecated public getProgressionFinalElement, call internal getProgressionLastElement instead. ProgressionIterators do not compute final element by themselves, but use one computed by Progression. Update testdata for LoadBuiltinsTest --- compiler/testData/builtin-classes.txt | 22 ++++---- .../src/kotlin/ProgressionIterators.kt | 48 ++++++++-------- core/builtins/src/kotlin/Progressions.kt | 12 ++-- .../src/kotlin/internal/progressionUtil.kt | 55 ++++++++++--------- .../builtins/progressionIterators.kt | 12 ++-- .../generators/builtins/progressions.kt | 4 +- 6 files changed, 78 insertions(+), 75 deletions(-) diff --git a/compiler/testData/builtin-classes.txt b/compiler/testData/builtin-classes.txt index 686c70000fd..dbb6afc3313 100644 --- a/compiler/testData/builtin-classes.txt +++ b/compiler/testData/builtin-classes.txt @@ -150,9 +150,9 @@ public abstract class ByteIterator : kotlin.Iterator { } internal final class ByteProgressionIterator : kotlin.ByteIterator { - /*primary*/ public constructor ByteProgressionIterator(/*0*/ start: kotlin.Byte, /*1*/ end: kotlin.Byte, /*2*/ increment: kotlin.Int) - private final val finalElement: kotlin.Byte - private final fun (): kotlin.Byte + /*primary*/ public constructor ByteProgressionIterator(/*0*/ first: kotlin.Byte, /*1*/ last: kotlin.Byte, /*2*/ increment: kotlin.Int) + private final val finalElement: kotlin.Int + private final fun (): kotlin.Int private final var hasNext: kotlin.Boolean private final fun (): kotlin.Boolean private final fun (/*0*/ : kotlin.Boolean): kotlin.Unit @@ -252,9 +252,9 @@ public open class CharProgression : kotlin.Progression { } internal final class CharProgressionIterator : kotlin.CharIterator { - /*primary*/ public constructor CharProgressionIterator(/*0*/ start: kotlin.Char, /*1*/ end: kotlin.Char, /*2*/ increment: kotlin.Int) - private final val finalElement: kotlin.Char - private final fun (): kotlin.Char + /*primary*/ public constructor CharProgressionIterator(/*0*/ first: kotlin.Char, /*1*/ last: kotlin.Char, /*2*/ increment: kotlin.Int) + private final val finalElement: kotlin.Int + private final fun (): kotlin.Int private final var hasNext: kotlin.Boolean private final fun (): kotlin.Boolean private final fun (/*0*/ : kotlin.Boolean): kotlin.Unit @@ -671,7 +671,7 @@ public open class IntProgression : kotlin.Progression { } internal final class IntProgressionIterator : kotlin.IntIterator { - /*primary*/ public constructor IntProgressionIterator(/*0*/ start: kotlin.Int, /*1*/ end: kotlin.Int, /*2*/ increment: kotlin.Int) + /*primary*/ public constructor IntProgressionIterator(/*0*/ first: kotlin.Int, /*1*/ last: kotlin.Int, /*2*/ increment: kotlin.Int) private final val finalElement: kotlin.Int private final fun (): kotlin.Int private final var hasNext: kotlin.Boolean @@ -861,7 +861,7 @@ public open class LongProgression : kotlin.Progression { } internal final class LongProgressionIterator : kotlin.LongIterator { - /*primary*/ public constructor LongProgressionIterator(/*0*/ start: kotlin.Long, /*1*/ end: kotlin.Long, /*2*/ increment: kotlin.Long) + /*primary*/ public constructor LongProgressionIterator(/*0*/ first: kotlin.Long, /*1*/ last: kotlin.Long, /*2*/ increment: kotlin.Long) private final val finalElement: kotlin.Long private final fun (): kotlin.Long private final var hasNext: kotlin.Boolean @@ -1186,9 +1186,9 @@ public abstract class ShortIterator : kotlin.Iterator { } internal final class ShortProgressionIterator : kotlin.ShortIterator { - /*primary*/ public constructor ShortProgressionIterator(/*0*/ start: kotlin.Short, /*1*/ end: kotlin.Short, /*2*/ increment: kotlin.Int) - private final val finalElement: kotlin.Short - private final fun (): kotlin.Short + /*primary*/ public constructor ShortProgressionIterator(/*0*/ first: kotlin.Short, /*1*/ last: kotlin.Short, /*2*/ increment: kotlin.Int) + private final val finalElement: kotlin.Int + private final fun (): kotlin.Int private final var hasNext: kotlin.Boolean private final fun (): kotlin.Boolean private final fun (/*0*/ : kotlin.Boolean): kotlin.Unit diff --git a/core/builtins/src/kotlin/ProgressionIterators.kt b/core/builtins/src/kotlin/ProgressionIterators.kt index 0347d4be818..5a532a64c5e 100644 --- a/core/builtins/src/kotlin/ProgressionIterators.kt +++ b/core/builtins/src/kotlin/ProgressionIterators.kt @@ -18,22 +18,20 @@ package kotlin -import kotlin.internal.getProgressionFinalElement - /** * An iterator over a progression of values of type `Byte`. * @property increment the number by which the value is incremented on each step. */ -internal class ByteProgressionIterator(start: Byte, end: Byte, val increment: Int) : ByteIterator() { - private var next = start.toInt() - private val finalElement: Byte = getProgressionFinalElement(start.toInt(), end.toInt(), increment).toByte() - private var hasNext: Boolean = if (increment > 0) start <= end else start >= end +internal class ByteProgressionIterator(first: Byte, last: Byte, val increment: Int) : ByteIterator() { + private var next = first.toInt() + private val finalElement = last.toInt() + private var hasNext: Boolean = if (increment > 0) first <= last else first >= last override fun hasNext(): Boolean = hasNext override fun nextByte(): Byte { val value = next - if (value == finalElement.toInt()) { + if (value == finalElement) { hasNext = false } else { @@ -47,16 +45,16 @@ internal class ByteProgressionIterator(start: Byte, end: Byte, val increment: In * An iterator over a progression of values of type `Char`. * @property increment the number by which the value is incremented on each step. */ -internal class CharProgressionIterator(start: Char, end: Char, val increment: Int) : CharIterator() { - private var next = start.toInt() - private val finalElement: Char = getProgressionFinalElement(start.toInt(), end.toInt(), increment).toChar() - private var hasNext: Boolean = if (increment > 0) start <= end else start >= end +internal class CharProgressionIterator(first: Char, last: Char, val increment: Int) : CharIterator() { + private var next = first.toInt() + private val finalElement = last.toInt() + private var hasNext: Boolean = if (increment > 0) first <= last else first >= last override fun hasNext(): Boolean = hasNext override fun nextChar(): Char { val value = next - if (value == finalElement.toInt()) { + if (value == finalElement) { hasNext = false } else { @@ -70,16 +68,16 @@ internal class CharProgressionIterator(start: Char, end: Char, val increment: In * An iterator over a progression of values of type `Short`. * @property increment the number by which the value is incremented on each step. */ -internal class ShortProgressionIterator(start: Short, end: Short, val increment: Int) : ShortIterator() { - private var next = start.toInt() - private val finalElement: Short = getProgressionFinalElement(start.toInt(), end.toInt(), increment).toShort() - private var hasNext: Boolean = if (increment > 0) start <= end else start >= end +internal class ShortProgressionIterator(first: Short, last: Short, val increment: Int) : ShortIterator() { + private var next = first.toInt() + private val finalElement = last.toInt() + private var hasNext: Boolean = if (increment > 0) first <= last else first >= last override fun hasNext(): Boolean = hasNext override fun nextShort(): Short { val value = next - if (value == finalElement.toInt()) { + if (value == finalElement) { hasNext = false } else { @@ -93,10 +91,10 @@ internal class ShortProgressionIterator(start: Short, end: Short, val increment: * An iterator over a progression of values of type `Int`. * @property increment the number by which the value is incremented on each step. */ -internal class IntProgressionIterator(start: Int, end: Int, val increment: Int) : IntIterator() { - private var next = start - private val finalElement: Int = getProgressionFinalElement(start, end, increment) - private var hasNext: Boolean = if (increment > 0) start <= end else start >= end +internal class IntProgressionIterator(first: Int, last: Int, val increment: Int) : IntIterator() { + private var next = first + private val finalElement = last + private var hasNext: Boolean = if (increment > 0) first <= last else first >= last override fun hasNext(): Boolean = hasNext @@ -116,10 +114,10 @@ internal class IntProgressionIterator(start: Int, end: Int, val increment: Int) * An iterator over a progression of values of type `Long`. * @property increment the number by which the value is incremented on each step. */ -internal class LongProgressionIterator(start: Long, end: Long, val increment: Long) : LongIterator() { - private var next = start - private val finalElement: Long = getProgressionFinalElement(start, end, increment) - private var hasNext: Boolean = if (increment > 0) start <= end else start >= end +internal class LongProgressionIterator(first: Long, last: Long, val increment: Long) : LongIterator() { + private var next = first + private val finalElement = last + private var hasNext: Boolean = if (increment > 0) first <= last else first >= last override fun hasNext(): Boolean = hasNext diff --git a/core/builtins/src/kotlin/Progressions.kt b/core/builtins/src/kotlin/Progressions.kt index bc263ddc279..3bd29d25679 100644 --- a/core/builtins/src/kotlin/Progressions.kt +++ b/core/builtins/src/kotlin/Progressions.kt @@ -18,6 +18,8 @@ package kotlin +import kotlin.internal.getProgressionLastElement + @Deprecated("Use IntProgression instead.", ReplaceWith("IntProgression"), level = DeprecationLevel.WARNING) /** * A progression of values of type `Byte`. @@ -41,7 +43,7 @@ public open class ByteProgression /** * The last element in the progression. */ - public val last: Byte = kotlin.internal.getProgressionFinalElement(start.toInt(), endInclusive.toInt(), increment).toByte() + public val last: Byte = getProgressionLastElement(start.toInt(), endInclusive.toInt(), increment).toByte() @Deprecated("Use first instead.", ReplaceWith("first")) public override val start: Byte get() = first @@ -99,7 +101,7 @@ public open class CharProgression /** * The last element in the progression. */ - public val last: Char = kotlin.internal.getProgressionFinalElement(start.toInt(), endInclusive.toInt(), increment).toChar() + public val last: Char = getProgressionLastElement(start.toInt(), endInclusive.toInt(), increment).toChar() @Deprecated("Use first instead.", ReplaceWith("first")) public override val start: Char get() = first @@ -158,7 +160,7 @@ public open class ShortProgression /** * The last element in the progression. */ - public val last: Short = kotlin.internal.getProgressionFinalElement(start.toInt(), endInclusive.toInt(), increment).toShort() + public val last: Short = getProgressionLastElement(start.toInt(), endInclusive.toInt(), increment).toShort() @Deprecated("Use first instead.", ReplaceWith("first")) public override val start: Short get() = first @@ -216,7 +218,7 @@ public open class IntProgression /** * The last element in the progression. */ - public val last: Int = kotlin.internal.getProgressionFinalElement(start.toInt(), endInclusive.toInt(), increment).toInt() + public val last: Int = getProgressionLastElement(start.toInt(), endInclusive.toInt(), increment).toInt() @Deprecated("Use first instead.", ReplaceWith("first")) public override val start: Int get() = first @@ -274,7 +276,7 @@ public open class LongProgression /** * The last element in the progression. */ - public val last: Long = kotlin.internal.getProgressionFinalElement(start.toLong(), endInclusive.toLong(), increment).toLong() + public val last: Long = getProgressionLastElement(start.toLong(), endInclusive.toLong(), increment).toLong() @Deprecated("Use first instead.", ReplaceWith("first")) public override val start: Long get() = first diff --git a/core/builtins/src/kotlin/internal/progressionUtil.kt b/core/builtins/src/kotlin/internal/progressionUtil.kt index 2ad25ef006b..36ad5f6be7d 100644 --- a/core/builtins/src/kotlin/internal/progressionUtil.kt +++ b/core/builtins/src/kotlin/internal/progressionUtil.kt @@ -37,31 +37,8 @@ private fun differenceModulo(a: Long, b: Long, c: Long): Long { } -/** - * Calculates the final element of a bounded arithmetic progression, i.e. the last element of the progression which is in the range - * from [start] to [end] in case of a positive [increment], or from [end] to [start] in case of a negative - * increment. - * - * No validation on passed parameters is performed. The given parameters should satisfy the condition: either - * `increment > 0` and `start >= end`, or `increment < 0` and`start >= end`. - * @param start first element of the progression - * @param end ending bound for the progression - * @param increment increment, or difference of successive elements in the progression - * @return the final element of the progression - * @suppress - */ @Deprecated("This function supports the compiler infrastructure and is not intended to be used directly from user code. It may become internal soon.") -public fun getProgressionFinalElement(start: Int, end: Int, increment: Int): Int { - if (increment > 0) { - return end - differenceModulo(end, start, increment) - } - else if (increment < 0) { - return end + differenceModulo(start, end, -increment) - } - else { - throw IllegalArgumentException("Increment is zero.") - } -} +public fun getProgressionFinalElement(start: Int, end: Int, increment: Int): Int = getProgressionLastElement(start, end, increment) /** * Calculates the final element of a bounded arithmetic progression, i.e. the last element of the progression which is in the range @@ -76,8 +53,34 @@ public fun getProgressionFinalElement(start: Int, end: Int, increment: Int): Int * @return the final element of the progression * @suppress */ -@Deprecated("This function supports the compiler infrastructure and is not intended to be used directly from user code. It may become internal soon.") -public fun getProgressionFinalElement(start: Long, end: Long, increment: Long): Long { +internal fun getProgressionLastElement(start: Int, end: Int, increment: Int): Int { + if (increment > 0) { + return end - differenceModulo(end, start, increment) + } + else if (increment < 0) { + return end + differenceModulo(start, end, -increment) + } + else { + throw IllegalArgumentException("Increment is zero.") + } +} + +@Deprecated("This function supports the compiler infrastructure and is not intended to be used directly from user code. It may become internal soon.") +public fun getProgressionFinalElement(start: Long, end: Long, increment: Long): Long = getProgressionLastElement(start, end, increment) +/** + * Calculates the final element of a bounded arithmetic progression, i.e. the last element of the progression which is in the range + * from [start] to [end] in case of a positive [increment], or from [end] to [start] in case of a negative + * increment. + * + * No validation on passed parameters is performed. The given parameters should satisfy the condition: either + * `increment > 0` and `start >= end`, or `increment < 0` and`start >= end`. + * @param start first element of the progression + * @param end ending bound for the progression + * @param increment increment, or difference of successive elements in the progression + * @return the final element of the progression + * @suppress + */ +internal fun getProgressionLastElement(start: Long, end: Long, increment: Long): Long { if (increment > 0) { return end - differenceModulo(end, start, increment) } diff --git a/generators/src/org/jetbrains/kotlin/generators/builtins/progressionIterators.kt b/generators/src/org/jetbrains/kotlin/generators/builtins/progressionIterators.kt index 226c14266db..90fb3d264fe 100644 --- a/generators/src/org/jetbrains/kotlin/generators/builtins/progressionIterators.kt +++ b/generators/src/org/jetbrains/kotlin/generators/builtins/progressionIterators.kt @@ -35,16 +35,16 @@ fun integerProgressionIterator(kind: ProgressionKind): String { * An iterator over a progression of values of type `$t`. * @property increment the number by which the value is incremented on each step. */ -internal class ${t}ProgressionIterator(start: $t, end: $t, val increment: $incrementType) : ${t}Iterator() { - private var next = start$toInt - private val finalElement: $t = getProgressionFinalElement(start$toInt, end$toInt, increment)$toType - private var hasNext: Boolean = if (increment > 0) start <= end else start >= end +internal class ${t}ProgressionIterator(first: $t, last: $t, val increment: $incrementType) : ${t}Iterator() { + private var next = first$toInt + private val finalElement = last$toInt + private var hasNext: Boolean = if (increment > 0) first <= last else first >= last override fun hasNext(): Boolean = hasNext override fun next$t(): $t { val value = next - if (value == finalElement$toInt) { + if (value == finalElement) { hasNext = false } else { @@ -77,8 +77,6 @@ internal class ${t}ProgressionIterator(start: $t, val end: $t, val increment: $t class GenerateProgressionIterators(out: PrintWriter) : BuiltInsSourceGenerator(out) { override fun generateBody() { - out.println("import kotlin.internal.getProgressionFinalElement") - out.println() for (kind in ProgressionKind.values()) { if (kind != FLOAT && kind != DOUBLE) { out.println(integerProgressionIterator(kind)) diff --git a/generators/src/org/jetbrains/kotlin/generators/builtins/progressions.kt b/generators/src/org/jetbrains/kotlin/generators/builtins/progressions.kt index 8813ff1bfd6..bab0f574fd9 100644 --- a/generators/src/org/jetbrains/kotlin/generators/builtins/progressions.kt +++ b/generators/src/org/jetbrains/kotlin/generators/builtins/progressions.kt @@ -74,7 +74,7 @@ public open class $progression /** * The last element in the progression. */ - public val last: $t = kotlin.internal.getProgressionFinalElement(start.to$incrementType(), endInclusive.to$incrementType(), increment).to$t() + public val last: $t = getProgressionLastElement(start.to$incrementType(), endInclusive.to$incrementType(), increment).to$t() @Deprecated("Use first instead.", ReplaceWith("first")) public override val start: $t get() = first @@ -182,6 +182,8 @@ public open class $progression( } override fun generateBody() { + out.println("import kotlin.internal.getProgressionLastElement") + out.println() for (kind in ProgressionKind.values) { if (kind == FLOAT || kind == DOUBLE) continue