From 6b36fb041d46406fd43119805dccc1e04e3550d1 Mon Sep 17 00:00:00 2001 From: Mikhail Golubev Date: Thu, 9 Jan 2020 22:37:09 +0900 Subject: [PATCH] PY-24232 Remove escaping from "%" signs when converting printf-style formatted strings to f-strings GitOrigin-RevId: bd19cad899cee5d93c518b76a990a51c7048442a --- .../BaseConvertToFStringProcessor.java | 14 ++++++++------ .../NewStyleConvertToFStringProcessor.java | 9 +++++++-- .../OldStyleConvertToFStringProcessor.java | 7 ++++++- ...centOperatorRemovingEscapingFromPercentSigns.py | 1 + ...eratorRemovingEscapingFromPercentSigns_after.py | 1 + .../PyConvertToFStringIntentionTest.java | 7 ++++++- 6 files changed, 29 insertions(+), 10 deletions(-) create mode 100644 python/testData/intentions/PyConvertToFStringIntentionTest/percentOperatorRemovingEscapingFromPercentSigns.py create mode 100644 python/testData/intentions/PyConvertToFStringIntentionTest/percentOperatorRemovingEscapingFromPercentSigns_after.py diff --git a/python/src/com/jetbrains/python/codeInsight/intentions/convertToFString/BaseConvertToFStringProcessor.java b/python/src/com/jetbrains/python/codeInsight/intentions/convertToFString/BaseConvertToFStringProcessor.java index 8658687ad806..174160daadce 100644 --- a/python/src/com/jetbrains/python/codeInsight/intentions/convertToFString/BaseConvertToFStringProcessor.java +++ b/python/src/com/jetbrains/python/codeInsight/intentions/convertToFString/BaseConvertToFStringProcessor.java @@ -82,15 +82,15 @@ public abstract class BaseConvertToFStringProcessor escaped = new ArrayList<>(); diff --git a/python/src/com/jetbrains/python/codeInsight/intentions/convertToFString/OldStyleConvertToFStringProcessor.java b/python/src/com/jetbrains/python/codeInsight/intentions/convertToFString/OldStyleConvertToFStringProcessor.java index 9ab21f23f6bf..2dfd0a6b12c1 100644 --- a/python/src/com/jetbrains/python/codeInsight/intentions/convertToFString/OldStyleConvertToFStringProcessor.java +++ b/python/src/com/jetbrains/python/codeInsight/intentions/convertToFString/OldStyleConvertToFStringProcessor.java @@ -85,7 +85,7 @@ public class OldStyleConvertToFStringProcessor extends BaseConvertToFStringProce } @Override - protected boolean convertSubstitutionChunk(@NotNull SubstitutionChunk subsChunk, @NotNull StringBuilder fStringText) { + protected boolean processSubstitutionChunk(@NotNull SubstitutionChunk subsChunk, @NotNull StringBuilder fStringText) { final char conversionChar = subsChunk.getConversionType(); String widthAndPrecision = StringUtil.notNullize(subsChunk.getWidth()); @@ -133,4 +133,9 @@ public class OldStyleConvertToFStringProcessor extends BaseConvertToFStringProce fStringText.append("}"); return true; } + + @Override + protected void processLiteralChunk(@NotNull String chunk, @NotNull StringBuilder fStringText) { + fStringText.append(chunk.replace("%%", "%")); + } } diff --git a/python/testData/intentions/PyConvertToFStringIntentionTest/percentOperatorRemovingEscapingFromPercentSigns.py b/python/testData/intentions/PyConvertToFStringIntentionTest/percentOperatorRemovingEscapingFromPercentSigns.py new file mode 100644 index 000000000000..fc6218a52e35 --- /dev/null +++ b/python/testData/intentions/PyConvertToFStringIntentionTest/percentOperatorRemovingEscapingFromPercentSigns.py @@ -0,0 +1 @@ +'%%%d%%' % 42 \ No newline at end of file diff --git a/python/testData/intentions/PyConvertToFStringIntentionTest/percentOperatorRemovingEscapingFromPercentSigns_after.py b/python/testData/intentions/PyConvertToFStringIntentionTest/percentOperatorRemovingEscapingFromPercentSigns_after.py new file mode 100644 index 000000000000..01d9916a09f5 --- /dev/null +++ b/python/testData/intentions/PyConvertToFStringIntentionTest/percentOperatorRemovingEscapingFromPercentSigns_after.py @@ -0,0 +1 @@ +f'%{42:d}%' \ No newline at end of file diff --git a/python/testSrc/com/jetbrains/python/intentions/PyConvertToFStringIntentionTest.java b/python/testSrc/com/jetbrains/python/intentions/PyConvertToFStringIntentionTest.java index f74673d9a033..62b49bbde252 100644 --- a/python/testSrc/com/jetbrains/python/intentions/PyConvertToFStringIntentionTest.java +++ b/python/testSrc/com/jetbrains/python/intentions/PyConvertToFStringIntentionTest.java @@ -88,11 +88,16 @@ public class PyConvertToFStringIntentionTest extends PyIntentionTestCase { public void testPercentOperatorExpressionContainsOriginalHostQuote() { doNegativeTest(); } - + public void testPercentOperatorExpressionContainsAlternativeHostQuote() { doNegativeTest(); } + // PY-24232 + public void testPercentOperatorRemovingEscapingFromPercentSigns() { + doTest(); + } + public void testFormatMethodSimple() { doTest(); }