Dylan
008bbfdf5a
Disallow implicit concatenation of t-strings and other string types ( #19485 )
...
As of [this cpython PR](https://github.com/python/cpython/pull/135996 ),
it is not allowed to concatenate t-strings with non-t-strings,
implicitly or explicitly. Expressions such as `"foo" t"{bar}"` are now
syntax errors.
This PR updates some AST nodes and parsing to reflect this change.
The structural change is that `TStringPart` is no longer needed, since,
as in the case of `BytesStringLiteral`, the only possibilities are that
we have a single `TString` or a vector of such (representing an implicit
concatenation of t-strings). This removes a level of nesting from many
AST expressions (which is what all the snapshot changes reflect), and
simplifies some logic in the implementation of visitors, for example.
The other change of note is in the parser. When we meet an implicit
concatenation of string-like literals, we now count the number of
t-string literals. If these do not exhaust the total number of
implicitly concatenated pieces, then we emit a syntax error. To recover
from this syntax error, we encode any t-string pieces as _invalid_
string literals (which means we flag them as invalid, record their
range, and record the value as `""`). Note that if at least one of the
pieces is an f-string we prefer to parse the entire string as an
f-string; otherwise we parse it as a string.
This logic is exactly the same as how we currently treat
`BytesStringLiteral` parsing and error recovery - and carries with it
the same pros and cons.
Finally, note that I have not implemented any changes in the
implementation of the formatter. As far as I can tell, none are needed.
I did change a few of the fixtures so that we are always concatenating
t-strings with t-strings.
2025-07-27 12:41:03 +00:00
..
2025-06-13 08:40:11 -04:00
2025-06-13 08:40:11 -04:00
2025-06-13 08:40:11 -04:00
2025-06-13 08:40:11 -04:00
2025-06-13 08:40:11 -04:00
2025-06-13 08:40:11 -04:00
2025-06-13 08:40:11 -04:00
2025-06-13 08:40:11 -04:00
2025-06-13 08:40:11 -04:00
2025-06-13 08:40:11 -04:00
2025-06-13 08:40:11 -04:00
2025-06-13 08:40:11 -04:00
2025-06-13 08:40:11 -04:00
2025-06-13 08:40:11 -04:00
2025-06-13 08:40:11 -04:00
2025-06-13 08:40:11 -04:00
2025-06-13 08:40:11 -04:00
2025-06-13 08:40:11 -04:00
2025-06-13 08:40:11 -04:00
2025-06-13 08:40:11 -04:00
2025-06-13 08:40:11 -04:00
2025-06-13 08:40:11 -04:00
2025-06-13 08:40:11 -04:00
2025-06-13 08:40:11 -04:00
2025-06-13 08:40:11 -04:00
2025-06-13 08:40:11 -04:00
2025-06-13 08:40:11 -04:00
2025-06-13 08:40:11 -04:00
2025-06-13 08:40:11 -04:00
2025-06-13 08:40:11 -04:00
2025-06-13 08:40:11 -04:00
2025-06-13 08:40:11 -04:00
2025-06-13 08:40:11 -04:00
2025-06-13 08:40:11 -04:00
2025-06-13 08:40:11 -04:00
2025-06-13 08:40:11 -04:00
2025-06-13 08:40:11 -04:00
2025-06-13 08:40:11 -04:00
2025-06-13 08:40:11 -04:00
2025-06-13 08:40:11 -04:00
2025-06-13 08:40:11 -04:00
2025-06-13 08:40:11 -04:00
2025-06-13 08:40:11 -04:00
2025-06-13 08:40:11 -04:00
2025-06-13 08:40:11 -04:00
2025-06-13 08:40:11 -04:00
2025-06-13 08:40:11 -04:00
2025-06-13 08:40:11 -04:00
2025-06-13 08:40:11 -04:00
2025-06-13 08:40:11 -04:00
2025-06-13 08:40:11 -04:00
2025-06-13 08:40:11 -04:00
2025-06-13 08:40:11 -04:00
2025-06-13 08:40:11 -04:00
2025-06-13 08:40:11 -04:00
2025-06-13 08:40:11 -04:00
2025-06-13 08:40:11 -04:00
2025-06-13 08:40:11 -04:00
2025-06-13 08:40:11 -04:00
2025-06-13 08:40:11 -04:00
2025-06-13 08:40:11 -04:00
2025-06-13 08:40:11 -04:00
2025-06-13 08:40:11 -04:00
2025-06-13 08:40:11 -04:00
2025-06-13 08:40:11 -04:00
2025-06-13 08:40:11 -04:00
2025-06-13 08:40:11 -04:00
2025-06-13 08:40:11 -04:00
2025-06-13 08:40:11 -04:00
2025-06-13 08:40:11 -04:00
2025-06-13 08:40:11 -04:00
2025-06-13 08:40:11 -04:00
2025-06-13 08:40:11 -04:00
2025-06-13 08:40:11 -04:00
2025-06-13 08:40:11 -04:00
2025-06-13 08:40:11 -04:00
2025-06-13 08:40:11 -04:00
2025-06-13 08:40:11 -04:00
2025-06-13 08:40:11 -04:00
2025-06-13 08:40:11 -04:00
2025-06-13 08:40:11 -04:00
2025-06-13 08:40:11 -04:00
2025-06-13 08:40:11 -04:00
2025-06-13 08:40:11 -04:00
2025-06-13 08:40:11 -04:00
2025-06-13 08:40:11 -04:00
2025-06-13 08:40:11 -04:00
2025-06-13 08:40:11 -04:00
2025-06-13 08:40:11 -04:00
2025-06-13 08:40:11 -04:00
2025-06-13 08:40:11 -04:00
2025-06-13 08:40:11 -04:00
2025-06-13 08:40:11 -04:00
2025-06-13 08:40:11 -04:00
2025-06-13 08:40:11 -04:00
2025-06-13 08:40:11 -04:00
2025-06-13 08:40:11 -04:00
2025-06-13 08:40:11 -04:00
2025-06-13 08:40:11 -04:00
2025-06-13 08:40:11 -04:00
2025-06-13 08:40:11 -04:00
2025-06-13 08:40:11 -04:00
2025-06-13 08:40:11 -04:00
2025-06-13 08:40:11 -04:00
2025-06-13 08:40:11 -04:00
2025-06-13 08:40:11 -04:00
2025-06-13 08:40:11 -04:00
2025-06-13 08:40:11 -04:00
2025-06-13 08:40:11 -04:00
2025-06-13 08:40:11 -04:00
2025-06-13 08:40:11 -04:00
2025-06-13 08:40:11 -04:00
2025-06-13 08:40:11 -04:00
2025-06-13 08:40:11 -04:00
2025-06-13 08:40:11 -04:00
2025-06-13 08:40:11 -04:00
2025-06-13 08:40:11 -04:00
2025-06-13 08:40:11 -04:00
2025-06-13 08:40:11 -04:00
2025-06-13 08:40:11 -04:00
2025-06-13 08:40:11 -04:00
2025-06-13 08:40:11 -04:00
2025-06-13 08:40:11 -04:00
2025-06-13 08:40:11 -04:00
2025-06-13 08:40:11 -04:00
2025-06-13 08:40:11 -04:00
2025-06-13 08:40:11 -04:00
2025-06-13 08:40:11 -04:00
2025-06-13 08:40:11 -04:00
2025-06-13 08:40:11 -04:00
2025-06-13 08:40:11 -04:00
2025-06-13 08:40:11 -04:00
2025-06-13 08:40:11 -04:00
2025-06-13 08:40:11 -04:00
2025-06-13 08:40:11 -04:00
2025-06-13 08:40:11 -04:00
2025-06-13 08:40:11 -04:00
2025-06-13 08:40:11 -04:00
2025-06-13 08:40:11 -04:00
2025-06-13 08:40:11 -04:00
2025-06-13 08:40:11 -04:00
2025-06-13 08:40:11 -04:00
2025-06-13 08:40:11 -04:00
2025-06-13 08:40:11 -04:00
2025-06-13 08:40:11 -04:00
2025-06-13 08:40:11 -04:00
2025-06-13 08:40:11 -04:00
2025-06-13 08:40:11 -04:00
2025-06-13 08:40:11 -04:00
2025-06-13 08:40:11 -04:00
2025-06-13 08:40:11 -04:00
2025-06-13 08:40:11 -04:00
2025-06-13 08:40:11 -04:00
2025-06-13 08:40:11 -04:00
2025-06-13 08:40:11 -04:00
2025-06-13 08:40:11 -04:00
2025-06-13 08:40:11 -04:00
2025-06-13 08:40:11 -04:00
2025-07-27 12:41:03 +00:00
2025-06-13 08:40:11 -04:00
2025-06-13 08:40:11 -04:00
2025-06-13 08:40:11 -04:00
2025-06-13 08:40:11 -04:00
2025-07-20 22:04:14 +00:00
2025-06-13 08:40:11 -04:00
2025-06-13 08:40:11 -04:00
2025-06-13 08:40:11 -04:00
2025-06-13 08:40:11 -04:00
2025-06-13 08:40:11 -04:00
2025-06-13 08:40:11 -04:00
2025-06-13 08:40:11 -04:00
2025-06-13 08:40:11 -04:00
2025-06-13 08:40:11 -04:00
2025-06-13 08:40:11 -04:00
2025-06-13 08:40:11 -04:00
2025-06-13 08:40:11 -04:00
2025-06-13 08:40:11 -04:00
2025-06-13 08:40:11 -04:00
2025-06-13 08:40:11 -04:00
2025-06-13 08:40:11 -04:00
2025-06-13 08:40:11 -04:00
2025-06-13 08:40:11 -04:00
2025-06-13 08:40:11 -04:00
2025-06-13 08:40:11 -04:00
2025-06-13 08:40:11 -04:00
2025-06-13 08:40:11 -04:00
2025-06-13 08:40:11 -04:00
2025-06-13 08:40:11 -04:00
2025-06-13 08:40:11 -04:00
2025-06-13 08:40:11 -04:00
2025-06-13 08:40:11 -04:00
2025-06-13 08:40:11 -04:00
2025-06-13 08:40:11 -04:00
2025-06-13 08:40:11 -04:00
2025-06-13 08:40:11 -04:00
2025-06-13 08:40:11 -04:00
2025-06-13 08:40:11 -04:00
2025-06-13 08:40:11 -04:00
2025-07-20 22:04:14 +00:00
2025-06-13 08:40:11 -04:00
2025-06-13 08:40:11 -04:00
2025-06-13 08:40:11 -04:00
2025-06-13 08:40:11 -04:00
2025-06-13 08:40:11 -04:00
2025-06-13 08:40:11 -04:00
2025-06-13 08:40:11 -04:00
2025-06-13 08:40:11 -04:00
2025-06-13 08:40:11 -04:00
2025-06-13 08:40:11 -04:00
2025-06-13 08:40:11 -04:00
2025-06-13 08:40:11 -04:00
2025-06-13 08:40:11 -04:00
2025-06-13 08:40:11 -04:00
2025-06-13 08:40:11 -04:00
2025-06-13 08:40:11 -04:00
2025-06-13 08:40:11 -04:00
2025-06-13 08:40:11 -04:00
2025-06-13 08:40:11 -04:00
2025-06-13 08:40:11 -04:00
2025-06-13 08:40:11 -04:00
2025-06-13 08:40:11 -04:00
2025-06-13 08:40:11 -04:00
2025-06-13 08:40:11 -04:00
2025-06-13 08:40:11 -04:00
2025-06-13 08:40:11 -04:00
2025-06-13 08:40:11 -04:00
2025-06-13 08:40:11 -04:00
2025-06-13 08:40:11 -04:00
2025-06-13 08:40:11 -04:00
2025-06-13 08:40:11 -04:00
2025-06-13 08:40:11 -04:00
2025-06-13 08:40:11 -04:00
2025-06-13 08:40:11 -04:00
2025-06-13 08:40:11 -04:00
2025-06-13 08:40:11 -04:00
2025-06-13 08:40:11 -04:00
2025-06-13 08:40:11 -04:00
2025-06-13 08:40:11 -04:00
2025-06-13 08:40:11 -04:00
2025-06-13 08:40:11 -04:00
2025-06-13 08:40:11 -04:00
2025-06-13 08:40:11 -04:00
2025-06-13 08:40:11 -04:00
2025-06-13 08:40:11 -04:00
2025-06-13 08:40:11 -04:00
2025-06-13 08:40:11 -04:00
2025-06-13 08:40:11 -04:00
2025-06-13 08:40:11 -04:00
2025-06-13 08:40:11 -04:00
2025-06-13 08:40:11 -04:00
2025-06-13 08:40:11 -04:00
2025-06-13 08:40:11 -04:00
2025-06-13 08:40:11 -04:00
2025-06-13 08:40:11 -04:00
2025-06-13 08:40:11 -04:00
2025-06-13 08:40:11 -04:00
2025-06-13 08:40:11 -04:00
2025-06-13 08:40:11 -04:00
2025-06-13 08:40:11 -04:00
2025-06-13 08:40:11 -04:00
2025-06-13 08:40:11 -04:00
2025-06-13 08:40:11 -04:00
2025-06-13 08:40:11 -04:00
2025-06-13 08:40:11 -04:00
2025-06-13 08:40:11 -04:00
2025-06-13 08:40:11 -04:00
2025-06-13 08:40:11 -04:00
2025-06-13 08:40:11 -04:00
2025-06-13 08:40:11 -04:00
2025-06-13 08:40:11 -04:00
2025-06-13 08:40:11 -04:00
2025-06-13 08:40:11 -04:00
2025-06-13 08:40:11 -04:00
2025-06-18 14:56:15 +02:00
2025-06-13 08:40:11 -04:00
2025-06-13 08:40:11 -04:00
2025-06-13 08:40:11 -04:00
2025-06-13 08:40:11 -04:00
2025-06-13 08:40:11 -04:00
2025-06-13 08:40:11 -04:00
2025-06-13 08:40:11 -04:00
2025-06-13 08:40:11 -04:00
2025-06-13 08:40:11 -04:00
2025-06-13 08:40:11 -04:00
2025-06-13 08:40:11 -04:00
2025-06-13 08:40:11 -04:00
2025-06-13 08:40:11 -04:00
2025-06-13 08:40:11 -04:00
2025-06-13 08:40:11 -04:00
2025-06-13 08:40:11 -04:00
2025-06-13 08:40:11 -04:00
2025-06-13 08:40:11 -04:00
2025-06-13 08:40:11 -04:00
2025-06-13 08:40:11 -04:00
2025-06-13 08:40:11 -04:00
2025-06-13 08:40:11 -04:00
2025-06-13 08:40:11 -04:00
2025-06-13 08:40:11 -04:00
2025-06-13 08:40:11 -04:00
2025-06-13 08:40:11 -04:00
2025-06-13 08:40:11 -04:00
2025-06-13 08:40:11 -04:00
2025-06-13 08:40:11 -04:00
2025-06-13 08:40:11 -04:00
2025-06-13 08:40:11 -04:00
2025-06-13 08:40:11 -04:00
2025-06-13 08:40:11 -04:00
2025-06-13 08:40:11 -04:00
2025-06-13 08:40:11 -04:00
2025-06-13 08:40:11 -04:00
2025-06-13 08:40:11 -04:00
2025-07-27 12:41:03 +00:00
2025-07-27 12:41:03 +00:00
2025-07-27 12:41:03 +00:00
2025-07-27 12:41:03 +00:00
2025-07-27 12:41:03 +00:00
2025-07-27 12:41:03 +00:00
2025-07-27 12:41:03 +00:00
2025-07-27 12:41:03 +00:00
2025-06-13 08:40:11 -04:00
2025-06-13 08:40:11 -04:00
2025-06-13 08:40:11 -04:00
2025-06-13 08:40:11 -04:00
2025-06-13 08:40:11 -04:00
2025-06-13 08:40:11 -04:00
2025-06-13 08:40:11 -04:00
2025-06-13 08:40:11 -04:00
2025-06-13 08:40:11 -04:00
2025-06-13 08:40:11 -04:00
2025-06-13 08:40:11 -04:00
2025-06-13 08:40:11 -04:00
2025-06-13 08:40:11 -04:00
2025-06-13 08:40:11 -04:00
2025-06-13 08:40:11 -04:00
2025-06-13 08:40:11 -04:00
2025-06-13 08:40:11 -04:00
2025-06-13 08:40:11 -04:00
2025-06-13 08:40:11 -04:00
2025-06-13 08:40:11 -04:00
2025-06-13 08:40:11 -04:00
2025-06-13 08:40:11 -04:00
2025-06-13 08:40:11 -04:00
2025-06-18 14:56:15 +02:00
2025-06-13 08:40:11 -04:00
2025-06-13 08:40:11 -04:00
2025-06-13 08:40:11 -04:00
2025-06-13 08:40:11 -04:00
2025-06-13 08:40:11 -04:00
2025-06-13 08:40:11 -04:00
2025-06-13 08:40:11 -04:00
2025-06-13 08:40:11 -04:00
2025-06-13 08:40:11 -04:00
2025-06-13 08:40:11 -04:00
2025-06-13 08:40:11 -04:00
2025-06-13 08:40:11 -04:00
2025-06-13 08:40:11 -04:00
2025-06-13 08:40:11 -04:00
2025-06-13 08:40:11 -04:00
2025-06-13 08:40:11 -04:00
2025-06-13 08:40:11 -04:00
2025-06-13 08:40:11 -04:00
2025-06-13 08:40:11 -04:00
2025-06-13 08:40:11 -04:00
2025-06-13 08:40:11 -04:00
2025-06-13 08:40:11 -04:00
2025-06-13 08:40:11 -04:00
2025-06-13 08:40:11 -04:00
2025-06-13 08:40:11 -04:00
2025-06-13 08:40:11 -04:00
2025-06-13 08:40:11 -04:00
2025-06-13 08:40:11 -04:00
2025-06-13 08:40:11 -04:00
2025-06-13 08:40:11 -04:00
2025-06-13 08:40:11 -04:00
2025-06-13 08:40:11 -04:00
2025-06-13 08:40:11 -04:00
2025-06-13 08:40:11 -04:00
2025-06-13 08:40:11 -04:00
2025-06-13 08:40:11 -04:00
2025-06-13 08:40:11 -04:00
2025-06-13 08:40:11 -04:00
2025-06-13 08:40:11 -04:00
2025-06-13 08:40:11 -04:00
2025-06-13 08:40:11 -04:00
2025-06-13 08:40:11 -04:00
2025-06-13 08:40:11 -04:00
2025-06-13 08:40:11 -04:00
2025-06-13 08:40:11 -04:00
2025-06-13 08:40:11 -04:00
2025-06-13 08:40:11 -04:00
2025-06-13 08:40:11 -04:00
2025-06-13 08:40:11 -04:00
2025-06-13 08:40:11 -04:00
2025-06-13 08:40:11 -04:00
2025-06-13 08:40:11 -04:00
2025-06-13 08:40:11 -04:00
2025-06-13 08:40:11 -04:00
2025-06-13 08:40:11 -04:00
2025-06-13 08:40:11 -04:00
2025-06-13 08:40:11 -04:00
2025-06-13 08:40:11 -04:00
2025-06-13 08:40:11 -04:00
2025-06-13 08:40:11 -04:00
2025-07-27 12:41:03 +00:00
2025-06-13 08:40:11 -04:00
2025-06-13 08:40:11 -04:00
2025-06-13 08:40:11 -04:00
2025-06-13 08:40:11 -04:00
2025-06-13 08:40:11 -04:00
2025-06-13 08:40:11 -04:00
2025-06-13 08:40:11 -04:00
2025-06-13 08:40:11 -04:00
2025-06-13 08:40:11 -04:00
2025-06-13 08:40:11 -04:00
2025-06-13 08:40:11 -04:00
2025-06-13 08:40:11 -04:00
2025-06-13 08:40:11 -04:00
2025-06-13 08:40:11 -04:00
2025-06-13 08:40:11 -04:00
2025-06-13 08:40:11 -04:00
2025-06-13 08:40:11 -04:00
2025-06-13 08:40:11 -04:00
2025-06-13 08:40:11 -04:00
2025-06-13 08:40:11 -04:00
2025-06-13 08:40:11 -04:00
2025-06-13 08:40:11 -04:00
2025-06-13 08:40:11 -04:00
2025-06-13 08:40:11 -04:00
2025-06-13 08:40:11 -04:00
2025-06-13 08:40:11 -04:00
2025-06-13 08:40:11 -04:00
2025-06-13 08:40:11 -04:00
2025-06-13 08:40:11 -04:00
2025-06-13 08:40:11 -04:00
2025-06-13 08:40:11 -04:00
2025-06-13 08:40:11 -04:00
2025-06-13 08:40:11 -04:00
2025-06-13 08:40:11 -04:00
2025-06-13 08:40:11 -04:00
2025-06-13 08:40:11 -04:00
2025-06-13 08:40:11 -04:00
2025-06-13 08:40:11 -04:00
2025-06-13 08:40:11 -04:00
2025-06-13 08:40:11 -04:00
2025-06-13 08:40:11 -04:00
2025-06-13 08:40:11 -04:00
2025-06-13 08:40:11 -04:00
2025-06-13 08:40:11 -04:00
2025-06-13 08:40:11 -04:00
2025-06-13 08:40:11 -04:00
2025-06-13 08:40:11 -04:00
2025-06-13 08:40:11 -04:00
2025-06-13 08:40:11 -04:00
2025-06-13 08:40:11 -04:00
2025-06-13 08:40:11 -04:00
2025-06-13 08:40:11 -04:00
2025-06-13 08:40:11 -04:00
2025-06-13 08:40:11 -04:00
2025-06-13 08:40:11 -04:00
2025-06-13 08:40:11 -04:00
2025-06-13 08:40:11 -04:00
2025-06-13 08:40:11 -04:00
2025-06-13 08:40:11 -04:00
2025-06-13 08:40:11 -04:00
2025-06-13 08:40:11 -04:00
2025-07-27 12:41:03 +00:00
2025-06-13 08:40:11 -04:00
2025-06-13 08:40:11 -04:00
2025-06-13 08:40:11 -04:00
2025-06-13 08:40:11 -04:00
2025-06-13 08:40:11 -04:00
2025-06-13 08:40:11 -04:00
2025-06-13 08:40:11 -04:00
2025-06-13 08:40:11 -04:00
2025-06-13 08:40:11 -04:00
2025-06-13 08:40:11 -04:00
2025-06-13 08:40:11 -04:00
2025-06-13 08:40:11 -04:00
2025-06-13 08:40:11 -04:00
2025-06-13 08:40:11 -04:00
2025-06-13 08:40:11 -04:00
2025-06-13 08:40:11 -04:00
2025-06-13 08:40:11 -04:00
2025-06-13 08:40:11 -04:00
2025-06-13 08:40:11 -04:00
2025-06-13 08:40:11 -04:00
2025-06-13 08:40:11 -04:00
2025-06-13 08:40:11 -04:00
2025-06-13 08:40:11 -04:00
2025-06-13 08:40:11 -04:00
2025-06-13 08:40:11 -04:00
2025-06-13 08:40:11 -04:00
2025-06-13 08:40:11 -04:00
2025-07-27 12:41:03 +00:00
2025-06-13 08:40:11 -04:00
2025-06-13 08:40:11 -04:00
2025-06-13 08:40:11 -04:00
2025-06-13 08:40:11 -04:00
2025-06-13 08:40:11 -04:00
2025-06-13 08:40:11 -04:00
2025-06-13 08:40:11 -04:00
2025-06-13 08:40:11 -04:00
2025-06-13 08:40:11 -04:00
2025-06-13 08:40:11 -04:00
2025-06-13 08:40:11 -04:00
2025-06-13 08:40:11 -04:00