From a63d6314357bf0d865fd9a34531dbdda36b2adbb Mon Sep 17 00:00:00 2001 From: fitermay Date: Thu, 25 May 2017 21:59:43 -0400 Subject: [PATCH] KT-18006 Bring behavior of Kotlin literal copy/paste inline with Java's after IDEA-172984 --- .../editor/KotlinLiteralCopyPasteProcessor.kt | 23 +++++++++---------- .../DontUnescapeLiteralWIthCode.expected.kt | 3 +++ .../literal/DontUnescapeLiteralWIthCode.kt | 3 +++ .../literal/DontUnescapeLiteralWIthCode.to.kt | 3 +++ .../literal/UnescapeFullSelection.expected.kt | 3 +++ .../literal/UnescapeFullSelection.kt | 3 +++ .../literal/UnescapeFullSelection.to.kt | 1 + ...lKotlinToKotlinCopyPasteTestGenerated.java | 12 ++++++++++ 8 files changed, 39 insertions(+), 12 deletions(-) create mode 100644 idea/testData/copyPaste/literal/DontUnescapeLiteralWIthCode.expected.kt create mode 100644 idea/testData/copyPaste/literal/DontUnescapeLiteralWIthCode.kt create mode 100644 idea/testData/copyPaste/literal/DontUnescapeLiteralWIthCode.to.kt create mode 100644 idea/testData/copyPaste/literal/UnescapeFullSelection.expected.kt create mode 100644 idea/testData/copyPaste/literal/UnescapeFullSelection.kt create mode 100644 idea/testData/copyPaste/literal/UnescapeFullSelection.to.kt diff --git a/idea/src/org/jetbrains/kotlin/idea/editor/KotlinLiteralCopyPasteProcessor.kt b/idea/src/org/jetbrains/kotlin/idea/editor/KotlinLiteralCopyPasteProcessor.kt index ba6c4918153..2dda46750d7 100644 --- a/idea/src/org/jetbrains/kotlin/idea/editor/KotlinLiteralCopyPasteProcessor.kt +++ b/idea/src/org/jetbrains/kotlin/idea/editor/KotlinLiteralCopyPasteProcessor.kt @@ -32,18 +32,16 @@ import org.jetbrains.kotlin.lexer.KotlinLexer import org.jetbrains.kotlin.lexer.KtTokens import org.jetbrains.kotlin.psi.KtEscapeStringTemplateEntry import org.jetbrains.kotlin.psi.KtFile -import org.jetbrains.kotlin.psi.KtStringTemplateEntry import org.jetbrains.kotlin.psi.KtStringTemplateExpression -import org.jetbrains.kotlin.psi.psiUtil.endOffset -import org.jetbrains.kotlin.psi.psiUtil.isSingleQuoted -import org.jetbrains.kotlin.psi.psiUtil.startOffset +import org.jetbrains.kotlin.psi.psiUtil.* import kotlin.coroutines.experimental.SequenceBuilder import kotlin.coroutines.experimental.buildIterator -private fun PsiElement.findContainingTemplate(): PsiElement { - val parent = this.parent - @Suppress("IfThenToElvis") return if (parent is KtStringTemplateEntry) parent.parent else parent -} +private val PsiElement.templateContentRange: TextRange? + get() = this.getParentOfType(false)?.let{ + it.textRange.cutOut(it.getContentRange()) + } + private fun PsiFile.getTemplateIfAtLiteral(offset: Int): KtStringTemplateExpression? { val at = this.findElementAt(offset) ?: return null @@ -94,7 +92,8 @@ class KotlinLiteralCopyPasteProcessor : CopyPastePreProcessor { break } 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 changed = true buffer.append(tpEntry.unescapedValue) @@ -263,13 +262,13 @@ private class TemplateTokenSequence(private val inputString: String) : Sequence< } @TestOnly -internal fun createTemplateSequenceTokenString(input:String):String{ +internal fun createTemplateSequenceTokenString(input: String): String { return TemplateTokenSequence(input).map { - when (it){ + when (it) { is LiteralChunk -> "LITERAL_CHUNK(${it.text})" is EntryChunk -> "ENTRY_CHUNK(${it.text})" is NewLineChunk -> "NEW_LINE()" } - }.joinToString (separator = "") + }.joinToString(separator = "") } diff --git a/idea/testData/copyPaste/literal/DontUnescapeLiteralWIthCode.expected.kt b/idea/testData/copyPaste/literal/DontUnescapeLiteralWIthCode.expected.kt new file mode 100644 index 00000000000..a2a89a37219 --- /dev/null +++ b/idea/testData/copyPaste/literal/DontUnescapeLiteralWIthCode.expected.kt @@ -0,0 +1,3 @@ +fun foo(){ + println("\t\tSome +} \ No newline at end of file diff --git a/idea/testData/copyPaste/literal/DontUnescapeLiteralWIthCode.kt b/idea/testData/copyPaste/literal/DontUnescapeLiteralWIthCode.kt new file mode 100644 index 00000000000..b9d4b3e1d52 --- /dev/null +++ b/idea/testData/copyPaste/literal/DontUnescapeLiteralWIthCode.kt @@ -0,0 +1,3 @@ +fun foo(){ + println("\t\tSome") +} \ No newline at end of file diff --git a/idea/testData/copyPaste/literal/DontUnescapeLiteralWIthCode.to.kt b/idea/testData/copyPaste/literal/DontUnescapeLiteralWIthCode.to.kt new file mode 100644 index 00000000000..b12dd170364 --- /dev/null +++ b/idea/testData/copyPaste/literal/DontUnescapeLiteralWIthCode.to.kt @@ -0,0 +1,3 @@ +fun foo(){ + +} \ No newline at end of file diff --git a/idea/testData/copyPaste/literal/UnescapeFullSelection.expected.kt b/idea/testData/copyPaste/literal/UnescapeFullSelection.expected.kt new file mode 100644 index 00000000000..6c3755b3411 --- /dev/null +++ b/idea/testData/copyPaste/literal/UnescapeFullSelection.expected.kt @@ -0,0 +1,3 @@ + + +hello diff --git a/idea/testData/copyPaste/literal/UnescapeFullSelection.kt b/idea/testData/copyPaste/literal/UnescapeFullSelection.kt new file mode 100644 index 00000000000..dfa7049eb7e --- /dev/null +++ b/idea/testData/copyPaste/literal/UnescapeFullSelection.kt @@ -0,0 +1,3 @@ +fun foo(){ + println("\n\nhello") +} \ No newline at end of file diff --git a/idea/testData/copyPaste/literal/UnescapeFullSelection.to.kt b/idea/testData/copyPaste/literal/UnescapeFullSelection.to.kt new file mode 100644 index 00000000000..113fdcf8068 --- /dev/null +++ b/idea/testData/copyPaste/literal/UnescapeFullSelection.to.kt @@ -0,0 +1 @@ + diff --git a/idea/tests/org/jetbrains/kotlin/idea/conversion/copy/LiteralKotlinToKotlinCopyPasteTestGenerated.java b/idea/tests/org/jetbrains/kotlin/idea/conversion/copy/LiteralKotlinToKotlinCopyPasteTestGenerated.java index 9801960a079..e55fc39242b 100644 --- a/idea/tests/org/jetbrains/kotlin/idea/conversion/copy/LiteralKotlinToKotlinCopyPasteTestGenerated.java +++ b/idea/tests/org/jetbrains/kotlin/idea/conversion/copy/LiteralKotlinToKotlinCopyPasteTestGenerated.java @@ -47,4 +47,16 @@ public class LiteralKotlinToKotlinCopyPasteTestGenerated extends AbstractLiteral String fileName = KotlinTestUtils.navigationMetadata("idea/testData/copyPaste/literal/DontEscapeEntries2.kt"); 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); + } }