KT-18006 Bring behavior of Kotlin literal copy/paste inline with Java's after IDEA-172984
This commit is contained in:
@@ -32,19 +32,17 @@ import org.jetbrains.kotlin.lexer.KotlinLexer
|
|||||||
import org.jetbrains.kotlin.lexer.KtTokens
|
import org.jetbrains.kotlin.lexer.KtTokens
|
||||||
import org.jetbrains.kotlin.psi.KtEscapeStringTemplateEntry
|
import org.jetbrains.kotlin.psi.KtEscapeStringTemplateEntry
|
||||||
import org.jetbrains.kotlin.psi.KtFile
|
import org.jetbrains.kotlin.psi.KtFile
|
||||||
import org.jetbrains.kotlin.psi.KtStringTemplateEntry
|
|
||||||
import org.jetbrains.kotlin.psi.KtStringTemplateExpression
|
import org.jetbrains.kotlin.psi.KtStringTemplateExpression
|
||||||
import org.jetbrains.kotlin.psi.psiUtil.endOffset
|
import org.jetbrains.kotlin.psi.psiUtil.*
|
||||||
import org.jetbrains.kotlin.psi.psiUtil.isSingleQuoted
|
|
||||||
import org.jetbrains.kotlin.psi.psiUtil.startOffset
|
|
||||||
import kotlin.coroutines.experimental.SequenceBuilder
|
import kotlin.coroutines.experimental.SequenceBuilder
|
||||||
import kotlin.coroutines.experimental.buildIterator
|
import kotlin.coroutines.experimental.buildIterator
|
||||||
|
|
||||||
private fun PsiElement.findContainingTemplate(): PsiElement {
|
private val PsiElement.templateContentRange: TextRange?
|
||||||
val parent = this.parent
|
get() = this.getParentOfType<KtStringTemplateExpression>(false)?.let{
|
||||||
@Suppress("IfThenToElvis") return if (parent is KtStringTemplateEntry) parent.parent else parent
|
it.textRange.cutOut(it.getContentRange())
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
private fun PsiFile.getTemplateIfAtLiteral(offset: Int): KtStringTemplateExpression? {
|
private fun PsiFile.getTemplateIfAtLiteral(offset: Int): KtStringTemplateExpression? {
|
||||||
val at = this.findElementAt(offset) ?: return null
|
val at = this.findElementAt(offset) ?: return null
|
||||||
return when (at.node?.elementType) {
|
return when (at.node?.elementType) {
|
||||||
@@ -94,7 +92,8 @@ class KotlinLiteralCopyPasteProcessor : CopyPastePreProcessor {
|
|||||||
break
|
break
|
||||||
}
|
}
|
||||||
val elTp = element.node.elementType
|
val elTp = element.node.elementType
|
||||||
if (elTp == KtTokens.ESCAPE_SEQUENCE && fileRange.contains(element.range) && !fileRange.contains(element.findContainingTemplate().range)) {
|
if (elTp == KtTokens.ESCAPE_SEQUENCE && fileRange.contains(element.range) &&
|
||||||
|
element.templateContentRange?.contains(fileRange) == true) {
|
||||||
val tpEntry = element.parent as KtEscapeStringTemplateEntry
|
val tpEntry = element.parent as KtEscapeStringTemplateEntry
|
||||||
changed = true
|
changed = true
|
||||||
buffer.append(tpEntry.unescapedValue)
|
buffer.append(tpEntry.unescapedValue)
|
||||||
|
|||||||
@@ -0,0 +1,3 @@
|
|||||||
|
fun foo(){
|
||||||
|
println("\t\tSome
|
||||||
|
}
|
||||||
@@ -0,0 +1,3 @@
|
|||||||
|
fun foo(){
|
||||||
|
<selection>println("\t\tSome</selection>")
|
||||||
|
}
|
||||||
@@ -0,0 +1,3 @@
|
|||||||
|
fun foo(){
|
||||||
|
<caret>
|
||||||
|
}
|
||||||
@@ -0,0 +1,3 @@
|
|||||||
|
|
||||||
|
|
||||||
|
hello
|
||||||
@@ -0,0 +1,3 @@
|
|||||||
|
fun foo(){
|
||||||
|
println("<selection>\n\nhello</selection>")
|
||||||
|
}
|
||||||
@@ -0,0 +1 @@
|
|||||||
|
<caret>
|
||||||
+12
@@ -47,4 +47,16 @@ public class LiteralKotlinToKotlinCopyPasteTestGenerated extends AbstractLiteral
|
|||||||
String fileName = KotlinTestUtils.navigationMetadata("idea/testData/copyPaste/literal/DontEscapeEntries2.kt");
|
String fileName = KotlinTestUtils.navigationMetadata("idea/testData/copyPaste/literal/DontEscapeEntries2.kt");
|
||||||
doTest(fileName);
|
doTest(fileName);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@TestMetadata("DontUnescapeLiteralWIthCode.kt")
|
||||||
|
public void testDontUnescapeLiteralWIthCode() throws Exception {
|
||||||
|
String fileName = KotlinTestUtils.navigationMetadata("idea/testData/copyPaste/literal/DontUnescapeLiteralWIthCode.kt");
|
||||||
|
doTest(fileName);
|
||||||
|
}
|
||||||
|
|
||||||
|
@TestMetadata("UnescapeFullSelection.kt")
|
||||||
|
public void testUnescapeFullSelection() throws Exception {
|
||||||
|
String fileName = KotlinTestUtils.navigationMetadata("idea/testData/copyPaste/literal/UnescapeFullSelection.kt");
|
||||||
|
doTest(fileName);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user