From b67f1571a511a13d2f377fa2654e2a4f58522259 Mon Sep 17 00:00:00 2001 From: Alexey Belkov Date: Thu, 25 May 2023 15:20:07 +0400 Subject: [PATCH] [kotlin] J2K: don't convert some Java methods to Kotlin equivalents Avoid conversions that can change program semantics (for example, by throwing exceptions for some kinds of arguments). ^KTIJ-6060 ^KTIJ-25309 GitOrigin-RevId: 6a6f881b5bc590fac84a4decac2a42b80df7617b --- .../nj2k/conversions/BuiltinMembersConversion.kt | 11 ----------- .../new/tests/testData/newJ2k/collections/Arrays.java | 4 ++-- .../new/tests/testData/newJ2k/collections/Arrays.kt | 6 +++--- .../testData/newJ2k/function/mathStaticMethods.java | 1 + .../testData/newJ2k/function/mathStaticMethods.kt | 7 +++---- 5 files changed, 9 insertions(+), 20 deletions(-) diff --git a/plugins/kotlin/j2k/new/src/org/jetbrains/kotlin/nj2k/conversions/BuiltinMembersConversion.kt b/plugins/kotlin/j2k/new/src/org/jetbrains/kotlin/nj2k/conversions/BuiltinMembersConversion.kt index 270cc2df64bb..100c49a5151b 100644 --- a/plugins/kotlin/j2k/new/src/org/jetbrains/kotlin/nj2k/conversions/BuiltinMembersConversion.kt +++ b/plugins/kotlin/j2k/new/src/org/jetbrains/kotlin/nj2k/conversions/BuiltinMembersConversion.kt @@ -611,8 +611,6 @@ private class ConversionsHolder(private val symbolProvider: JKSymbolProvider, pr private val arrayConversions: List = listOf( Method("java.util.Arrays.copyOf") convertTo ExtensionMethod("kotlin.collections.copyOf") withReplaceType REPLACE_WITH_QUALIFIER withByArgumentsFilter { it.size == 2 }, - Method("java.util.Arrays.copyOfRange") convertTo ExtensionMethod("kotlin.collections.copyOfRange") withReplaceType REPLACE_WITH_QUALIFIER - withByArgumentsFilter { it.size == 3 }, Method("java.util.Arrays.equals") convertTo ExtensionMethod("kotlin.collections.contentEquals") withReplaceType REPLACE_WITH_QUALIFIER withByArgumentsFilter { it.size == 2 }, Method("java.util.Arrays.deepEquals") convertTo ExtensionMethod("kotlin.collections.contentDeepEquals") withReplaceType REPLACE_WITH_QUALIFIER @@ -659,15 +657,6 @@ private class ConversionsHolder(private val symbolProvider: JKSymbolProvider, pr Method("java.lang.Math.nextUp") convertTo ExtensionMethod("kotlin.math.nextUp") withReplaceType REPLACE_WITH_QUALIFIER, Method("java.lang.Math.pow") convertTo ExtensionMethod("kotlin.math.pow") withReplaceType REPLACE_WITH_QUALIFIER, Method("java.lang.Math.rint") convertTo Method("kotlin.math.round") withReplaceType REPLACE_WITH_QUALIFIER, - - Method("java.lang.Math.round") convertTo CustomExpression { expression: JKExpression -> - val arguments = (expression as JKCallExpression).arguments - if (arguments.arguments.isEmpty()) return@CustomExpression expression - val firstArgument = arguments.arguments[0]::value.detached() - val method = if (firstArgument.isDoubleType()) "roundToLong" else "roundToInt" - firstArgument.callOn(symbolProvider.provideMethodSymbol("kotlin.math.$method")).withFormattingFrom(expression) - } withReplaceType REPLACE_WITH_QUALIFIER, - Method("java.lang.Math.signum") convertTo Method("kotlin.math.sign") withReplaceType REPLACE_WITH_QUALIFIER, Method("java.lang.Math.sin") convertTo Method("kotlin.math.sin") withReplaceType REPLACE_WITH_QUALIFIER, Method("java.lang.Math.sinh") convertTo Method("kotlin.math.sinh") withReplaceType REPLACE_WITH_QUALIFIER, diff --git a/plugins/kotlin/j2k/new/tests/testData/newJ2k/collections/Arrays.java b/plugins/kotlin/j2k/new/tests/testData/newJ2k/collections/Arrays.java index 31353446514d..2b21a803cce3 100644 --- a/plugins/kotlin/j2k/new/tests/testData/newJ2k/collections/Arrays.java +++ b/plugins/kotlin/j2k/new/tests/testData/newJ2k/collections/Arrays.java @@ -4,9 +4,9 @@ public class J { void foo(Object[] a) { Arrays.copyOf(a, 5); Arrays.copyOf(a, 5, Object[].class); // not applicable - // + // Don't convert copyOfRange, because Kotlin's copyOfRange can throw IndexOutOfBoundsException Arrays.copyOfRange(a, 5, 6); - Arrays.copyOfRange(a, 5, 6, Object[].class); // not applicable + Arrays.copyOfRange(a, 5, 6, Object[].class); // Arrays.equals(a, a); Arrays.deepEquals(a, a); diff --git a/plugins/kotlin/j2k/new/tests/testData/newJ2k/collections/Arrays.kt b/plugins/kotlin/j2k/new/tests/testData/newJ2k/collections/Arrays.kt index cbfe1a56a8aa..0cb149f8754e 100644 --- a/plugins/kotlin/j2k/new/tests/testData/newJ2k/collections/Arrays.kt +++ b/plugins/kotlin/j2k/new/tests/testData/newJ2k/collections/Arrays.kt @@ -4,9 +4,9 @@ class J { fun foo(a: Array) { a.copyOf(5) Arrays.copyOf(a, 5, Array::class.java) // not applicable - // - a.copyOfRange(5, 6) - Arrays.copyOfRange(a, 5, 6, Array::class.java) // not applicable + // Don't convert copyOfRange, because Kotlin's copyOfRange can throw IndexOutOfBoundsException + Arrays.copyOfRange(a, 5, 6) + Arrays.copyOfRange(a, 5, 6, Array::class.java) // a.contentEquals(a) a.contentDeepEquals(a) diff --git a/plugins/kotlin/j2k/new/tests/testData/newJ2k/function/mathStaticMethods.java b/plugins/kotlin/j2k/new/tests/testData/newJ2k/function/mathStaticMethods.java index 4beaf3936c8a..219d543ed86b 100644 --- a/plugins/kotlin/j2k/new/tests/testData/newJ2k/function/mathStaticMethods.java +++ b/plugins/kotlin/j2k/new/tests/testData/newJ2k/function/mathStaticMethods.java @@ -26,6 +26,7 @@ public class J { Math.nextUp(x); Math.pow(x, y); Math.rint(x); + // Don't convert `Math.round` calls, because Kotlin's `round` throws an exception for a NaN argument Math.round(x); Math.round(f); Math.signum(x); diff --git a/plugins/kotlin/j2k/new/tests/testData/newJ2k/function/mathStaticMethods.kt b/plugins/kotlin/j2k/new/tests/testData/newJ2k/function/mathStaticMethods.kt index 0896d9a7e5ce..cc590be01879 100644 --- a/plugins/kotlin/j2k/new/tests/testData/newJ2k/function/mathStaticMethods.kt +++ b/plugins/kotlin/j2k/new/tests/testData/newJ2k/function/mathStaticMethods.kt @@ -4,8 +4,6 @@ // ERROR: Unresolved reference: nextDown // ERROR: Unresolved reference: nextUp // ERROR: Unresolved reference: pow -// ERROR: Unresolved reference: roundToLong -// ERROR: Unresolved reference: roundToInt import kotlin.math.abs import kotlin.math.acos import kotlin.math.asin @@ -60,8 +58,9 @@ class J { x.nextUp() x.pow(y) round(x) - x.roundToLong() - f.roundToInt() + // Don't convert `Math.round` calls, because Kotlin's `round` throws an exception for a NaN argument + Math.round(x) + Math.round(f) sign(x) sin(x) sinh(x)