From 4ae2491ab6d6d3cfbe99a93ed833412d54e6d991 Mon Sep 17 00:00:00 2001 From: Ilya Gorbunov Date: Tue, 6 Oct 2015 20:30:43 +0300 Subject: [PATCH] J2K: Special conversion for java.lang.String methods: String.join (cannot be tested with MockJDK) #KT-7732 --- .../org/jetbrains/kotlin/j2k/SpecialMethod.kt | 30 +++++++++++++++++++ 1 file changed, 30 insertions(+) diff --git a/j2k/src/org/jetbrains/kotlin/j2k/SpecialMethod.kt b/j2k/src/org/jetbrains/kotlin/j2k/SpecialMethod.kt index 3915f65c850..7618764c596 100644 --- a/j2k/src/org/jetbrains/kotlin/j2k/SpecialMethod.kt +++ b/j2k/src/org/jetbrains/kotlin/j2k/SpecialMethod.kt @@ -134,6 +134,36 @@ enum class SpecialMethod(val qualifiedClassName: String?, val methodName: String } }, + STRING_JOIN(JAVA_LANG_STRING, "join", 2) { + override fun matches(method: PsiMethod) + = super.matches(method) && method.parameterList.parameters.last().type.canonicalText == "java.lang.Iterable" + + override fun convertCall(qualifier: PsiExpression?, arguments: Array, typeArgumentsConverted: List, codeConverter: CodeConverter): Expression? + = MethodCallExpression.buildNotNull(codeConverter.convertExpression(arguments[1]), "joinToString", codeConverter.convertExpressions(arguments.take(1)), emptyList()) + }, + + STRING_JOIN_VARARG(JAVA_LANG_STRING, "join", null) { + override fun matches(method: PsiMethod): Boolean = super.matches(method) && method.parameterList.let { it.parametersCount == 2 && it.parameters.last().isVarArgs } + + override fun convertCall(qualifier: PsiExpression?, arguments: Array, typeArgumentsConverted: List, codeConverter: CodeConverter): Expression? { + if (arguments.size() == 2 && arguments.last().isAssignableToCharSequenceArray()) { + return STRING_JOIN.convertCall(qualifier, arguments, typeArgumentsConverted, codeConverter) + } + else { + return MethodCallExpression.buildNotNull( + MethodCallExpression.buildNotNull(null, "arrayOf", codeConverter.convertExpressions(arguments.drop(1))).assignNoPrototype(), + "joinToString", + codeConverter.convertExpressions(arguments.take(1)) + ) + } + } + + private fun PsiExpression.isAssignableToCharSequenceArray(): Boolean { + val charSequenceType = PsiType.getTypeByName("java.lang.CharSequence", project, resolveScope) + return (type as? PsiArrayType)?.componentType?.let { charSequenceType.isAssignableFrom(it) } ?: false + } + }, + STRING_COMPARE_TO_IGNORE_CASE(JAVA_LANG_STRING, "compareToIgnoreCase", 1) { override fun convertCall(qualifier: PsiExpression?, arguments: Array, typeArgumentsConverted: List, codeConverter: CodeConverter)