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.NewJ2kConverterContext
|
||||||
import org.jetbrains.kotlin.nj2k.tree.*
|
import org.jetbrains.kotlin.nj2k.tree.*
|
||||||
import org.jetbrains.kotlin.nj2k.tree.impl.JKFieldAccessExpressionImpl
|
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() {
|
class ArrayOperationsConversion(private val context: NewJ2kConverterContext) : RecursiveApplicableConversionBase() {
|
||||||
override fun applyToElement(element: JKTreeElement): JKTreeElement {
|
override fun applyToElement(element: JKTreeElement): JKTreeElement {
|
||||||
if (element !is JKQualifiedExpression) return recurse(element)
|
if (element !is JKQualifiedExpression) return recurse(element)
|
||||||
val selector = element.selector as? JKFieldAccessExpression ?: return recurse(element)
|
val selector = element.selector as? JKFieldAccessExpression ?: return recurse(element)
|
||||||
if (element.receiver.type(context.symbolProvider) !is JKJavaArrayType) return recurse(element)
|
if (element.receiver.isArrayOrVarargTypeParameter() && selector.identifier.name == "length") {
|
||||||
if (selector.identifier.name == "length") {
|
|
||||||
val sizeCall =
|
val sizeCall =
|
||||||
JKFieldAccessExpressionImpl(
|
JKFieldAccessExpressionImpl(
|
||||||
context.symbolProvider.provideFieldSymbol("kotlin.Array.size")
|
context.symbolProvider.provideFieldSymbol("kotlin.Array.size")
|
||||||
@@ -29,4 +30,15 @@ class ArrayOperationsConversion(private val context: NewJ2kConverterContext) : R
|
|||||||
}
|
}
|
||||||
return recurse(element)
|
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 {
|
public void testEllipsisTypeSingleParams() throws Exception {
|
||||||
runTest("nj2k/testData/newJ2k/varArg/ellipsisTypeSingleParams.java");
|
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")
|
@TestMetadata("nj2k/testData/newJ2k/whileStatement")
|
||||||
|
|||||||
Reference in New Issue
Block a user