Fix formatting in "simplify call chain" #KT-28576 Fixed

This commit is contained in:
Mikhail Glukhikh
2018-11-30 22:20:12 +03:00
parent a3909d8e47
commit de33905c44
4 changed files with 38 additions and 24 deletions
@@ -0,0 +1,26 @@
/*
* Copyright 2010-2018 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license
* that can be found in the license/LICENSE.txt file.
*/
package org.jetbrains.kotlin.idea.formatter
import com.intellij.openapi.fileEditor.FileDocumentManager
import com.intellij.openapi.util.TextRange
import com.intellij.psi.PsiDocumentManager
import com.intellij.psi.PsiFile
import com.intellij.psi.codeStyle.CodeStyleManager
fun PsiFile.commitAndUnblockDocument(): Boolean {
val virtualFile = this.virtualFile ?: return false
val document = FileDocumentManager.getInstance().getDocument(virtualFile) ?: return false
val documentManager = PsiDocumentManager.getInstance(project)
documentManager.doPostponedOperationsAndUnblockDocument(document)
documentManager.commitDocument(document)
return true
}
fun PsiFile.adjustLineIndent(startOffset: Int, endOffset: Int) {
if (!commitAndUnblockDocument()) return
CodeStyleManager.getInstance(project).adjustLineIndent(this, TextRange(startOffset, endOffset))
}
@@ -9,16 +9,12 @@ import com.intellij.codeInspection.LocalQuickFix
import com.intellij.codeInspection.ProblemDescriptor import com.intellij.codeInspection.ProblemDescriptor
import com.intellij.codeInspection.ProblemHighlightType import com.intellij.codeInspection.ProblemHighlightType
import com.intellij.codeInspection.ProblemsHolder import com.intellij.codeInspection.ProblemsHolder
import com.intellij.openapi.fileEditor.FileDocumentManager
import com.intellij.openapi.project.Project import com.intellij.openapi.project.Project
import com.intellij.openapi.util.TextRange
import com.intellij.psi.PsiDocumentManager
import com.intellij.psi.PsiElement import com.intellij.psi.PsiElement
import com.intellij.psi.PsiElementVisitor import com.intellij.psi.PsiElementVisitor
import com.intellij.psi.PsiFile
import com.intellij.psi.codeStyle.CodeStyleManager
import org.jetbrains.kotlin.KtNodeTypes import org.jetbrains.kotlin.KtNodeTypes
import org.jetbrains.kotlin.idea.caches.resolve.analyze import org.jetbrains.kotlin.idea.caches.resolve.analyze
import org.jetbrains.kotlin.idea.formatter.adjustLineIndent
import org.jetbrains.kotlin.idea.intentions.branchedTransformations.isElseIf import org.jetbrains.kotlin.idea.intentions.branchedTransformations.isElseIf
import org.jetbrains.kotlin.idea.refactoring.getLineNumber import org.jetbrains.kotlin.idea.refactoring.getLineNumber
import org.jetbrains.kotlin.psi.* import org.jetbrains.kotlin.psi.*
@@ -79,16 +75,6 @@ private class RemoveRedundantElseFix : LocalQuickFix {
(added.getNextSiblingIgnoringWhitespace() ?: added.parent).endOffset (added.getNextSiblingIgnoringWhitespace() ?: added.parent).endOffset
) )
} }
fun PsiFile.adjustLineIndent(startOffset: Int, endOffset: Int) {
val virtualFile = this.virtualFile ?: return
val document = FileDocumentManager.getInstance().getDocument(virtualFile) ?: return
val documentManager = PsiDocumentManager.getInstance(project)
val psiFile = documentManager.getPsiFile(document) ?: return
documentManager.commitDocument(document)
documentManager.doPostponedOperationsAndUnblockDocument(document)
CodeStyleManager.getInstance(project).adjustLineIndent(psiFile, TextRange(startOffset, endOffset))
}
} }
private fun KtIfExpression.lastSingleElseKeyword(): PsiElement? { private fun KtIfExpression.lastSingleElseKeyword(): PsiElement? {
@@ -24,6 +24,7 @@ import com.intellij.psi.codeStyle.CodeStyleManager
import org.jetbrains.kotlin.idea.core.ShortenReferences import org.jetbrains.kotlin.idea.core.ShortenReferences
import org.jetbrains.kotlin.idea.core.moveFunctionLiteralOutsideParentheses import org.jetbrains.kotlin.idea.core.moveFunctionLiteralOutsideParentheses
import org.jetbrains.kotlin.idea.core.replaced import org.jetbrains.kotlin.idea.core.replaced
import org.jetbrains.kotlin.idea.formatter.commitAndUnblockDocument
import org.jetbrains.kotlin.idea.intentions.callExpression import org.jetbrains.kotlin.idea.intentions.callExpression
import org.jetbrains.kotlin.psi.* import org.jetbrains.kotlin.psi.*
import org.jetbrains.kotlin.psi.psiUtil.PsiChildRange import org.jetbrains.kotlin.psi.psiUtil.PsiChildRange
@@ -81,18 +82,19 @@ class SimplifyCallChainFix(
"$receiverExpressionOrEmptyString$operationSign$newCallText($argumentsText)" "$receiverExpressionOrEmptyString$operationSign$newCallText($argumentsText)"
) )
val project = qualifiedExpression.project
val file = qualifiedExpression.containingKtFile
val result = qualifiedExpression.replaced(newQualifiedOrCallExpression)
if (lambdaExpression != null) { if (lambdaExpression != null) {
val callExpression = when (newQualifiedOrCallExpression) { val callExpression = when (result) {
is KtQualifiedExpression -> newQualifiedOrCallExpression.callExpression is KtQualifiedExpression -> result.callExpression
is KtCallExpression -> newQualifiedOrCallExpression is KtCallExpression -> result
else -> null else -> null
} }
callExpression?.moveFunctionLiteralOutsideParentheses() callExpression?.moveFunctionLiteralOutsideParentheses()
} }
val project = qualifiedExpression.project result.containingKtFile.commitAndUnblockDocument()
val file = qualifiedExpression.containingKtFile
val result = qualifiedExpression.replaced(newQualifiedOrCallExpression)
val reformatted = CodeStyleManager.getInstance(project).reformat(result) val reformatted = CodeStyleManager.getInstance(project).reformat(result)
ShortenReferences.DEFAULT.process(reformatted as KtElement) ShortenReferences.DEFAULT.process(reformatted as KtElement)
if (runOptimizeImports) { if (runOptimizeImports) {
@@ -1,7 +1,7 @@
// WITH_RUNTIME // WITH_RUNTIME
val x = listOf(1, 2, 3).joinToString(prefix = "= ", separator = " + ") { val x = listOf(1, 2, 3).joinToString(prefix = "= ", separator = " + ") {
val sb = StringBuilder() val sb = StringBuilder()
sb.append(it).append(" + ").append(it) sb.append(it).append(" + ").append(it)
sb sb
} }