New J2K: convert vararg type parameter Java length call to Kotlin size call

This commit is contained in:
Ilya Kirillov
2019-06-10 10:03:36 +03:00
parent b211ae1070
commit 2aa20d003d
4 changed files with 26 additions and 2 deletions
@@ -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<JKFieldAccessExpression>()
?.identifier
.safeAs<JKUniverseFieldSymbol>()
?.target
?.safeAs<JKParameter>()
return parameter?.isVarArgs == true
}
}
+4
View File
@@ -0,0 +1,4 @@
//method
int nya(Object... objs) {
return objs.length;
}
+3
View File
@@ -0,0 +1,3 @@
fun nya(vararg objs: Any?): Int {
return objs.size
}
@@ -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")