SimplifyCallChainFix: build new argument list more accurately
Related to KT-23691
This commit is contained in:
@@ -23,6 +23,7 @@ import org.jetbrains.kotlin.idea.core.ShortenReferences
|
|||||||
import org.jetbrains.kotlin.idea.core.replaced
|
import org.jetbrains.kotlin.idea.core.replaced
|
||||||
import org.jetbrains.kotlin.name.Name
|
import org.jetbrains.kotlin.name.Name
|
||||||
import org.jetbrains.kotlin.psi.*
|
import org.jetbrains.kotlin.psi.*
|
||||||
|
import org.jetbrains.kotlin.psi.psiUtil.PsiChildRange
|
||||||
|
|
||||||
class SimplifyCallChainFix(private val newCallText: String) : LocalQuickFix {
|
class SimplifyCallChainFix(private val newCallText: String) : LocalQuickFix {
|
||||||
private val shortenedText = newCallText.split("(").joinToString(separator = "(") {
|
private val shortenedText = newCallText.split("(").joinToString(separator = "(") {
|
||||||
@@ -58,19 +59,27 @@ class SimplifyCallChainFix(private val newCallText: String) : LocalQuickFix {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
val firstCallArgumentList = firstCallExpression.valueArgumentList
|
val firstCallArgumentList = firstCallExpression.valueArgumentList
|
||||||
val firstCallArguments = firstCallArgumentList?.arguments
|
|
||||||
val secondCallArgumentList = secondCallExpression.valueArgumentList
|
val secondCallArgumentList = secondCallExpression.valueArgumentList
|
||||||
val secondCallArguments = secondCallArgumentList?.arguments
|
|
||||||
|
|
||||||
val argumentsText = when {
|
fun KtValueArgumentList.getTextInsideParentheses(): String {
|
||||||
secondCallArguments?.isNotEmpty() == true && firstCallArguments?.isNotEmpty() == true -> {
|
val range = PsiChildRange(leftParenthesis?.nextSibling ?: firstChild, rightParenthesis?.prevSibling ?: lastChild)
|
||||||
"${secondCallArgumentList.text.removeSuffix(")")}, ${firstCallArgumentList.text.removePrefix("(")}"
|
return range.joinToString(separator = "") { it.text }
|
||||||
}
|
|
||||||
secondCallArguments?.isNotEmpty() == true -> secondCallArgumentList.text
|
|
||||||
firstCallArguments?.isNotEmpty() == true -> firstCallArgumentList.text
|
|
||||||
else -> ""
|
|
||||||
}
|
}
|
||||||
|
|
||||||
val lambdaExpression = firstCallExpression.lambdaArguments.singleOrNull()?.getLambdaExpression()
|
val lambdaExpression = firstCallExpression.lambdaArguments.singleOrNull()?.getLambdaExpression()
|
||||||
|
val argumentsText = listOfNotNull(
|
||||||
|
secondCallArgumentList.takeIf { it?.arguments?.isNotEmpty() == true },
|
||||||
|
firstCallArgumentList.takeIf { it?.arguments?.isNotEmpty() == true }
|
||||||
|
).let {
|
||||||
|
if (it.isEmpty()) ""
|
||||||
|
else it.joinToString(
|
||||||
|
separator = ", ",
|
||||||
|
prefix = "(",
|
||||||
|
postfix = ")"
|
||||||
|
) { callArgumentList ->
|
||||||
|
callArgumentList.getTextInsideParentheses()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
val newQualifiedExpression = if (lambdaExpression != null) factory.createExpressionByPattern(
|
val newQualifiedExpression = if (lambdaExpression != null) factory.createExpressionByPattern(
|
||||||
"$0$1$2 $3 $4",
|
"$0$1$2 $3 $4",
|
||||||
|
|||||||
Reference in New Issue
Block a user