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

View File

@@ -57,15 +57,12 @@ class CodeConverter(
return statementConverter.convertStatement(statement, this).assignPrototype(statement)
}
fun convertExpressions(expressions: Array<PsiExpression>): List<Expression>
= expressions.map { convertExpression(it) }
fun convertExpressions(expressions: List<PsiExpression>): List<Expression>
= expressions.map { convertExpression(it) }
fun convertExpressionsInList(expressions: List<PsiExpression>): List<Expression>
= 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)

View File

@@ -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 {

View File

@@ -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<? extends java.lang.CharSequence>"
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<PsiExpression>,
@Suppress("ArrayInDataClass") val arguments: List<PsiExpression>,
val typeArgumentsConverted: List<Type>,
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 }

View File

@@ -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) {