New J2K: convert vararg type parameter Java length call to Kotlin size call
This commit is contained in:
@@ -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
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,4 @@
|
||||
//method
|
||||
int nya(Object... objs) {
|
||||
return objs.length;
|
||||
}
|
||||
@@ -0,0 +1,3 @@
|
||||
fun nya(vararg objs: Any?): Int {
|
||||
return objs.size
|
||||
}
|
||||
+5
@@ -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")
|
||||
|
||||
Reference in New Issue
Block a user