diff --git a/python/src/com/jetbrains/python/validation/FStringsAnnotator.java b/python/src/com/jetbrains/python/validation/FStringsAnnotator.java index fe30e47388ad..3a4484493736 100644 --- a/python/src/com/jetbrains/python/validation/FStringsAnnotator.java +++ b/python/src/com/jetbrains/python/validation/FStringsAnnotator.java @@ -49,6 +49,15 @@ public class FStringsAnnotator extends PyAnnotator { if (fragment.getRightBraceOffset() == -1) { hasUnclosedBrace = true; } + for (int i = fragment.getLeftBraceOffset() + 1; i < fragment.getContentEndOffset(); i++) { + final char c = nodeText.charAt(i); + if (c == '\\') { + reportCharacter(nodeOffset + i, "Expression fragments inside f-strings cannot include backslashes"); + } + else if (c == '#') { + reportCharacter(nodeOffset + i, "Expressions fragments inside f-strings cannot include '#'"); + } + } // Do not warn about illegal conversion character if '!' is right before closing quotes if (fragContentEnd < nodeContentEnd && nodeText.charAt(fragContentEnd) == '!' && fragContentEnd + 1 < nodeContentEnd) { final char conversionChar = nodeText.charAt(fragContentEnd + 1); diff --git a/python/testData/highlighting/fStringBackslashes.py b/python/testData/highlighting/fStringBackslashes.py new file mode 100644 index 000000000000..3713a5ec9543 --- /dev/null +++ b/python/testData/highlighting/fStringBackslashes.py @@ -0,0 +1,5 @@ +f'{\t}' +f'{\t' +f'{\N{GREEK SMALL LETTER ALPHA}}' +f'{Formatable():\n\t}' +f'{42:{\t}}' \ No newline at end of file diff --git a/python/testData/highlighting/fStringHashSigns.py b/python/testData/highlighting/fStringHashSigns.py new file mode 100644 index 000000000000..6201d3648a8d --- /dev/null +++ b/python/testData/highlighting/fStringHashSigns.py @@ -0,0 +1,5 @@ +f'{#' +f'{# +f'{#foo#}' +f'{42:#}' +f'{42:{#}}' \ No newline at end of file diff --git a/python/testSrc/com/jetbrains/python/PythonHighlightingTest.java b/python/testSrc/com/jetbrains/python/PythonHighlightingTest.java index d6d5e88c11db..1c5f58aa50a5 100644 --- a/python/testSrc/com/jetbrains/python/PythonHighlightingTest.java +++ b/python/testSrc/com/jetbrains/python/PythonHighlightingTest.java @@ -320,6 +320,16 @@ public class PythonHighlightingTest extends PyTestCase { runWithLanguageLevel(LanguageLevel.PYTHON36, () -> doTest(true, false)); } + // PY-20773 + public void testFStringHashSigns() { + runWithLanguageLevel(LanguageLevel.PYTHON36, () -> doTest(true, false)); + } + + // PY-20844 + public void testFStringBackslashes() { + runWithLanguageLevel(LanguageLevel.PYTHON36, () -> doTest(true, false)); + } + // --- private void doTest(final LanguageLevel languageLevel, final boolean checkWarnings, final boolean checkInfos) { PythonLanguageLevelPusher.setForcedLanguageLevel(myFixture.getProject(), languageLevel);