Remove reformatting in intentions isApplicable via createByPattern

This commit is contained in:
Mikhail Glukhikh
2018-04-18 10:45:17 +03:00
parent ef3ba5f0b1
commit 5212b97047
3 changed files with 28 additions and 16 deletions
@@ -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 -> {
@@ -40,11 +40,11 @@ public abstract class KtExpressionImplStub<T extends StubElement<?>> 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);
}
@@ -57,16 +57,19 @@ private abstract class PsiElementPlaceholderArgumentType<T : Any, TPlaceholder :
klass: Class<T>,
val placeholderClass: Class<TPlaceholder>
) : ArgumentType<T>(klass) {
abstract fun replacePlaceholderElement(placeholder: TPlaceholder, argument: T): PsiChildRange
abstract fun replacePlaceholderElement(placeholder: TPlaceholder, argument: T, reformat: Boolean): PsiChildRange
}
private class PsiElementArgumentType<T : PsiElement>(klass: Class<T>) : PsiElementPlaceholderArgumentType<T, T>(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<T : PsiElement>(klass: Class<T>) : PsiEleme
private object PsiChildRangeArgumentType :
PsiElementPlaceholderArgumentType<PsiChildRange, KtElement>(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 <TElement : KtElement> createByPattern(
}
@Suppress("UNCHECKED_CAST")
val argumentType = argumentTypes[n] as PsiElementPlaceholderArgumentType<in Any, in PsiElement>
val range = argumentType.replacePlaceholderElement(element, args[n])
val range = argumentType.replacePlaceholderElement(element, args[n], reformat)
if (element == resultElement) {
assert(range.first == range.last)