Refactoring + preserving formatting in some more places where it was missing

This commit is contained in:
Valentin Kipyatkov
2016-10-03 19:41:37 +03:00
parent 5a6f068130
commit dca094e971
4 changed files with 25 additions and 28 deletions
@@ -57,15 +57,12 @@ class CodeConverter(
return statementConverter.convertStatement(statement, this).assignPrototype(statement) return statementConverter.convertStatement(statement, this).assignPrototype(statement)
} }
fun convertExpressions(expressions: Array<PsiExpression>): List<Expression> fun convertExpressionsInList(expressions: List<PsiExpression>): List<Expression>
= expressions.map { convertExpression(it) } = expressions.map { convertExpression(it).assignPrototype(it, CommentsAndSpacesInheritance.LINE_BREAKS) }
fun convertExpressions(expressions: List<PsiExpression>): List<Expression>
= expressions.map { convertExpression(it) }
fun convertArgumentList(list: PsiExpressionList): ArgumentList { fun convertArgumentList(list: PsiExpressionList): ArgumentList {
return ArgumentList( return ArgumentList(
convertExpressions(list.expressions), convertExpressionsInList(list.expressions.asList()),
LPar.withPrototype(list.lPar()), LPar.withPrototype(list.lPar()),
RPar.withPrototype(list.rPar()) RPar.withPrototype(list.rPar())
).assignPrototype(list) ).assignPrototype(list)
@@ -343,7 +343,7 @@ class DefaultExpressionConverter : JavaElementVisitor(), ExpressionConverter {
val isExtension = property.isExtensionDeclaration() val isExtension = property.isExtensionDeclaration()
val propertyAccess = if (isTopLevel) { val propertyAccess = if (isTopLevel) {
if (isExtension) if (isExtension)
QualifiedExpression(codeConverter.convertExpression(arguments.firstOrNull(), true), propertyName, null).assignNoPrototype() QualifiedExpression(codeConverter.convertExpression(arguments.firstOrNull(), shouldParenthesize = true), propertyName, null).assignNoPrototype()
else else
propertyName propertyName
} }
@@ -371,7 +371,7 @@ class DefaultExpressionConverter : JavaElementVisitor(), ExpressionConverter {
else if (origin is KtFunction) { else if (origin is KtFunction) {
if (isTopLevel) { if (isTopLevel) {
result = if (origin.isExtensionDeclaration()) { result = if (origin.isExtensionDeclaration()) {
val qualifier = codeConverter.convertExpression(arguments.firstOrNull(), true) val qualifier = codeConverter.convertExpression(arguments.firstOrNull(), shouldParenthesize = true)
MethodCallExpression.build(qualifier, MethodCallExpression.build(qualifier,
origin.name!!, origin.name!!,
convertArguments(expression, isExtension = true), convertArguments(expression, isExtension = true),
@@ -393,7 +393,7 @@ class DefaultExpressionConverter : JavaElementVisitor(), ExpressionConverter {
val resolvedQualifier = (methodExpr.qualifier as? PsiReferenceExpression)?.resolve() val resolvedQualifier = (methodExpr.qualifier as? PsiReferenceExpression)?.resolve()
if (isFacadeClassFromLibrary(resolvedQualifier)) { if (isFacadeClassFromLibrary(resolvedQualifier)) {
result = if (target.isKotlinExtensionFunction()) { result = if (target.isKotlinExtensionFunction()) {
val qualifier = codeConverter.convertExpression(arguments.firstOrNull(), true) val qualifier = codeConverter.convertExpression(arguments.firstOrNull(), shouldParenthesize = true)
MethodCallExpression.build(qualifier, MethodCallExpression.build(qualifier,
methodExpr.referenceName!!, methodExpr.referenceName!!,
convertArguments(expression, isExtension = true), convertArguments(expression, isExtension = true),
@@ -418,7 +418,7 @@ class DefaultExpressionConverter : JavaElementVisitor(), ExpressionConverter {
if (specialMethod != null) { if (specialMethod != null) {
val lPar = expression.argumentList.lPar() val lPar = expression.argumentList.lPar()
val rPar = expression.argumentList.rPar() 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) val converted = specialMethod.convertCall(data)
if (converted != null) { if (converted != null) {
result = converted result = converted
@@ -477,7 +477,7 @@ class DefaultExpressionConverter : JavaElementVisitor(), ExpressionConverter {
else if (expression.arrayDimensions.size > 0 && expression.type is PsiArrayType) { else if (expression.arrayDimensions.size > 0 && expression.type is PsiArrayType) {
result = ArrayWithoutInitializationExpression( result = ArrayWithoutInitializationExpression(
typeConverter.convertType(expression.type, Nullability.NotNull) as ArrayType, typeConverter.convertType(expression.type, Nullability.NotNull) as ArrayType,
codeConverter.convertExpressions(expression.arrayDimensions)) codeConverter.convertExpressionsInList(expression.arrayDimensions.asList()))
} }
else { else {
if (type?.canonicalText in PsiPrimitiveType.getAllBoxedTypeNames()) { if (type?.canonicalText in PsiPrimitiveType.getAllBoxedTypeNames()) {
@@ -707,7 +707,7 @@ class DefaultExpressionConverter : JavaElementVisitor(), ExpressionConverter {
} }
} }
else { else {
arguments.map { codeConverter.convertExpression(it).assignPrototype(it, commentsAndSpacesInheritance) } codeConverter.convertExpressionsInList(arguments)
} }
val lPar = argumentList?.lPar() 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)!! statement = specialMethod.convertCall(callData)!!
} }
else { else {
@@ -39,7 +39,7 @@ enum class SpecialMethod(val qualifiedClassName: String?, val methodName: String
}, },
COLLECTION_TO_ARRAY_WITH_ARG(Collection::class.java.name, "toArray", 1) { 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) { 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 limit < 0 -> // negative, same behavior as split(regex) in kotlin
listOf(patternArgument) listOf(patternArgument)
limit == 0 -> { // zero, same replacement as for split without limit 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) return STRING_SPLIT.convertCall(newCallData)
} }
else -> // positive, same behavior as split(regex, limit) in kotlin 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<? extends java.lang.CharSequence>" = super.matches(method, superMethodsSearcher) && method.parameterList.parameters.last().type.canonicalText == "java.lang.Iterable<? extends java.lang.CharSequence>"
override fun ConvertCallData.convertCall(): Expression? { 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) return MethodCallExpression.buildNonNull(codeConverter.convertExpression(arguments[1]), "joinToString", argumentList)
} }
}, },
@@ -313,9 +313,9 @@ enum class SpecialMethod(val qualifiedClassName: String?, val methodName: String
} }
else { else {
return MethodCallExpression.buildNonNull( 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", "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) { STRING_REGION_MATCHES(JAVA_LANG_STRING, "regionMatches", 5) {
override fun ConvertCallData.convertCall() 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) { STRING_GET_BYTES(JAVA_LANG_STRING, "getBytes", null) {
override fun ConvertCallData.convertCall(): MethodCallExpression { override fun ConvertCallData.convertCall(): MethodCallExpression {
val charsetArg = arguments.lastOrNull()?.check { it.type?.canonicalText == JAVA_LANG_STRING } 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) if (charsetArg != null && it.prototypes?.singleOrNull()?.element == charsetArg)
MethodCallExpression.buildNonNull(null, "charset", ArgumentList.withNoPrototype(it)).assignNoPrototype() MethodCallExpression.buildNonNull(null, "charset", ArgumentList.withNoPrototype(it)).assignNoPrototype()
else else
@@ -365,7 +365,7 @@ enum class SpecialMethod(val qualifiedClassName: String?, val methodName: String
STRING_GET_CHARS(JAVA_LANG_STRING, "getChars", 4) { STRING_GET_CHARS(JAVA_LANG_STRING, "getChars", 4) {
override fun ConvertCallData.convertCall(): MethodCallExpression { override fun ConvertCallData.convertCall(): MethodCallExpression {
// reorder parameters: srcBegin(0), srcEnd(1), dst(2), dstOffset(3) -> destination(2), destinationOffset(3), startIndex(0), endIndex(1) // 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( return MethodCallExpression.buildNonNull(
codeConverter.convertExpression(qualifier), codeConverter.convertExpression(qualifier),
"toCharArray", "toCharArray",
@@ -383,7 +383,7 @@ enum class SpecialMethod(val qualifiedClassName: String?, val methodName: String
} }
override fun ConvertCallData.convertCall() 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) { 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) { STRING_VALUE_OF(JAVA_LANG_STRING, "valueOf", 1) {
override fun ConvertCallData.convertCall() 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) { 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( data class ConvertCallData(
val qualifier: PsiExpression?, val qualifier: PsiExpression?,
@Suppress("ArrayInDataClass") val arguments: Array<PsiExpression>, @Suppress("ArrayInDataClass") val arguments: List<PsiExpression>,
val typeArgumentsConverted: List<Type>, val typeArgumentsConverted: List<Type>,
val dot: PsiElement?, val dot: PsiElement?,
val lPar: PsiElement?, val lPar: PsiElement?,
@@ -464,7 +464,7 @@ enum class SpecialMethod(val qualifiedClassName: String?, val methodName: String
} }
protected fun ConvertCallData.convertWithReceiverCast(): MethodCallExpression? { 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 val qualifierWithCast = castQualifierToType(codeConverter, qualifier!!, qualifiedClassName!!) ?: return null
return MethodCallExpression.buildNonNull( return MethodCallExpression.buildNonNull(
qualifierWithCast, qualifierWithCast,
@@ -506,7 +506,7 @@ enum class SpecialMethod(val qualifiedClassName: String?, val methodName: String
if (qualifier.referenceName != "out") return null if (qualifier.referenceName != "out") return null
if (typeArgumentsConverted.isNotEmpty()) return null if (typeArgumentsConverted.isNotEmpty()) return null
val argumentList = ArgumentList( val argumentList = ArgumentList(
arguments.map { codeConverter.convertExpression(it).assignPrototype(it, CommentsAndSpacesInheritance.LINE_BREAKS) }, codeConverter.convertExpressionsInList(arguments),
LPar.withPrototype(lPar), LPar.withPrototype(lPar),
RPar.withPrototype(rPar) RPar.withPrototype(rPar)
).assignNoPrototype() ).assignNoPrototype()
@@ -514,7 +514,7 @@ enum class SpecialMethod(val qualifiedClassName: String?, val methodName: String
} }
protected fun CodeConverter.convertToRegex(expression: PsiExpression?): Expression protected fun CodeConverter.convertToRegex(expression: PsiExpression?): Expression
= MethodCallExpression.buildNonNull(convertExpression(expression, true), "toRegex").assignNoPrototype() = MethodCallExpression.buildNonNull(convertExpression(expression, shouldParenthesize = true), "toRegex").assignNoPrototype()
companion object { companion object {
private val valuesByName = values().groupBy { it.methodName } private val valuesByName = values().groupBy { it.methodName }
@@ -110,7 +110,7 @@ class DefaultStatementConverter : JavaElementVisitor(), StatementConverter {
} }
override fun visitExpressionListStatement(statement: PsiExpressionListStatement) { 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) { override fun visitForStatement(statement: PsiForStatement) {