Remove reformatting in intentions isApplicable via createByPattern
This commit is contained in:
@@ -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)
|
||||
|
||||
Reference in New Issue
Block a user