From 2aa20d003d71a10494316bae8b16804e2c05a872 Mon Sep 17 00:00:00 2001 From: Ilya Kirillov Date: Mon, 10 Jun 2019 10:03:36 +0300 Subject: [PATCH] New J2K: convert vararg type parameter Java length call to Kotlin size call --- .../conversions/ArrayOperationsConversion.kt | 16 ++++++++++++++-- .../newJ2k/varArg/varargLengthAccess.java | 4 ++++ .../testData/newJ2k/varArg/varargLengthAccess.kt | 3 +++ ...ToKotlinConverterSingleFileTestGenerated.java | 5 +++++ 4 files changed, 26 insertions(+), 2 deletions(-) create mode 100644 nj2k/testData/newJ2k/varArg/varargLengthAccess.java create mode 100644 nj2k/testData/newJ2k/varArg/varargLengthAccess.kt diff --git a/nj2k/src/org/jetbrains/kotlin/nj2k/conversions/ArrayOperationsConversion.kt b/nj2k/src/org/jetbrains/kotlin/nj2k/conversions/ArrayOperationsConversion.kt index 2af9aa840b2..70bf89c95ba 100644 --- a/nj2k/src/org/jetbrains/kotlin/nj2k/conversions/ArrayOperationsConversion.kt +++ b/nj2k/src/org/jetbrains/kotlin/nj2k/conversions/ArrayOperationsConversion.kt @@ -13,14 +13,15 @@ package org.jetbrains.kotlin.nj2k.conversions import org.jetbrains.kotlin.nj2k.NewJ2kConverterContext import org.jetbrains.kotlin.nj2k.tree.* import org.jetbrains.kotlin.nj2k.tree.impl.JKFieldAccessExpressionImpl +import org.jetbrains.kotlin.nj2k.tree.impl.JKUniverseFieldSymbol +import org.jetbrains.kotlin.utils.addToStdlib.safeAs class ArrayOperationsConversion(private val context: NewJ2kConverterContext) : RecursiveApplicableConversionBase() { override fun applyToElement(element: JKTreeElement): JKTreeElement { if (element !is JKQualifiedExpression) return recurse(element) val selector = element.selector as? JKFieldAccessExpression ?: return recurse(element) - if (element.receiver.type(context.symbolProvider) !is JKJavaArrayType) return recurse(element) - if (selector.identifier.name == "length") { + if (element.receiver.isArrayOrVarargTypeParameter() && selector.identifier.name == "length") { val sizeCall = JKFieldAccessExpressionImpl( context.symbolProvider.provideFieldSymbol("kotlin.Array.size") @@ -29,4 +30,15 @@ class ArrayOperationsConversion(private val context: NewJ2kConverterContext) : R } return recurse(element) } + + private fun JKExpression.isArrayOrVarargTypeParameter(): Boolean { + if (type(context.symbolProvider) is JKJavaArrayType) return true + val parameter = + safeAs() + ?.identifier + .safeAs() + ?.target + ?.safeAs() + return parameter?.isVarArgs == true + } } \ No newline at end of file diff --git a/nj2k/testData/newJ2k/varArg/varargLengthAccess.java b/nj2k/testData/newJ2k/varArg/varargLengthAccess.java new file mode 100644 index 00000000000..7e11682c34e --- /dev/null +++ b/nj2k/testData/newJ2k/varArg/varargLengthAccess.java @@ -0,0 +1,4 @@ +//method +int nya(Object... objs) { + return objs.length; +} \ No newline at end of file diff --git a/nj2k/testData/newJ2k/varArg/varargLengthAccess.kt b/nj2k/testData/newJ2k/varArg/varargLengthAccess.kt new file mode 100644 index 00000000000..00f91f7b0d0 --- /dev/null +++ b/nj2k/testData/newJ2k/varArg/varargLengthAccess.kt @@ -0,0 +1,3 @@ +fun nya(vararg objs: Any?): Int { + return objs.size +} \ No newline at end of file diff --git a/nj2k/tests/org/jetbrains/kotlin/nj2k/NewJavaToKotlinConverterSingleFileTestGenerated.java b/nj2k/tests/org/jetbrains/kotlin/nj2k/NewJavaToKotlinConverterSingleFileTestGenerated.java index 284812cbf85..e673cbe54be 100644 --- a/nj2k/tests/org/jetbrains/kotlin/nj2k/NewJavaToKotlinConverterSingleFileTestGenerated.java +++ b/nj2k/tests/org/jetbrains/kotlin/nj2k/NewJavaToKotlinConverterSingleFileTestGenerated.java @@ -4744,6 +4744,11 @@ public class NewJavaToKotlinConverterSingleFileTestGenerated extends AbstractNew public void testEllipsisTypeSingleParams() throws Exception { runTest("nj2k/testData/newJ2k/varArg/ellipsisTypeSingleParams.java"); } + + @TestMetadata("varargLengthAccess.java") + public void testVarargLengthAccess() throws Exception { + runTest("nj2k/testData/newJ2k/varArg/varargLengthAccess.java"); + } } @TestMetadata("nj2k/testData/newJ2k/whileStatement")