From ceb2aa57f982dc0df2f855b5738b60e281b35014 Mon Sep 17 00:00:00 2001 From: Ilya Ryzhenkov Date: Wed, 5 Mar 2014 20:12:24 +0400 Subject: [PATCH] Make two overloads of copyOf to preserve nullness when size doesn't change --- libraries/stdlib/src/generated/_SpecialJVM.kt | 101 ++++++++++++++---- .../src/templates/SpecialJVM.kt | 21 +++- 2 files changed, 99 insertions(+), 23 deletions(-) diff --git a/libraries/stdlib/src/generated/_SpecialJVM.kt b/libraries/stdlib/src/generated/_SpecialJVM.kt index 0e64af296fa..292c6b9238e 100644 --- a/libraries/stdlib/src/generated/_SpecialJVM.kt +++ b/libraries/stdlib/src/generated/_SpecialJVM.kt @@ -64,65 +64,128 @@ public fun ShortArray.binarySearch(element: Short, fromIndex: Int = 0, toIndex: } /** - * Returns new array which is a copy of the riginal array + * Returns new array which is a copy of the original array */ -public fun Array.copyOf(newSize: Int = size) : Array { - return Arrays.copyOf(this, newSize) as Array +public fun Array.copyOf() : Array { + return Arrays.copyOf(this, size) as Array } /** - * Returns new array which is a copy of the riginal array + * Returns new array which is a copy of the original array */ -public fun BooleanArray.copyOf(newSize: Int = size) : BooleanArray { +public fun BooleanArray.copyOf() : BooleanArray { + return Arrays.copyOf(this, size) +} + +/** + * Returns new array which is a copy of the original array + */ +public fun ByteArray.copyOf() : ByteArray { + return Arrays.copyOf(this, size) +} + +/** + * Returns new array which is a copy of the original array + */ +public fun CharArray.copyOf() : CharArray { + return Arrays.copyOf(this, size) +} + +/** + * Returns new array which is a copy of the original array + */ +public fun DoubleArray.copyOf() : DoubleArray { + return Arrays.copyOf(this, size) +} + +/** + * Returns new array which is a copy of the original array + */ +public fun FloatArray.copyOf() : FloatArray { + return Arrays.copyOf(this, size) +} + +/** + * Returns new array which is a copy of the original array + */ +public fun IntArray.copyOf() : IntArray { + return Arrays.copyOf(this, size) +} + +/** + * Returns new array which is a copy of the original array + */ +public fun LongArray.copyOf() : LongArray { + return Arrays.copyOf(this, size) +} + +/** + * Returns new array which is a copy of the original array + */ +public fun ShortArray.copyOf() : ShortArray { + return Arrays.copyOf(this, size) +} + +/** + * Returns new array which is a copy of the original array + */ +public fun Array.copyOf(newSize: Int) : Array { + return Arrays.copyOf(this, newSize) as Array +} + +/** + * Returns new array which is a copy of the original array + */ +public fun BooleanArray.copyOf(newSize: Int) : BooleanArray { return Arrays.copyOf(this, newSize) } /** - * Returns new array which is a copy of the riginal array + * Returns new array which is a copy of the original array */ -public fun ByteArray.copyOf(newSize: Int = size) : ByteArray { +public fun ByteArray.copyOf(newSize: Int) : ByteArray { return Arrays.copyOf(this, newSize) } /** - * Returns new array which is a copy of the riginal array + * Returns new array which is a copy of the original array */ -public fun CharArray.copyOf(newSize: Int = size) : CharArray { +public fun CharArray.copyOf(newSize: Int) : CharArray { return Arrays.copyOf(this, newSize) } /** - * Returns new array which is a copy of the riginal array + * Returns new array which is a copy of the original array */ -public fun DoubleArray.copyOf(newSize: Int = size) : DoubleArray { +public fun DoubleArray.copyOf(newSize: Int) : DoubleArray { return Arrays.copyOf(this, newSize) } /** - * Returns new array which is a copy of the riginal array + * Returns new array which is a copy of the original array */ -public fun FloatArray.copyOf(newSize: Int = size) : FloatArray { +public fun FloatArray.copyOf(newSize: Int) : FloatArray { return Arrays.copyOf(this, newSize) } /** - * Returns new array which is a copy of the riginal array + * Returns new array which is a copy of the original array */ -public fun IntArray.copyOf(newSize: Int = size) : IntArray { +public fun IntArray.copyOf(newSize: Int) : IntArray { return Arrays.copyOf(this, newSize) } /** - * Returns new array which is a copy of the riginal array + * Returns new array which is a copy of the original array */ -public fun LongArray.copyOf(newSize: Int = size) : LongArray { +public fun LongArray.copyOf(newSize: Int) : LongArray { return Arrays.copyOf(this, newSize) } /** - * Returns new array which is a copy of the riginal array + * Returns new array which is a copy of the original array */ -public fun ShortArray.copyOf(newSize: Int = size) : ShortArray { +public fun ShortArray.copyOf(newSize: Int) : ShortArray { return Arrays.copyOf(this, newSize) } diff --git a/libraries/tools/kotlin-stdlib-gen/src/templates/SpecialJVM.kt b/libraries/tools/kotlin-stdlib-gen/src/templates/SpecialJVM.kt index abef658b432..b670749f4e5 100644 --- a/libraries/tools/kotlin-stdlib-gen/src/templates/SpecialJVM.kt +++ b/libraries/tools/kotlin-stdlib-gen/src/templates/SpecialJVM.kt @@ -14,16 +14,29 @@ fun specialJVM(): List { } } - // TODO: when newLength is larger than size, we can get null items - templates add f("copyOf(newSize: Int = size)") { + templates add f("copyOf()") { only(ArraysOfObjects, ArraysOfPrimitives) - doc { "Returns new array which is a copy of the riginal array" } + doc { "Returns new array which is a copy of the original array" } + returns("SELF") + body { + "return Arrays.copyOf(this, size)" + } + body(ArraysOfObjects) { + "return Arrays.copyOf(this, size) as Array" + } + } + + // This overload can cause nulls if array size is expanding, hence different return overload + templates add f("copyOf(newSize: Int)") { + only(ArraysOfObjects, ArraysOfPrimitives) + doc { "Returns new array which is a copy of the original array" } returns("SELF") body { "return Arrays.copyOf(this, newSize)" } + returns(ArraysOfObjects) { "Array" } body(ArraysOfObjects) { - "return Arrays.copyOf(this, newSize) as Array" + "return Arrays.copyOf(this, newSize) as Array" } }