PY-20776 Do not warn about empty expression fragment at the end of f-string
authorMikhail Golubev <mikhail.golubev@jetbrains.com>
Tue, 4 Oct 2016 11:40:19 +0000 (14:40 +0300)
committerMikhail Golubev <mikhail.golubev@jetbrains.com>
Wed, 5 Oct 2016 13:11:37 +0000 (16:11 +0300)
Error about missing right brace seems to be enough in this case, no need
to stack messages about the same text range.

python/src/com/jetbrains/python/validation/FStringsAnnotator.java
python/testData/highlighting/fStringEmptyExpressions.py
python/testData/highlighting/fStringMissingRightBrace.py

index e86a33e2a608de12dc96bc283cc51d8cb6f28425..e15ce2f7086a8d689f4ca6890b6546839c3d2ce5 100644 (file)
@@ -39,8 +39,11 @@ public class FStringsAnnotator extends PyAnnotator {
         final FStringParser.ParseResult result = FStringParser.parse(nodeText);
         TextRange unclosedBraceRange = null;
         for (Fragment fragment : result.getFragments()) {
-          final int fragmentEndOffset = fragment.getRightBraceOffset() == -1 ? nodeContentEnd : fragment.getRightBraceOffset() + 1;
-          final TextRange wholeFragmentRange = TextRange.create(fragment.getLeftBraceOffset(), fragmentEndOffset);
+          final int fragLeftBrace = fragment.getLeftBraceOffset();
+          final int fragContentEnd = fragment.getContentEndOffset();
+          final int fragRightBrace = fragment.getRightBraceOffset();
+
+          final TextRange wholeFragmentRange = TextRange.create(fragLeftBrace, fragRightBrace == -1 ? nodeContentEnd : fragRightBrace + 1);
           if (fragment.getDepth() > 2) {
             // Do not report anything about expression fragments nested deeper that three times
             if (fragment.getDepth() == 3) {
@@ -48,22 +51,19 @@ public class FStringsAnnotator extends PyAnnotator {
             }
             continue;
           }
-          final int fragContentEnd = fragment.getContentEndOffset();
-          if (CharArrayUtil.isEmptyOrSpaces(nodeText, fragment.getLeftBraceOffset() + 1, fragContentEnd)) {
-            final int endOffset = fragContentEnd == nodeContentEnd ? fragContentEnd : fragContentEnd + 1;
-            final TextRange range = TextRange.create(fragment.getLeftBraceOffset(), endOffset);
+          if (CharArrayUtil.isEmptyOrSpaces(nodeText, fragLeftBrace + 1, fragContentEnd) && fragContentEnd < nodeContentEnd) {
+            final TextRange range = TextRange.create(fragLeftBrace, fragContentEnd + 1);
             report("Empty expression fragments are not allowed inside f-strings", range, node);
           }
-          if (fragment.getRightBraceOffset() == -1 && unclosedBraceRange == null) {
+          if (fragRightBrace == -1 && unclosedBraceRange == null) {
             unclosedBraceRange = wholeFragmentRange;
           }
           if (fragment.getFirstHashOffset() != -1) {
             final TextRange range = TextRange.create(fragment.getFirstHashOffset(), fragment.getContentEndOffset());
             report("Expression fragments inside f-strings cannot include line comments", range, node);
           }
-          for (int i = fragment.getLeftBraceOffset() + 1; i < fragment.getContentEndOffset(); i++) {
-            final char c = nodeText.charAt(i);
-            if (c == '\\') {
+          for (int i = fragLeftBrace + 1; i < fragment.getContentEndOffset(); i++) {
+            if (nodeText.charAt(i) == '\\') {
               reportCharacter("Expression fragments inside f-strings cannot include backslashes", i, node);
             }
           }
@@ -71,7 +71,7 @@ public class FStringsAnnotator extends PyAnnotator {
           if (fragContentEnd < nodeContentEnd && nodeText.charAt(fragContentEnd) == '!' && fragContentEnd + 1 < nodeContentEnd) {
             final char conversionChar = nodeText.charAt(fragContentEnd + 1);
             // No conversion character -- highlight only "!"
-            if (fragContentEnd + 1 == fragment.getRightBraceOffset() || conversionChar == ':') {
+            if (fragContentEnd + 1 == fragRightBrace || conversionChar == ':') {
               reportCharacter("Conversion character is expected: should be one of 's', 'r', 'a'", fragContentEnd, node);
             }
             // Wrong conversion character -- highlight both "!" and the following symbol
index e63fd7b45bcae568e8d035b79a63c4e2eb74d8ed..0600fc8bcecb1767bc517657b368f10f719c9e35 100644 (file)
@@ -1,10 +1,10 @@
 f'<error descr="Empty expression fragments are not allowed inside f-strings">{}</error>'
-f'<error descr="'}' is expected"><error descr="Empty expression fragments are not allowed inside f-strings">{</error></error>'
-<error descr="Missing closing quote [']">f'<error descr="'}' is expected"><error descr="Empty expression fragments are not allowed inside f-strings">{</error></error></error>
+f'<error descr="'}' is expected">{</error>'
+<error descr="Missing closing quote [']">f'<error descr="'}' is expected">{</error></error>
 f'<error descr="Empty expression fragments are not allowed inside f-strings">{!</error>r}'
 f'<error descr="Empty expression fragments are not allowed inside f-strings">{:</error>2.3}'
 f'{42:2.<error descr="Empty expression fragments are not allowed inside f-strings">{}</error>}'
 f'<error descr="Empty expression fragments are not allowed inside f-strings">{  }</error>'
 f'{42:<error descr="Empty expression fragments are not allowed inside f-strings">{ }</error>}'
-f'<error descr="'}' is expected"><error descr="Empty expression fragments are not allowed inside f-strings">{  :</error><error descr="Empty expression fragments are not allowed inside f-strings">{  </error></error>'
+f'<error descr="'}' is expected"><error descr="Empty expression fragments are not allowed inside f-strings">{  :</error>{  </error>'
 f'<error descr="Empty expression fragments are not allowed inside f-strings">{    !</error>r:<error descr="Empty expression fragments are not allowed inside f-strings">{   :</error>42}}'
\ No newline at end of file
index ba19ada7fd9b986bb909b3dc9fa9dc1160328a56..cf292f995b5edd870d4736b2be1ecd0770e18075 100644 (file)
@@ -3,8 +3,8 @@ f'{42!r}'
 f'{42!r:03}'
 f'{42:03}'
 f'{42!r:{y}.{z}}'
-f'<error descr="'}' is expected"><error descr="Empty expression fragments are not allowed inside f-strings">{</error></error>'
-f'<error descr="'}' is expected">{42:<error descr="Empty expression fragments are not allowed inside f-strings">{</error></error>'
-f'<error descr="'}' is expected">{42!r:<error descr="Empty expression fragments are not allowed inside f-strings">{</error></error>'
+f'<error descr="'}' is expected">{</error>'
+f'<error descr="'}' is expected">{42:{</error>'
+f'<error descr="'}' is expected">{42!r:{</error>'
 f'{{'
-f'{{<error descr="'}' is expected"><error descr="Empty expression fragments are not allowed inside f-strings">{</error></error>'
\ No newline at end of file
+f'{{<error descr="'}' is expected">{</error>'
\ No newline at end of file