From 5212b97047e467c355db898184f8786a519d3742 Mon Sep 17 00:00:00 2001 From: Mikhail Glukhikh Date: Wed, 18 Apr 2018 10:45:17 +0300 Subject: [PATCH] Remove reformatting in intentions isApplicable via createByPattern --- .../jetbrains/kotlin/psi/KtExpressionImpl.kt | 13 ++++++--- .../kotlin/psi/KtExpressionImplStub.java | 4 +-- .../jetbrains/kotlin/psi/createByPattern.kt | 27 +++++++++++-------- 3 files changed, 28 insertions(+), 16 deletions(-) diff --git a/compiler/psi/src/org/jetbrains/kotlin/psi/KtExpressionImpl.kt b/compiler/psi/src/org/jetbrains/kotlin/psi/KtExpressionImpl.kt index f7a7f26e493..a1c5000cc7b 100644 --- a/compiler/psi/src/org/jetbrains/kotlin/psi/KtExpressionImpl.kt +++ b/compiler/psi/src/org/jetbrains/kotlin/psi/KtExpressionImpl.kt @@ -19,18 +19,25 @@ abstract class KtExpressionImpl(node: ASTNode) : KtElementImpl(node), KtExpressi } override fun replace(newElement: PsiElement): PsiElement { - return replaceExpression(this, newElement, { super.replace(it) }) + return replaceExpression(this, newElement) { super.replace(it) } } companion object { - fun replaceExpression(expression: KtExpression, newElement: PsiElement, rawReplaceHandler: (PsiElement) -> PsiElement): PsiElement { + fun replaceExpression( + expression: KtExpression, + newElement: PsiElement, + reformat: Boolean = true, + rawReplaceHandler: (PsiElement) -> PsiElement + ): PsiElement { val parent = expression.parent if (newElement is KtExpression) { when (parent) { is KtExpression, is KtValueArgument -> { if (KtPsiUtil.areParenthesesNecessary(newElement, expression, parent as KtElement)) { - return rawReplaceHandler(KtPsiFactory(expression).createExpressionByPattern("($0)", newElement)) + return rawReplaceHandler( + KtPsiFactory(expression).createExpressionByPattern("($0)", newElement, reformat = reformat) + ) } } is KtSimpleNameStringTemplateEntry -> { diff --git a/compiler/psi/src/org/jetbrains/kotlin/psi/KtExpressionImplStub.java b/compiler/psi/src/org/jetbrains/kotlin/psi/KtExpressionImplStub.java index 674aaf50bf5..39c8993dcf2 100644 --- a/compiler/psi/src/org/jetbrains/kotlin/psi/KtExpressionImplStub.java +++ b/compiler/psi/src/org/jetbrains/kotlin/psi/KtExpressionImplStub.java @@ -40,11 +40,11 @@ public abstract class KtExpressionImplStub> extends KtE @NotNull @Override public PsiElement replace(@NotNull PsiElement newElement) throws IncorrectOperationException { - return KtExpressionImpl.Companion.replaceExpression(this, newElement, this::rawReplace); + return KtExpressionImpl.Companion.replaceExpression(this, newElement, true, this::rawReplace); } @NotNull - private PsiElement rawReplace(@NotNull PsiElement newElement) { + public PsiElement rawReplace(@NotNull PsiElement newElement) { return super.replace(newElement); } diff --git a/compiler/psi/src/org/jetbrains/kotlin/psi/createByPattern.kt b/compiler/psi/src/org/jetbrains/kotlin/psi/createByPattern.kt index 1d38d18e498..d901d2edd84 100644 --- a/compiler/psi/src/org/jetbrains/kotlin/psi/createByPattern.kt +++ b/compiler/psi/src/org/jetbrains/kotlin/psi/createByPattern.kt @@ -57,16 +57,19 @@ private abstract class PsiElementPlaceholderArgumentType, val placeholderClass: Class ) : ArgumentType(klass) { - abstract fun replacePlaceholderElement(placeholder: TPlaceholder, argument: T): PsiChildRange + abstract fun replacePlaceholderElement(placeholder: TPlaceholder, argument: T, reformat: Boolean): PsiChildRange } private class PsiElementArgumentType(klass: Class) : PsiElementPlaceholderArgumentType(klass, klass) { - override fun replacePlaceholderElement(placeholder: T, argument: T): PsiChildRange { + override fun replacePlaceholderElement(placeholder: T, argument: T, reformat: Boolean): PsiChildRange { + var result = if (placeholder is KtExpressionImplStub<*>) { + KtExpressionImpl.replaceExpression(placeholder, argument, reformat, placeholder::rawReplace) + } else { + placeholder.replace(argument) + } // if argument element has generated flag then it has not been formatted yet and we should do this manually // (because we cleared this flag for the whole tree above and PostprocessReformattingAspect won't format anything) - val reformat = CodeEditUtil.isNodeGenerated(argument.node) - var result = placeholder.replace(argument) - if (reformat) { + if (CodeEditUtil.isNodeGenerated(argument.node)) { result = CodeStyleManager.getInstance(result.project).reformat(result, true) } return PsiChildRange.singleElement(result) @@ -75,18 +78,20 @@ private class PsiElementArgumentType(klass: Class) : PsiEleme private object PsiChildRangeArgumentType : PsiElementPlaceholderArgumentType(PsiChildRange::class.java, KtElement::class.java) { - override fun replacePlaceholderElement(placeholder: KtElement, argument: PsiChildRange): PsiChildRange { + override fun replacePlaceholderElement(placeholder: KtElement, argument: PsiChildRange, reformat: Boolean): PsiChildRange { val project = placeholder.project - val codeStyleManager = CodeStyleManager.getInstance(project) return if (!argument.isEmpty) { val first = placeholder.parent.addRangeBefore(argument.first!!, argument.last!!, placeholder) val last = placeholder.prevSibling placeholder.delete() - codeStyleManager.reformatNewlyAddedElement(first.node.treeParent, first.node) - if (last != first) { - codeStyleManager.reformatNewlyAddedElement(last.node.treeParent, last.node) + if (reformat) { + val codeStyleManager = CodeStyleManager.getInstance(project) + codeStyleManager.reformatNewlyAddedElement(first.node.treeParent, first.node) + if (last != first) { + codeStyleManager.reformatNewlyAddedElement(last.node.treeParent, last.node) + } } PsiChildRange(first, last) } else { @@ -198,7 +203,7 @@ fun createByPattern( } @Suppress("UNCHECKED_CAST") val argumentType = argumentTypes[n] as PsiElementPlaceholderArgumentType - val range = argumentType.replacePlaceholderElement(element, args[n]) + val range = argumentType.replacePlaceholderElement(element, args[n], reformat) if (element == resultElement) { assert(range.first == range.last)