From ec2be1db09686ce35bfdf930af7fb4cdd2c45bfc Mon Sep 17 00:00:00 2001 From: Ekaterina Tuzova Date: Mon, 10 Jan 2011 17:00:48 +0300 Subject: [PATCH] fixed PY-2656 "Convert double quoted string to single quoted" intention incorrectly changes escaped quotes inside the string --- .../intentions/PyQuotedStringIntention.java | 40 +++++++++++++------ .../intentions/afterEscapedQuotedString.py | 1 + .../intentions/beforeEscapedQuotedString.py | 1 + .../com/jetbrains/python/PyIntentionTest.java | 4 ++ 4 files changed, 34 insertions(+), 12 deletions(-) create mode 100644 python/testData/intentions/afterEscapedQuotedString.py create mode 100644 python/testData/intentions/beforeEscapedQuotedString.py diff --git a/python/src/com/jetbrains/python/codeInsight/intentions/PyQuotedStringIntention.java b/python/src/com/jetbrains/python/codeInsight/intentions/PyQuotedStringIntention.java index cd3abda76f3b..e349cc1e6dda 100644 --- a/python/src/com/jetbrains/python/codeInsight/intentions/PyQuotedStringIntention.java +++ b/python/src/com/jetbrains/python/codeInsight/intentions/PyQuotedStringIntention.java @@ -3,21 +3,15 @@ package com.jetbrains.python.codeInsight.intentions; import com.intellij.codeInsight.intention.impl.BaseIntentionAction; import com.intellij.openapi.editor.Editor; import com.intellij.openapi.project.Project; -import com.intellij.psi.PsiElement; import com.intellij.psi.PsiFile; import com.intellij.psi.util.PsiTreeUtil; import com.intellij.util.IncorrectOperationException; import com.jetbrains.python.PyBundle; -import com.jetbrains.python.PyTokenTypes; -import com.jetbrains.python.psi.*; -import com.jetbrains.python.psi.types.PyType; -import com.jetbrains.python.psi.types.TypeEvalContext; +import com.jetbrains.python.psi.PyDocStringOwner; +import com.jetbrains.python.psi.PyElementGenerator; +import com.jetbrains.python.psi.PyStringLiteralExpression; import org.jetbrains.annotations.NotNull; -import java.util.ArrayList; -import java.util.Collection; -import java.util.List; - /** * User: catherine * Intention to convert between single-quoted and double-quoted strings @@ -75,13 +69,24 @@ public class PyQuotedStringIntention extends BaseIntentionAction { private static String convertDoubleToSingleQuoted(String stringText) { StringBuilder stringBuilder = new StringBuilder(); - for (char ch : stringText.toCharArray()) { + boolean skipNext = false; + char[] charArr = stringText.toCharArray(); + for (int i = 0; i != charArr.length; ++i) { + char ch = charArr[i]; + if (skipNext) { + skipNext = false; + continue; + } if (ch == '"') { - stringBuilder.append('\''); + stringBuilder.append('\''); } else if (ch == '\'') { stringBuilder.append("\\\'"); } + else if (ch == '\\') { + skipNext = true; + stringBuilder.append(charArr[i+1]); + } else { stringBuilder.append(ch); } @@ -91,13 +96,24 @@ public class PyQuotedStringIntention extends BaseIntentionAction { private static String convertSingleToDoubleQuoted(String stringText) { StringBuilder stringBuilder = new StringBuilder(); - for (char ch : stringText.toCharArray()) { + boolean skipNext = false; + char[] charArr = stringText.toCharArray(); + for (int i = 0; i != charArr.length; ++i) { + char ch = charArr[i]; + if (skipNext) { + skipNext = false; + continue; + } if (ch == '\'') { stringBuilder.append('"'); } else if (ch == '"') { stringBuilder.append("\\\""); } + else if (ch == '\\') { + skipNext = true; + stringBuilder.append(charArr[i+1]); + } else { stringBuilder.append(ch); } diff --git a/python/testData/intentions/afterEscapedQuotedString.py b/python/testData/intentions/afterEscapedQuotedString.py new file mode 100644 index 000000000000..beef3e24d7f2 --- /dev/null +++ b/python/testData/intentions/afterEscapedQuotedString.py @@ -0,0 +1 @@ +myStr = "Why couldn't we get along?" \ No newline at end of file diff --git a/python/testData/intentions/beforeEscapedQuotedString.py b/python/testData/intentions/beforeEscapedQuotedString.py new file mode 100644 index 000000000000..b2c7a6cda56d --- /dev/null +++ b/python/testData/intentions/beforeEscapedQuotedString.py @@ -0,0 +1 @@ +myStr = 'Why couldn\'t we get along?' \ No newline at end of file diff --git a/python/testSrc/com/jetbrains/python/PyIntentionTest.java b/python/testSrc/com/jetbrains/python/PyIntentionTest.java index 92b0e2659fd7..c419d94d5b27 100644 --- a/python/testSrc/com/jetbrains/python/PyIntentionTest.java +++ b/python/testSrc/com/jetbrains/python/PyIntentionTest.java @@ -141,6 +141,10 @@ public class PyIntentionTest extends PyLightFixtureTestCase { doTest(PyBundle.message("INTN.quoted.string.double.to.single")); } + public void testEscapedQuotedString() { //PY-2656 + doTest(PyBundle.message("INTN.quoted.string.single.to.double")); + } + public void testConvertLambdaToFunction() { doTest(PyBundle.message("INTN.convert.lambda.to.function")); }