Inline Variable: Move string template processing to InlineValHandler as it violates contract of the PsiElement.replace()

This commit is contained in:
Alexey Sedunov
2015-12-14 11:56:34 +03:00
parent b5fad71b18
commit 3dfb9d2e5e
2 changed files with 40 additions and 30 deletions
@@ -19,7 +19,6 @@ package org.jetbrains.kotlin.psi
import com.intellij.lang.ASTNode
import com.intellij.psi.PsiElement
import org.jetbrains.kotlin.KtNodeType
import org.jetbrains.kotlin.psi.psiUtil.canPlaceAfterSimpleNameEntry
public abstract class KtExpressionImpl(node: ASTNode) : KtElementImpl(node), KtExpression {
@@ -39,33 +38,13 @@ public abstract class KtExpressionImpl(node: ASTNode) : KtElementImpl(node), KtE
val parent = expression.getParent()
if (newElement is KtExpression) {
when {
parent is KtStringTemplateEntryWithExpression &&
newElement is KtStringTemplateExpression &&
// Do not mix raw and non-raw templates
parent.parent.firstChild.text == newElement.firstChild.text -> {
val entriesToAdd = newElement.entries
val templateExpression = parent.parent as KtStringTemplateExpression
if (entriesToAdd.size > 0) {
templateExpression.addRangeBefore(entriesToAdd.first(), entriesToAdd.last(), parent)
val lastNewEntry = parent.prevSibling
val nextElement = parent.nextSibling
if (lastNewEntry is KtSimpleNameStringTemplateEntry &&
lastNewEntry.expression != null &&
!canPlaceAfterSimpleNameEntry(nextElement)) {
lastNewEntry.replace(KtPsiFactory(expression).createBlockStringTemplateEntry(lastNewEntry.expression!!))
}
}
parent.delete()
}
parent is KtExpression || parent is KtValueArgument -> {
when (parent) {
is KtExpression, is KtValueArgument -> {
if (KtPsiUtil.areParenthesesNecessary(newElement, expression, parent as KtElement)) {
return rawReplaceHandler(KtPsiFactory(expression).createExpressionByPattern("($0)", newElement))
}
}
parent is KtSimpleNameStringTemplateEntry -> {
is KtSimpleNameStringTemplateEntry -> {
if (newElement !is KtSimpleNameExpression) {
val newEntry = parent.replace(KtPsiFactory(expression).createBlockStringTemplateEntry(newElement)) as KtBlockStringTemplateEntry
return newEntry.getExpression()!!