|
16 | 16 | from typing_extensions import Never |
17 | 17 |
|
18 | 18 |
|
19 | | -FSTRING_TOKENS = dict.fromkeys( |
20 | | - [ |
21 | | - getattr(token, "FSTRING_START", -1), |
22 | | - getattr(token, "FSTRING_MIDDLE", -1), |
23 | | - getattr(token, "FSTRING_END", -1), |
24 | | - ] |
25 | | -) |
| 19 | +FSTRING_START = getattr(token, "FSTRING_START", None) # py3.12+ |
| 20 | +FSTRING_END = getattr(token, "FSTRING_END", None) |
26 | 21 | EMPTY_TOKENS = dict.fromkeys( |
27 | 22 | [ |
28 | 23 | token.COMMENT, |
@@ -294,10 +289,18 @@ def bracket_pairs(tokens: Sequence[TokenInfo]) -> dict[int, int]: |
294 | 289 | elif inv := BRACKETS_INV.get(t.string): |
295 | 290 | ParseError.check(stack, t, "Never opened") |
296 | 291 | begin = stack.pop() |
297 | | - braces[begin] = i |
| 292 | + |
| 293 | + if not (stack and stack[-1] == FSTRING_START): |
| 294 | + braces[begin] = i |
298 | 295 |
|
299 | 296 | b = tokens[begin].string |
300 | 297 | ParseError.check(b == inv, t, f"Mismatched braces '{b}' at {begin}") |
| 298 | + elif FSTRING_START and t.type == FSTRING_START: |
| 299 | + stack.append(FSTRING_START) |
| 300 | + elif FSTRING_END and t.type == FSTRING_END: |
| 301 | + ParseError.check( |
| 302 | + stack.pop() == FSTRING_START, t, "Mismatched FSTRING_START/FSTRING_END" |
| 303 | + ) |
301 | 304 |
|
302 | 305 | if tokens: |
303 | 306 | ParseError.check(not stack, t, "Left open") |
|
0 commit comments