|
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