From cfd476ca7e64f55798d4bda77698142a10f7ac55 Mon Sep 17 00:00:00 2001 From: Ilya Kirillov Date: Mon, 16 Sep 2019 21:20:44 +0300 Subject: [PATCH] New J2K: correctly convert main method with varargs argument #KT-33756 fixed --- .../conversions/MainFunctionConversion.kt | 39 +++++++++---------- nj2k/testData/newJ2k/function/mainVararg.java | 4 ++ nj2k/testData/newJ2k/function/mainVararg.kt | 5 +++ nj2k/testData/newJ2k/issues/kt-21189.kt | 18 ++------- ...otlinConverterSingleFileTestGenerated.java | 5 +++ 5 files changed, 35 insertions(+), 36 deletions(-) create mode 100644 nj2k/testData/newJ2k/function/mainVararg.java create mode 100644 nj2k/testData/newJ2k/function/mainVararg.kt diff --git a/nj2k/src/org/jetbrains/kotlin/nj2k/conversions/MainFunctionConversion.kt b/nj2k/src/org/jetbrains/kotlin/nj2k/conversions/MainFunctionConversion.kt index 46cb094445e..c40dac53243 100644 --- a/nj2k/src/org/jetbrains/kotlin/nj2k/conversions/MainFunctionConversion.kt +++ b/nj2k/src/org/jetbrains/kotlin/nj2k/conversions/MainFunctionConversion.kt @@ -7,39 +7,36 @@ package org.jetbrains.kotlin.nj2k.conversions import org.jetbrains.kotlin.j2k.ast.Nullability import org.jetbrains.kotlin.nj2k.NewJ2kConverterContext -import org.jetbrains.kotlin.nj2k.tree.* -import org.jetbrains.kotlin.nj2k.types.JKClassType +import org.jetbrains.kotlin.nj2k.jvmAnnotation +import org.jetbrains.kotlin.nj2k.tree.JKMethod +import org.jetbrains.kotlin.nj2k.tree.JKTreeElement +import org.jetbrains.kotlin.nj2k.tree.OtherModifier +import org.jetbrains.kotlin.nj2k.tree.hasOtherModifier import org.jetbrains.kotlin.nj2k.types.JKJavaArrayType -import org.jetbrains.kotlin.nj2k.types.updateNullability +import org.jetbrains.kotlin.nj2k.types.arrayInnerType +import org.jetbrains.kotlin.nj2k.types.isStringType - -//TODO temporary class MainFunctionConversion(context: NewJ2kConverterContext) : RecursiveApplicableConversionBase(context) { override fun applyToElement(element: JKTreeElement): JKTreeElement { if (element !is JKMethod) return recurse(element) if (element.isMainFunctionDeclaration()) { element.parameters.single().apply { - val oldType = type.type as JKJavaArrayType - val oldTypeParameter = oldType.type as JKClassType - val newType = - JKJavaArrayType( - oldTypeParameter.updateNullability(Nullability.NotNull), - Nullability.NotNull - ) - type = JKTypeElement(newType) + type.type = JKJavaArrayType(typeFactory.types.string, Nullability.NotNull) + isVarArgs = false } - element.annotationList.annotations += - JKAnnotation( - symbolProvider.provideClassSymbol("kotlin.jvm.JvmStatic"), - emptyList() - ) + element.annotationList.annotations += jvmAnnotation("JvmStatic", symbolProvider) } return recurse(element) } private fun JKMethod.isMainFunctionDeclaration(): Boolean { - val type = parameters.singleOrNull()?.type?.type as? JKJavaArrayType ?: return false - val typeArgument = type.type as? JKClassType ?: return false - return name.value == "main" && typeArgument.classReference.name == "String" + if (name.value != "main") return false + if (!hasOtherModifier(OtherModifier.STATIC)) return false + val parameter = parameters.singleOrNull() ?: return false + return when { + parameter.type.type.arrayInnerType()?.isStringType() == true -> true + parameter.isVarArgs && parameter.type.type.isStringType() -> true + else -> false + } } } \ No newline at end of file diff --git a/nj2k/testData/newJ2k/function/mainVararg.java b/nj2k/testData/newJ2k/function/mainVararg.java new file mode 100644 index 00000000000..ff97a006bf0 --- /dev/null +++ b/nj2k/testData/newJ2k/function/mainVararg.java @@ -0,0 +1,4 @@ +public class Main { + public static void main(String... args) { + } +} \ No newline at end of file diff --git a/nj2k/testData/newJ2k/function/mainVararg.kt b/nj2k/testData/newJ2k/function/mainVararg.kt new file mode 100644 index 00000000000..cdc11f36469 --- /dev/null +++ b/nj2k/testData/newJ2k/function/mainVararg.kt @@ -0,0 +1,5 @@ +object Main { + @JvmStatic + fun main(args: Array) { + } +} \ No newline at end of file diff --git a/nj2k/testData/newJ2k/issues/kt-21189.kt b/nj2k/testData/newJ2k/issues/kt-21189.kt index 594987edbef..ed823fa054f 100644 --- a/nj2k/testData/newJ2k/issues/kt-21189.kt +++ b/nj2k/testData/newJ2k/issues/kt-21189.kt @@ -1,19 +1,7 @@ object ArrayInitializerBugKt { - private val GREETING = byteArrayOf( - 'H'.toByte(), - 'e'.toByte(), - 'l'.toByte(), - 'l'.toByte(), - 'o'.toByte(), - ','.toByte(), - ' '.toByte(), - 'b'.toByte(), - 'u'.toByte(), - 'g'.toByte(), - '!'.toByte() - ) - - fun main(vararg args: String?) { + private val GREETING = byteArrayOf('H'.toByte(), 'e'.toByte(), 'l'.toByte(), 'l'.toByte(), 'o'.toByte(), ','.toByte(), ' '.toByte(), 'b'.toByte(), 'u'.toByte(), 'g'.toByte(), '!'.toByte()) + @JvmStatic + fun main(args: Array) { val greeting = String(GREETING) println(greeting) } diff --git a/nj2k/tests/org/jetbrains/kotlin/nj2k/NewJavaToKotlinConverterSingleFileTestGenerated.java b/nj2k/tests/org/jetbrains/kotlin/nj2k/NewJavaToKotlinConverterSingleFileTestGenerated.java index b0d2e62ace1..db033b45f7c 100644 --- a/nj2k/tests/org/jetbrains/kotlin/nj2k/NewJavaToKotlinConverterSingleFileTestGenerated.java +++ b/nj2k/tests/org/jetbrains/kotlin/nj2k/NewJavaToKotlinConverterSingleFileTestGenerated.java @@ -2388,6 +2388,11 @@ public class NewJavaToKotlinConverterSingleFileTestGenerated extends AbstractNew runTest("nj2k/testData/newJ2k/function/mainAndNullabilitySetting.java"); } + @TestMetadata("mainVararg.java") + public void testMainVararg() throws Exception { + runTest("nj2k/testData/newJ2k/function/mainVararg.java"); + } + @TestMetadata("methodClassType.java") public void testMethodClassType() throws Exception { runTest("nj2k/testData/newJ2k/function/methodClassType.java");