diff --git a/j2k/src/org/jetbrains/kotlin/j2k/CodeConverter.kt b/j2k/src/org/jetbrains/kotlin/j2k/CodeConverter.kt index 27daffbda83..37c5cf3999a 100644 --- a/j2k/src/org/jetbrains/kotlin/j2k/CodeConverter.kt +++ b/j2k/src/org/jetbrains/kotlin/j2k/CodeConverter.kt @@ -57,15 +57,12 @@ class CodeConverter( return statementConverter.convertStatement(statement, this).assignPrototype(statement) } - fun convertExpressions(expressions: Array): List - = expressions.map { convertExpression(it) } - - fun convertExpressions(expressions: List): List - = expressions.map { convertExpression(it) } + fun convertExpressionsInList(expressions: List): List + = expressions.map { convertExpression(it).assignPrototype(it, CommentsAndSpacesInheritance.LINE_BREAKS) } fun convertArgumentList(list: PsiExpressionList): ArgumentList { return ArgumentList( - convertExpressions(list.expressions), + convertExpressionsInList(list.expressions.asList()), LPar.withPrototype(list.lPar()), RPar.withPrototype(list.rPar()) ).assignPrototype(list) diff --git a/j2k/src/org/jetbrains/kotlin/j2k/ExpressionConverter.kt b/j2k/src/org/jetbrains/kotlin/j2k/ExpressionConverter.kt index 58f7c7b876b..9959c9bbb20 100644 --- a/j2k/src/org/jetbrains/kotlin/j2k/ExpressionConverter.kt +++ b/j2k/src/org/jetbrains/kotlin/j2k/ExpressionConverter.kt @@ -343,7 +343,7 @@ class DefaultExpressionConverter : JavaElementVisitor(), ExpressionConverter { val isExtension = property.isExtensionDeclaration() val propertyAccess = if (isTopLevel) { if (isExtension) - QualifiedExpression(codeConverter.convertExpression(arguments.firstOrNull(), true), propertyName, null).assignNoPrototype() + QualifiedExpression(codeConverter.convertExpression(arguments.firstOrNull(), shouldParenthesize = true), propertyName, null).assignNoPrototype() else propertyName } @@ -371,7 +371,7 @@ class DefaultExpressionConverter : JavaElementVisitor(), ExpressionConverter { else if (origin is KtFunction) { if (isTopLevel) { result = if (origin.isExtensionDeclaration()) { - val qualifier = codeConverter.convertExpression(arguments.firstOrNull(), true) + val qualifier = codeConverter.convertExpression(arguments.firstOrNull(), shouldParenthesize = true) MethodCallExpression.build(qualifier, origin.name!!, convertArguments(expression, isExtension = true), @@ -393,7 +393,7 @@ class DefaultExpressionConverter : JavaElementVisitor(), ExpressionConverter { val resolvedQualifier = (methodExpr.qualifier as? PsiReferenceExpression)?.resolve() if (isFacadeClassFromLibrary(resolvedQualifier)) { result = if (target.isKotlinExtensionFunction()) { - val qualifier = codeConverter.convertExpression(arguments.firstOrNull(), true) + val qualifier = codeConverter.convertExpression(arguments.firstOrNull(), shouldParenthesize = true) MethodCallExpression.build(qualifier, methodExpr.referenceName!!, convertArguments(expression, isExtension = true), @@ -418,7 +418,7 @@ class DefaultExpressionConverter : JavaElementVisitor(), ExpressionConverter { if (specialMethod != null) { val lPar = expression.argumentList.lPar() val rPar = expression.argumentList.rPar() - val data = SpecialMethod.ConvertCallData(qualifier, arguments, typeArguments, dot, lPar, rPar, codeConverter) + val data = SpecialMethod.ConvertCallData(qualifier, arguments.asList(), typeArguments, dot, lPar, rPar, codeConverter) val converted = specialMethod.convertCall(data) if (converted != null) { result = converted @@ -477,7 +477,7 @@ class DefaultExpressionConverter : JavaElementVisitor(), ExpressionConverter { else if (expression.arrayDimensions.size > 0 && expression.type is PsiArrayType) { result = ArrayWithoutInitializationExpression( typeConverter.convertType(expression.type, Nullability.NotNull) as ArrayType, - codeConverter.convertExpressions(expression.arrayDimensions)) + codeConverter.convertExpressionsInList(expression.arrayDimensions.asList())) } else { if (type?.canonicalText in PsiPrimitiveType.getAllBoxedTypeNames()) { @@ -707,7 +707,7 @@ class DefaultExpressionConverter : JavaElementVisitor(), ExpressionConverter { } } else { - arguments.map { codeConverter.convertExpression(it).assignPrototype(it, commentsAndSpacesInheritance) } + codeConverter.convertExpressionsInList(arguments) } val lPar = argumentList?.lPar() @@ -826,7 +826,7 @@ class DefaultExpressionConverter : JavaElementVisitor(), ExpressionConverter { } }) - val callData = SpecialMethod.ConvertCallData(fakeReceiver, fakeParams.toTypedArray(), emptyList(), null, null, null, patchedConverter) + val callData = SpecialMethod.ConvertCallData(fakeReceiver, fakeParams, emptyList(), null, null, null, patchedConverter) statement = specialMethod.convertCall(callData)!! } else { diff --git a/j2k/src/org/jetbrains/kotlin/j2k/SpecialMethod.kt b/j2k/src/org/jetbrains/kotlin/j2k/SpecialMethod.kt index 52d98193932..b42ee855683 100644 --- a/j2k/src/org/jetbrains/kotlin/j2k/SpecialMethod.kt +++ b/j2k/src/org/jetbrains/kotlin/j2k/SpecialMethod.kt @@ -39,7 +39,7 @@ enum class SpecialMethod(val qualifiedClassName: String?, val methodName: String }, COLLECTION_TO_ARRAY_WITH_ARG(Collection::class.java.name, "toArray", 1) { - override fun ConvertCallData.convertCall() = copy(arguments = emptyArray()).convertWithChangedName("toTypedArray", emptyList()) + override fun ConvertCallData.convertCall() = copy(arguments = emptyList()).convertWithChangedName("toTypedArray", emptyList()) }, MAP_SIZE(Map::class.java.name, "size", 0) { @@ -276,7 +276,7 @@ enum class SpecialMethod(val qualifiedClassName: String?, val methodName: String limit < 0 -> // negative, same behavior as split(regex) in kotlin listOf(patternArgument) limit == 0 -> { // zero, same replacement as for split without limit - val newCallData = copy(arguments = arrayOf(arguments[0])) + val newCallData = copy(arguments = listOf(arguments[0])) return STRING_SPLIT.convertCall(newCallData) } else -> // positive, same behavior as split(regex, limit) in kotlin @@ -298,7 +298,7 @@ enum class SpecialMethod(val qualifiedClassName: String?, val methodName: String = super.matches(method, superMethodsSearcher) && method.parameterList.parameters.last().type.canonicalText == "java.lang.Iterable" override fun ConvertCallData.convertCall(): Expression? { - val argumentList = ArgumentList.withNoPrototype(codeConverter.convertExpressions(arguments.take(1))) + val argumentList = ArgumentList.withNoPrototype(codeConverter.convertExpressionsInList(arguments.take(1))) return MethodCallExpression.buildNonNull(codeConverter.convertExpression(arguments[1]), "joinToString", argumentList) } }, @@ -313,9 +313,9 @@ enum class SpecialMethod(val qualifiedClassName: String?, val methodName: String } else { return MethodCallExpression.buildNonNull( - MethodCallExpression.buildNonNull(null, "arrayOf", ArgumentList.withNoPrototype(codeConverter.convertExpressions(arguments.drop(1)))).assignNoPrototype(), + MethodCallExpression.buildNonNull(null, "arrayOf", ArgumentList.withNoPrototype(codeConverter.convertExpressionsInList(arguments.drop(1)))).assignNoPrototype(), "joinToString", - ArgumentList.withNoPrototype(codeConverter.convertExpressions (arguments.take(1))) + ArgumentList.withNoPrototype(codeConverter.convertExpressionsInList(arguments.take(1))) ) } } @@ -341,13 +341,13 @@ enum class SpecialMethod(val qualifiedClassName: String?, val methodName: String STRING_REGION_MATCHES(JAVA_LANG_STRING, "regionMatches", 5) { override fun ConvertCallData.convertCall() - = copy(arguments = arguments.drop(1).toTypedArray()).convertWithIgnoreCaseArgument("regionMatches", ignoreCaseArgument = arguments.first()) + = copy(arguments = arguments.drop(1)).convertWithIgnoreCaseArgument("regionMatches", ignoreCaseArgument = arguments.first()) }, STRING_GET_BYTES(JAVA_LANG_STRING, "getBytes", null) { override fun ConvertCallData.convertCall(): MethodCallExpression { val charsetArg = arguments.lastOrNull()?.check { it.type?.canonicalText == JAVA_LANG_STRING } - val convertedArguments = codeConverter.convertExpressions(arguments).map { + val convertedArguments = codeConverter.convertExpressionsInList(arguments).map { if (charsetArg != null && it.prototypes?.singleOrNull()?.element == charsetArg) MethodCallExpression.buildNonNull(null, "charset", ArgumentList.withNoPrototype(it)).assignNoPrototype() else @@ -365,7 +365,7 @@ enum class SpecialMethod(val qualifiedClassName: String?, val methodName: String STRING_GET_CHARS(JAVA_LANG_STRING, "getChars", 4) { override fun ConvertCallData.convertCall(): MethodCallExpression { // reorder parameters: srcBegin(0), srcEnd(1), dst(2), dstOffset(3) -> destination(2), destinationOffset(3), startIndex(0), endIndex(1) - val argumentList = ArgumentList.withNoPrototype(codeConverter.convertExpressions(arguments.slice(listOf(2, 3, 0, 1)))) + val argumentList = ArgumentList.withNoPrototype(codeConverter.convertExpressionsInList(arguments.slice(listOf(2, 3, 0, 1)))) return MethodCallExpression.buildNonNull( codeConverter.convertExpression(qualifier), "toCharArray", @@ -383,7 +383,7 @@ enum class SpecialMethod(val qualifiedClassName: String?, val methodName: String } override fun ConvertCallData.convertCall() - = MethodCallExpression.buildNonNull(null, "String", ArgumentList.withNoPrototype(codeConverter.convertExpressions (arguments))) + = MethodCallExpression.buildNonNull(null, "String", ArgumentList.withNoPrototype(codeConverter.convertExpressionsInList(arguments))) }, STRING_COPY_VALUE_OF_CHAR_ARRAY(JAVA_LANG_STRING, "copyValueOf", null) { @@ -399,7 +399,7 @@ enum class SpecialMethod(val qualifiedClassName: String?, val methodName: String STRING_VALUE_OF(JAVA_LANG_STRING, "valueOf", 1) { override fun ConvertCallData.convertCall() - = MethodCallExpression.buildNonNull(codeConverter.convertExpression(arguments.single(), true), "toString") + = MethodCallExpression.buildNonNull(codeConverter.convertExpression(arguments.single(), shouldParenthesize = true), "toString") }, SYSTEM_OUT_PRINTLN(PrintStream::class.java.name, "println", null) { @@ -426,7 +426,7 @@ enum class SpecialMethod(val qualifiedClassName: String?, val methodName: String data class ConvertCallData( val qualifier: PsiExpression?, - @Suppress("ArrayInDataClass") val arguments: Array, + @Suppress("ArrayInDataClass") val arguments: List, val typeArgumentsConverted: List, val dot: PsiElement?, val lPar: PsiElement?, @@ -464,7 +464,7 @@ enum class SpecialMethod(val qualifiedClassName: String?, val methodName: String } protected fun ConvertCallData.convertWithReceiverCast(): MethodCallExpression? { - val convertedArguments = arguments.map { codeConverter.convertExpression(it) } + val convertedArguments = codeConverter.convertExpressionsInList(arguments) val qualifierWithCast = castQualifierToType(codeConverter, qualifier!!, qualifiedClassName!!) ?: return null return MethodCallExpression.buildNonNull( qualifierWithCast, @@ -506,7 +506,7 @@ enum class SpecialMethod(val qualifiedClassName: String?, val methodName: String if (qualifier.referenceName != "out") return null if (typeArgumentsConverted.isNotEmpty()) return null val argumentList = ArgumentList( - arguments.map { codeConverter.convertExpression(it).assignPrototype(it, CommentsAndSpacesInheritance.LINE_BREAKS) }, + codeConverter.convertExpressionsInList(arguments), LPar.withPrototype(lPar), RPar.withPrototype(rPar) ).assignNoPrototype() @@ -514,7 +514,7 @@ enum class SpecialMethod(val qualifiedClassName: String?, val methodName: String } protected fun CodeConverter.convertToRegex(expression: PsiExpression?): Expression - = MethodCallExpression.buildNonNull(convertExpression(expression, true), "toRegex").assignNoPrototype() + = MethodCallExpression.buildNonNull(convertExpression(expression, shouldParenthesize = true), "toRegex").assignNoPrototype() companion object { private val valuesByName = values().groupBy { it.methodName } diff --git a/j2k/src/org/jetbrains/kotlin/j2k/StatementConverter.kt b/j2k/src/org/jetbrains/kotlin/j2k/StatementConverter.kt index a9419007dda..44a9ce4f8bb 100644 --- a/j2k/src/org/jetbrains/kotlin/j2k/StatementConverter.kt +++ b/j2k/src/org/jetbrains/kotlin/j2k/StatementConverter.kt @@ -110,7 +110,7 @@ class DefaultStatementConverter : JavaElementVisitor(), StatementConverter { } override fun visitExpressionListStatement(statement: PsiExpressionListStatement) { - result = ExpressionListStatement(codeConverter.convertExpressions(statement.expressionList.expressions)) + result = ExpressionListStatement(codeConverter.convertExpressionsInList(statement.expressionList.expressions.asList())) } override fun visitForStatement(statement: PsiForStatement) {