mirror of
https://gitflic.ru/project/openide/openide.git
synced 2026-09-27 10:03:11 +07:00
PY-20776 Do not warn about empty expression fragment at the end of f-string
Error about missing right brace seems to be enough in this case, no need to stack messages about the same text range.
This commit is contained in:
@@ -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
|
||||
|
||||
@@ -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}}'
|
||||
@@ -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>'
|
||||
f'{{<error descr="'}' is expected">{</error>'
|
||||
Reference in New Issue
Block a user