From c42128d115413e78edcc0f0a3fc869fe0ffb121a Mon Sep 17 00:00:00 2001 From: "Maxim.Medvedev" Date: Tue, 22 Nov 2011 17:05:27 +0400 Subject: [PATCH] unescape copied text from regexps --- .../StringLiteralCopyPasteProcessor.java | 9 +++++-- .../openapi/util/text/StringUtil.java | 26 +++++++++++++++++++ .../GroovyLiteralCopyPasteProcessor.java | 20 +++++++++++++- .../plugins/groovy/GroovyCopyPasteTest.groovy | 2 +- 4 files changed, 53 insertions(+), 4 deletions(-) diff --git a/java/java-impl/src/com/intellij/codeInsight/editorActions/StringLiteralCopyPasteProcessor.java b/java/java-impl/src/com/intellij/codeInsight/editorActions/StringLiteralCopyPasteProcessor.java index 2f55b0e977f6..1c0f2fadb351 100644 --- a/java/java-impl/src/com/intellij/codeInsight/editorActions/StringLiteralCopyPasteProcessor.java +++ b/java/java-impl/src/com/intellij/codeInsight/editorActions/StringLiteralCopyPasteProcessor.java @@ -98,7 +98,7 @@ public class StringLiteralCopyPasteProcessor implements CopyPastePreProcessor { numberOfSymbolsToCopy = Math.min(escapedEndOffset, fileEndOffset) - Math.max(fileStartOffset, escapedStartOffset); if (numberOfSymbolsToCopy > 0) { textWasChanged = true; - buffer.append(unescapeStringCharacters(text.substring(givenTextStartOffset, givenTextStartOffset + numberOfSymbolsToCopy))); + buffer.append(unescape(text.substring(givenTextStartOffset, givenTextStartOffset + numberOfSymbolsToCopy), element)); givenTextStartOffset += numberOfSymbolsToCopy; } @@ -112,7 +112,12 @@ public class StringLiteralCopyPasteProcessor implements CopyPastePreProcessor { } return textWasChanged ? buffer.toString() : null; } - + + @NotNull + protected String unescape(String text, PsiElement token) { + return unescapeStringCharacters(text); + } + public String preprocessOnPaste(final Project project, final PsiFile file, final Editor editor, String text, final RawText rawText) { final Document document = editor.getDocument(); PsiDocumentManager.getInstance(project).commitDocument(document); diff --git a/platform/util/src/com/intellij/openapi/util/text/StringUtil.java b/platform/util/src/com/intellij/openapi/util/text/StringUtil.java index 01ed5a5a4d42..09abebf8f37d 100644 --- a/platform/util/src/com/intellij/openapi/util/text/StringUtil.java +++ b/platform/util/src/com/intellij/openapi/util/text/StringUtil.java @@ -1655,6 +1655,32 @@ public class StringUtil { idx += 2; } } + + public static String unescapeSlashes(@NotNull final String str) { + final StringBuilder buf = StringBuilderSpinAllocator.alloc(); + try { + unescapeSlashes(buf, str); + return buf.toString(); + } + finally { + StringBuilderSpinAllocator.dispose(buf); + } + } + + private static void unescapeSlashes(StringBuilder buf, String str) { + final int length = str.length(); + final int last = length - 1; + for (int i = 0; i < length; i++) { + char ch = str.charAt(i); + if (ch == '\\' && i != last) { + i++; + ch = str.charAt(i); + if (ch != '/') buf.append('\\'); + } + + buf.append(ch); + } + } public static void quote(@NotNull final StringBuilder builder) { quote(builder, '\"'); diff --git a/plugins/groovy/src/org/jetbrains/plugins/groovy/lang/editor/GroovyLiteralCopyPasteProcessor.java b/plugins/groovy/src/org/jetbrains/plugins/groovy/lang/editor/GroovyLiteralCopyPasteProcessor.java index 304cc0956644..016eeba65cc0 100644 --- a/plugins/groovy/src/org/jetbrains/plugins/groovy/lang/editor/GroovyLiteralCopyPasteProcessor.java +++ b/plugins/groovy/src/org/jetbrains/plugins/groovy/lang/editor/GroovyLiteralCopyPasteProcessor.java @@ -64,7 +64,12 @@ public class GroovyLiteralCopyPasteProcessor extends StringLiteralCopyPasteProce IElementType tokenType = token.getNode().getElementType(); if (tokenType == mREGEX_CONTENT || tokenType == mREGEX_LITERAL) { - return StringUtil.escapeSlashes(s); + if (escapeSlashes) { + return StringUtil.escapeSlashes(s); + } + else { + return s; + } } String chars; @@ -87,4 +92,17 @@ public class GroovyLiteralCopyPasteProcessor extends StringLiteralCopyPasteProce StringUtil.escapeStringCharacters(s.length(), s, chars, escapeSlashes, buffer); return buffer.toString(); } + + @NotNull + @Override + protected String unescape(String text, PsiElement token) { + final IElementType tokenType = token.getNode().getElementType(); + + if (tokenType == mREGEX_CONTENT || tokenType == mREGEX_LITERAL) { + return StringUtil.unescapeSlashes(text); + } + + return super.unescape(text, token); + } + } diff --git a/plugins/groovy/test/org/jetbrains/plugins/groovy/GroovyCopyPasteTest.groovy b/plugins/groovy/test/org/jetbrains/plugins/groovy/GroovyCopyPasteTest.groovy index fdc8f2c63eb0..03ecee6658ae 100644 --- a/plugins/groovy/test/org/jetbrains/plugins/groovy/GroovyCopyPasteTest.groovy +++ b/plugins/groovy/test/org/jetbrains/plugins/groovy/GroovyCopyPasteTest.groovy @@ -54,7 +54,7 @@ class GroovyCopyPasteTest extends LightCodeInsightFixtureTestCase { myFixture.performEditorAction IdeActions.ACTION_COPY myFixture.configureByText 'b.groovy', 'def x = "smthh"' myFixture.performEditorAction IdeActions.ACTION_PASTE - myFixture.checkResult 'def x = "smth$ah"' + myFixture.checkResult 'def x = "smth\\$ah"' }