Disallow implicit concatenation of t-strings and other string types (#19485)
Some checks are pending
CI / Determine changes (push) Waiting to run
CI / cargo fmt (push) Waiting to run
CI / cargo clippy (push) Blocked by required conditions
CI / cargo test (linux) (push) Blocked by required conditions
CI / cargo test (linux, release) (push) Blocked by required conditions
CI / cargo test (windows) (push) Blocked by required conditions
CI / cargo test (wasm) (push) Blocked by required conditions
CI / cargo build (release) (push) Waiting to run
CI / cargo build (msrv) (push) Blocked by required conditions
CI / cargo fuzz build (push) Blocked by required conditions
CI / fuzz parser (push) Blocked by required conditions
CI / test scripts (push) Blocked by required conditions
CI / ecosystem (push) Blocked by required conditions
CI / Fuzz for new ty panics (push) Blocked by required conditions
CI / cargo shear (push) Blocked by required conditions
CI / python package (push) Waiting to run
CI / pre-commit (push) Waiting to run
CI / mkdocs (push) Waiting to run
CI / formatter instabilities and black similarity (push) Blocked by required conditions
CI / test ruff-lsp (push) Blocked by required conditions
CI / check playground (push) Blocked by required conditions
CI / benchmarks-instrumented (push) Blocked by required conditions
CI / benchmarks-walltime (push) Blocked by required conditions
[ty Playground] Release / publish (push) Waiting to run

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.
This commit is contained in:
Dylan 2025-07-27 07:41:03 -05:00 committed by GitHub
parent df5eba7583
commit 008bbfdf5a
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
75 changed files with 4509 additions and 6294 deletions

View file

@ -3,4 +3,3 @@ t"{hey}"
t'{there}'
t"""what's
happening?"""
"implicitly"t"concatenated"

View file

@ -3,4 +3,3 @@ t"{hey}"
t'{there}'
t"""what's
happening?"""
"implicitly"t"concatenated"

View file

@ -17,7 +17,7 @@ t"{ foo = !s }"
t"{ 1, 2 = }"
t'{t"{3.1415=:.1f}":*^20}'
{"foo " t"bar {x + y} " "baz": 10}
{t"foo " t"bar {x + y} " t"baz": 10}
match foo:
case "one":
pass
@ -44,31 +44,18 @@ t"{x=!a}"
t"{x:.3f!r =}"
t"{x = !r :.3f}"
t"{x:.3f=!r}"
"hello" t"{x}"
t"hello" t"{x}"
t"{x}" t"{y}"
t"{x}" "world"
t"{x}" t"world"
t"Invalid args in command: {command, *args}"
"foo" t"{x}" "bar"
t"foo" t"{x}" t"bar"
(
t"a"
t"b"
"c"
t"c"
rt"d"
fr"e"
tr"e"
)
# With unicode strings
u"foo" t"{bar}" "baz" " some"
"foo" t"{bar}" u"baz" " some"
"foo" t"{bar}" "baz" u" some"
u"foo" t"bar {baz} really" u"bar" "no"
# With f-strings
f"{this}" t"{that}"
t"{this}"f"{that}"
t"{this}" "that" f"{other}"
f"one {this} two" "that" t"three {other} four"
# Nesting
t"{f"{t"{this}"}"}"

View file

@ -1,4 +1,3 @@
use std::cmp::Ordering;
use std::ops::Deref;
use bitflags::bitflags;
@ -1256,7 +1255,6 @@ impl<'src> Parser<'src> {
// t'{there}'
// t"""what's
// happening?"""
// "implicitly"t"concatenated"
// test_err template_strings_py313
// # parse_options: {"target-version": "3.13"}
@ -1264,7 +1262,6 @@ impl<'src> Parser<'src> {
// t'{there}'
// t"""what's
// happening?"""
// "implicitly"t"concatenated"
let string_type = StringType::TString(
self.parse_interpolated_string(InterpolatedStringKind::TString)
.into(),
@ -1281,7 +1278,7 @@ impl<'src> Parser<'src> {
match strings.len() {
// This is not possible as the function was called by matching against a
// `String` or `FStringStart` token.
// `String`, `FStringStart`, or `TStringStart` token.
0 => unreachable!("Expected to parse at least one string"),
// We need a owned value, hence the `pop` here.
1 => match strings.pop().unwrap() {
@ -1322,58 +1319,84 @@ impl<'src> Parser<'src> {
) -> Expr {
assert!(strings.len() > 1);
let mut has_tstring = false;
let mut has_fstring = false;
let mut byte_literal_count = 0;
let mut tstring_count = 0;
for string in &strings {
match string {
StringType::FString(_) => has_fstring = true,
StringType::TString(_) => has_tstring = true,
StringType::TString(_) => tstring_count += 1,
StringType::Bytes(_) => byte_literal_count += 1,
StringType::Str(_) => {}
}
}
let has_bytes = byte_literal_count > 0;
let has_tstring = tstring_count > 0;
if has_bytes {
match byte_literal_count.cmp(&strings.len()) {
Ordering::Less => {
// TODO(dhruvmanila): This is not an ideal recovery because the parser
// replaces the byte literals with an invalid string literal node. Any
// downstream tools can extract the raw bytes from the range.
//
// We could convert the node into a string and mark it as invalid
// and would be clever to mark the type which is fewer in quantity.
if byte_literal_count < strings.len() {
// TODO(dhruvmanila): This is not an ideal recovery because the parser
// replaces the byte literals with an invalid string literal node. Any
// downstream tools can extract the raw bytes from the range.
//
// We could convert the node into a string and mark it as invalid
// and would be clever to mark the type which is fewer in quantity.
// test_err mixed_bytes_and_non_bytes_literals
// 'first' b'second'
// f'first' b'second'
// 'first' f'second' b'third'
self.add_error(
ParseErrorType::OtherError(
"Bytes literal cannot be mixed with non-bytes literals".to_string(),
),
range,
);
}
// Only construct a byte expression if all the literals are bytes
// otherwise, we'll try either string, t-string, or f-string. This is to retain
// as much information as possible.
Ordering::Equal => {
let mut values = Vec::with_capacity(strings.len());
for string in strings {
values.push(match string {
StringType::Bytes(value) => value,
_ => unreachable!("Expected `StringType::Bytes`"),
});
}
return Expr::from(ast::ExprBytesLiteral {
value: ast::BytesLiteralValue::concatenated(values),
range,
node_index: AtomicNodeIndex::dummy(),
// test_err mixed_bytes_and_non_bytes_literals
// 'first' b'second'
// f'first' b'second'
// 'first' f'second' b'third'
self.add_error(
ParseErrorType::OtherError(
"Bytes literal cannot be mixed with non-bytes literals".to_string(),
),
range,
);
}
// Only construct a byte expression if all the literals are bytes
// otherwise, we'll try either string, t-string, or f-string. This is to retain
// as much information as possible.
else {
let mut values = Vec::with_capacity(strings.len());
for string in strings {
values.push(match string {
StringType::Bytes(value) => value,
_ => unreachable!("Expected `StringType::Bytes`"),
});
}
Ordering::Greater => unreachable!(),
return Expr::from(ast::ExprBytesLiteral {
value: ast::BytesLiteralValue::concatenated(values),
range,
node_index: AtomicNodeIndex::dummy(),
});
}
}
if has_tstring {
if tstring_count < strings.len() {
self.add_error(
ParseErrorType::OtherError(
"cannot mix t-string literals with string or bytes literals".to_string(),
),
range,
);
}
// Only construct a t-string expression if all the literals are t-strings
// otherwise, we'll try either string or f-string. This is to retain
// as much information as possible.
else {
let mut values = Vec::with_capacity(strings.len());
for string in strings {
values.push(match string {
StringType::TString(value) => value,
_ => unreachable!("Expected `StringType::TString`"),
});
}
return Expr::from(ast::ExprTString {
value: ast::TStringValue::concatenated(values),
range,
node_index: AtomicNodeIndex::dummy(),
});
}
}
@ -1414,36 +1437,17 @@ impl<'src> Parser<'src> {
});
}
if has_tstring {
let mut parts = Vec::with_capacity(strings.len());
for string in strings {
match string {
StringType::TString(tstring) => parts.push(ast::TStringPart::TString(tstring)),
StringType::FString(fstring) => {
parts.push(ruff_python_ast::TStringPart::FString(fstring));
}
StringType::Str(string) => parts.push(ast::TStringPart::Literal(string)),
StringType::Bytes(bytes) => parts.push(ast::TStringPart::Literal(
ast::StringLiteral::invalid(bytes.range()),
)),
}
}
return Expr::from(ast::ExprTString {
value: ast::TStringValue::concatenated(parts),
range,
node_index: AtomicNodeIndex::dummy(),
});
}
let mut parts = Vec::with_capacity(strings.len());
for string in strings {
match string {
StringType::FString(fstring) => parts.push(ast::FStringPart::FString(fstring)),
StringType::TString(_) => {
unreachable!("expected no tstring parts by this point")
}
StringType::Str(string) => parts.push(ast::FStringPart::Literal(string)),
// Bytes and Template strings are invalid at this point
// and stored as invalid string literal parts in the
// f-string
StringType::TString(tstring) => parts.push(ast::FStringPart::Literal(
ast::StringLiteral::invalid(tstring.range()),
)),
StringType::Bytes(bytes) => parts.push(ast::FStringPart::Literal(
ast::StringLiteral::invalid(bytes.range()),
)),

View file

@ -13,18 +13,16 @@ expression: suite
range: 0..3,
value: TStringValue {
inner: Single(
TString(
TString {
range: 0..3,
node_index: AtomicNodeIndex(..),
elements: [],
flags: TStringFlags {
quote_style: Double,
prefix: Regular,
triple_quoted: false,
},
TString {
range: 0..3,
node_index: AtomicNodeIndex(..),
elements: [],
flags: TStringFlags {
quote_style: Double,
prefix: Regular,
triple_quoted: false,
},
),
},
),
},
},

View file

@ -1,64 +0,0 @@
---
source: crates/ruff_python_parser/src/string.rs
expression: suite
---
[
Expr(
StmtExpr {
node_index: AtomicNodeIndex(..),
range: 0..18,
value: TString(
ExprTString {
node_index: AtomicNodeIndex(..),
range: 0..18,
value: TStringValue {
inner: Concatenated(
[
FString(
FString {
range: 0..9,
node_index: AtomicNodeIndex(..),
elements: [
Literal(
InterpolatedStringLiteralElement {
range: 2..8,
node_index: AtomicNodeIndex(..),
value: "Hello ",
},
),
],
flags: FStringFlags {
quote_style: Single,
prefix: Regular,
triple_quoted: false,
},
},
),
TString(
TString {
range: 10..18,
node_index: AtomicNodeIndex(..),
elements: [
Literal(
InterpolatedStringLiteralElement {
range: 12..17,
node_index: AtomicNodeIndex(..),
value: "world",
},
),
],
flags: TStringFlags {
quote_style: Single,
prefix: Regular,
triple_quoted: false,
},
},
),
],
),
},
},
),
},
),
]

View file

@ -0,0 +1,10 @@
---
source: crates/ruff_python_parser/src/string.rs
expression: suite
---
ParseError {
error: OtherError(
"cannot mix t-string literals with string or bytes literals",
),
location: 0..18,
}

View file

@ -1,76 +0,0 @@
---
source: crates/ruff_python_parser/src/string.rs
expression: suite
---
[
Expr(
StmtExpr {
node_index: AtomicNodeIndex(..),
range: 0..22,
value: TString(
ExprTString {
node_index: AtomicNodeIndex(..),
range: 0..22,
value: TStringValue {
inner: Concatenated(
[
FString(
FString {
range: 0..9,
node_index: AtomicNodeIndex(..),
elements: [
Literal(
InterpolatedStringLiteralElement {
range: 2..8,
node_index: AtomicNodeIndex(..),
value: "Hello ",
},
),
],
flags: FStringFlags {
quote_style: Single,
prefix: Regular,
triple_quoted: false,
},
},
),
TString(
TString {
range: 10..18,
node_index: AtomicNodeIndex(..),
elements: [
Literal(
InterpolatedStringLiteralElement {
range: 12..17,
node_index: AtomicNodeIndex(..),
value: "world",
},
),
],
flags: TStringFlags {
quote_style: Single,
prefix: Regular,
triple_quoted: false,
},
},
),
Literal(
StringLiteral {
range: 19..22,
node_index: AtomicNodeIndex(..),
value: "!",
flags: StringLiteralFlags {
quote_style: Single,
prefix: Empty,
triple_quoted: false,
},
},
),
],
),
},
},
),
},
),
]

View file

@ -0,0 +1,10 @@
---
source: crates/ruff_python_parser/src/string.rs
expression: suite
---
ParseError {
error: OtherError(
"cannot mix t-string literals with string or bytes literals",
),
location: 0..22,
}

View file

@ -1,56 +0,0 @@
---
source: crates/ruff_python_parser/src/string.rs
expression: suite
---
[
Expr(
StmtExpr {
node_index: AtomicNodeIndex(..),
range: 0..17,
value: TString(
ExprTString {
node_index: AtomicNodeIndex(..),
range: 0..17,
value: TStringValue {
inner: Concatenated(
[
Literal(
StringLiteral {
range: 0..8,
node_index: AtomicNodeIndex(..),
value: "Hello ",
flags: StringLiteralFlags {
quote_style: Single,
prefix: Empty,
triple_quoted: false,
},
},
),
TString(
TString {
range: 9..17,
node_index: AtomicNodeIndex(..),
elements: [
Literal(
InterpolatedStringLiteralElement {
range: 11..16,
node_index: AtomicNodeIndex(..),
value: "world",
},
),
],
flags: TStringFlags {
quote_style: Single,
prefix: Regular,
triple_quoted: false,
},
},
),
],
),
},
},
),
},
),
]

View file

@ -0,0 +1,10 @@
---
source: crates/ruff_python_parser/src/string.rs
expression: suite
---
ParseError {
error: OtherError(
"cannot mix t-string literals with string or bytes literals",
),
location: 0..17,
}

View file

@ -1,56 +0,0 @@
---
source: crates/ruff_python_parser/src/string.rs
expression: suite
---
[
Expr(
StmtExpr {
node_index: AtomicNodeIndex(..),
range: 0..17,
value: TString(
ExprTString {
node_index: AtomicNodeIndex(..),
range: 0..17,
value: TStringValue {
inner: Concatenated(
[
Literal(
StringLiteral {
range: 0..8,
node_index: AtomicNodeIndex(..),
value: "Hello ",
flags: StringLiteralFlags {
quote_style: Single,
prefix: Empty,
triple_quoted: false,
},
},
),
TString(
TString {
range: 9..17,
node_index: AtomicNodeIndex(..),
elements: [
Literal(
InterpolatedStringLiteralElement {
range: 11..16,
node_index: AtomicNodeIndex(..),
value: "world",
},
),
],
flags: TStringFlags {
quote_style: Single,
prefix: Regular,
triple_quoted: false,
},
},
),
],
),
},
},
),
},
),
]

View file

@ -0,0 +1,10 @@
---
source: crates/ruff_python_parser/src/string.rs
expression: suite
---
ParseError {
error: OtherError(
"cannot mix t-string literals with string or bytes literals",
),
location: 0..17,
}

View file

@ -1,85 +0,0 @@
---
source: crates/ruff_python_parser/src/string.rs
expression: suite
---
[
Expr(
StmtExpr {
node_index: AtomicNodeIndex(..),
range: 0..22,
value: TString(
ExprTString {
node_index: AtomicNodeIndex(..),
range: 0..22,
value: TStringValue {
inner: Concatenated(
[
Literal(
StringLiteral {
range: 0..8,
node_index: AtomicNodeIndex(..),
value: "Hello ",
flags: StringLiteralFlags {
quote_style: Single,
prefix: Empty,
triple_quoted: false,
},
},
),
TString(
TString {
range: 9..22,
node_index: AtomicNodeIndex(..),
elements: [
Literal(
InterpolatedStringLiteralElement {
range: 11..16,
node_index: AtomicNodeIndex(..),
value: "world",
},
),
Interpolation(
InterpolatedElement {
range: 16..21,
node_index: AtomicNodeIndex(..),
expression: StringLiteral(
ExprStringLiteral {
node_index: AtomicNodeIndex(..),
range: 17..20,
value: StringLiteralValue {
inner: Single(
StringLiteral {
range: 17..20,
node_index: AtomicNodeIndex(..),
value: "!",
flags: StringLiteralFlags {
quote_style: Double,
prefix: Empty,
triple_quoted: false,
},
},
),
},
},
),
debug_text: None,
conversion: None,
format_spec: None,
},
),
],
flags: TStringFlags {
quote_style: Single,
prefix: Regular,
triple_quoted: false,
},
},
),
],
),
},
},
),
},
),
]

View file

@ -0,0 +1,10 @@
---
source: crates/ruff_python_parser/src/string.rs
expression: suite
---
ParseError {
error: OtherError(
"cannot mix t-string literals with string or bytes literals",
),
location: 0..22,
}

View file

@ -1,97 +0,0 @@
---
source: crates/ruff_python_parser/src/string.rs
expression: suite
---
[
Expr(
StmtExpr {
node_index: AtomicNodeIndex(..),
range: 0..31,
value: TString(
ExprTString {
node_index: AtomicNodeIndex(..),
range: 0..31,
value: TStringValue {
inner: Concatenated(
[
Literal(
StringLiteral {
range: 0..8,
node_index: AtomicNodeIndex(..),
value: "Hello ",
flags: StringLiteralFlags {
quote_style: Single,
prefix: Empty,
triple_quoted: false,
},
},
),
TString(
TString {
range: 9..22,
node_index: AtomicNodeIndex(..),
elements: [
Literal(
InterpolatedStringLiteralElement {
range: 11..16,
node_index: AtomicNodeIndex(..),
value: "world",
},
),
Interpolation(
InterpolatedElement {
range: 16..21,
node_index: AtomicNodeIndex(..),
expression: StringLiteral(
ExprStringLiteral {
node_index: AtomicNodeIndex(..),
range: 17..20,
value: StringLiteralValue {
inner: Single(
StringLiteral {
range: 17..20,
node_index: AtomicNodeIndex(..),
value: "!",
flags: StringLiteralFlags {
quote_style: Double,
prefix: Empty,
triple_quoted: false,
},
},
),
},
},
),
debug_text: None,
conversion: None,
format_spec: None,
},
),
],
flags: TStringFlags {
quote_style: Single,
prefix: Regular,
triple_quoted: false,
},
},
),
Literal(
StringLiteral {
range: 23..31,
node_index: AtomicNodeIndex(..),
value: "again!",
flags: StringLiteralFlags {
quote_style: Single,
prefix: Empty,
triple_quoted: false,
},
},
),
],
),
},
},
),
},
),
]

View file

@ -0,0 +1,10 @@
---
source: crates/ruff_python_parser/src/string.rs
expression: suite
---
ParseError {
error: OtherError(
"cannot mix t-string literals with string or bytes literals",
),
location: 0..31,
}

View file

@ -13,60 +13,58 @@ expression: suite
range: 0..18,
value: TStringValue {
inner: Single(
TString(
TString {
range: 0..18,
node_index: AtomicNodeIndex(..),
elements: [
Interpolation(
InterpolatedElement {
range: 2..5,
node_index: AtomicNodeIndex(..),
expression: Name(
ExprName {
node_index: AtomicNodeIndex(..),
range: 3..4,
id: Name("a"),
ctx: Load,
},
),
debug_text: None,
conversion: None,
format_spec: None,
},
),
Interpolation(
InterpolatedElement {
range: 5..10,
node_index: AtomicNodeIndex(..),
expression: Name(
ExprName {
node_index: AtomicNodeIndex(..),
range: 7..8,
id: Name("b"),
ctx: Load,
},
),
debug_text: None,
conversion: None,
format_spec: None,
},
),
Literal(
InterpolatedStringLiteralElement {
range: 10..17,
node_index: AtomicNodeIndex(..),
value: "{foo}",
},
),
],
flags: TStringFlags {
quote_style: Double,
prefix: Regular,
triple_quoted: false,
},
TString {
range: 0..18,
node_index: AtomicNodeIndex(..),
elements: [
Interpolation(
InterpolatedElement {
range: 2..5,
node_index: AtomicNodeIndex(..),
expression: Name(
ExprName {
node_index: AtomicNodeIndex(..),
range: 3..4,
id: Name("a"),
ctx: Load,
},
),
debug_text: None,
conversion: None,
format_spec: None,
},
),
Interpolation(
InterpolatedElement {
range: 5..10,
node_index: AtomicNodeIndex(..),
expression: Name(
ExprName {
node_index: AtomicNodeIndex(..),
range: 7..8,
id: Name("b"),
ctx: Load,
},
),
debug_text: None,
conversion: None,
format_spec: None,
},
),
Literal(
InterpolatedStringLiteralElement {
range: 10..17,
node_index: AtomicNodeIndex(..),
value: "{foo}",
},
),
],
flags: TStringFlags {
quote_style: Double,
prefix: Regular,
triple_quoted: false,
},
),
},
),
},
},

View file

@ -13,57 +13,55 @@ expression: suite
range: 0..13,
value: TStringValue {
inner: Single(
TString(
TString {
range: 0..13,
node_index: AtomicNodeIndex(..),
elements: [
Interpolation(
InterpolatedElement {
range: 2..12,
node_index: AtomicNodeIndex(..),
expression: Compare(
ExprCompare {
node_index: AtomicNodeIndex(..),
range: 3..11,
left: NumberLiteral(
TString {
range: 0..13,
node_index: AtomicNodeIndex(..),
elements: [
Interpolation(
InterpolatedElement {
range: 2..12,
node_index: AtomicNodeIndex(..),
expression: Compare(
ExprCompare {
node_index: AtomicNodeIndex(..),
range: 3..11,
left: NumberLiteral(
ExprNumberLiteral {
node_index: AtomicNodeIndex(..),
range: 3..5,
value: Int(
42,
),
},
),
ops: [
Eq,
],
comparators: [
NumberLiteral(
ExprNumberLiteral {
node_index: AtomicNodeIndex(..),
range: 3..5,
range: 9..11,
value: Int(
42,
),
},
),
ops: [
Eq,
],
comparators: [
NumberLiteral(
ExprNumberLiteral {
node_index: AtomicNodeIndex(..),
range: 9..11,
value: Int(
42,
),
},
),
],
},
),
debug_text: None,
conversion: None,
format_spec: None,
},
),
],
flags: TStringFlags {
quote_style: Double,
prefix: Regular,
triple_quoted: false,
},
],
},
),
debug_text: None,
conversion: None,
format_spec: None,
},
),
],
flags: TStringFlags {
quote_style: Double,
prefix: Regular,
triple_quoted: false,
},
),
},
),
},
},

View file

@ -13,87 +13,85 @@ expression: suite
range: 0..16,
value: TStringValue {
inner: Single(
TString(
TString {
range: 0..16,
node_index: AtomicNodeIndex(..),
elements: [
Interpolation(
InterpolatedElement {
range: 2..15,
node_index: AtomicNodeIndex(..),
expression: Name(
ExprName {
node_index: AtomicNodeIndex(..),
range: 3..6,
id: Name("foo"),
ctx: Load,
},
),
debug_text: None,
conversion: None,
format_spec: Some(
InterpolatedStringFormatSpec {
range: 7..14,
node_index: AtomicNodeIndex(..),
elements: [
Interpolation(
InterpolatedElement {
range: 7..14,
node_index: AtomicNodeIndex(..),
expression: StringLiteral(
ExprStringLiteral {
node_index: AtomicNodeIndex(..),
range: 8..13,
value: StringLiteralValue {
inner: Concatenated(
ConcatenatedStringLiteral {
strings: [
StringLiteral {
range: 8..10,
node_index: AtomicNodeIndex(..),
value: "",
flags: StringLiteralFlags {
quote_style: Single,
prefix: Empty,
triple_quoted: false,
},
TString {
range: 0..16,
node_index: AtomicNodeIndex(..),
elements: [
Interpolation(
InterpolatedElement {
range: 2..15,
node_index: AtomicNodeIndex(..),
expression: Name(
ExprName {
node_index: AtomicNodeIndex(..),
range: 3..6,
id: Name("foo"),
ctx: Load,
},
),
debug_text: None,
conversion: None,
format_spec: Some(
InterpolatedStringFormatSpec {
range: 7..14,
node_index: AtomicNodeIndex(..),
elements: [
Interpolation(
InterpolatedElement {
range: 7..14,
node_index: AtomicNodeIndex(..),
expression: StringLiteral(
ExprStringLiteral {
node_index: AtomicNodeIndex(..),
range: 8..13,
value: StringLiteralValue {
inner: Concatenated(
ConcatenatedStringLiteral {
strings: [
StringLiteral {
range: 8..10,
node_index: AtomicNodeIndex(..),
value: "",
flags: StringLiteralFlags {
quote_style: Single,
prefix: Empty,
triple_quoted: false,
},
StringLiteral {
range: 11..13,
node_index: AtomicNodeIndex(..),
value: "",
flags: StringLiteralFlags {
quote_style: Single,
prefix: Empty,
triple_quoted: false,
},
},
StringLiteral {
range: 11..13,
node_index: AtomicNodeIndex(..),
value: "",
flags: StringLiteralFlags {
quote_style: Single,
prefix: Empty,
triple_quoted: false,
},
],
value: "",
},
),
},
},
],
value: "",
},
),
},
),
debug_text: None,
conversion: None,
format_spec: None,
},
),
],
},
),
},
),
],
flags: TStringFlags {
quote_style: Double,
prefix: Regular,
triple_quoted: false,
},
},
),
debug_text: None,
conversion: None,
format_spec: None,
},
),
],
},
),
},
),
],
flags: TStringFlags {
quote_style: Double,
prefix: Regular,
triple_quoted: false,
},
),
},
),
},
},

View file

@ -13,60 +13,58 @@ expression: suite
range: 0..15,
value: TStringValue {
inner: Single(
TString(
TString {
range: 0..15,
node_index: AtomicNodeIndex(..),
elements: [
Interpolation(
InterpolatedElement {
range: 2..14,
node_index: AtomicNodeIndex(..),
expression: Name(
ExprName {
node_index: AtomicNodeIndex(..),
range: 3..6,
id: Name("foo"),
ctx: Load,
},
),
debug_text: None,
conversion: None,
format_spec: Some(
InterpolatedStringFormatSpec {
range: 7..13,
node_index: AtomicNodeIndex(..),
elements: [
Interpolation(
InterpolatedElement {
range: 7..13,
node_index: AtomicNodeIndex(..),
expression: Name(
ExprName {
node_index: AtomicNodeIndex(..),
range: 8..12,
id: Name("spec"),
ctx: Load,
},
),
debug_text: None,
conversion: None,
format_spec: None,
},
),
],
},
),
},
),
],
flags: TStringFlags {
quote_style: Double,
prefix: Regular,
triple_quoted: false,
},
TString {
range: 0..15,
node_index: AtomicNodeIndex(..),
elements: [
Interpolation(
InterpolatedElement {
range: 2..14,
node_index: AtomicNodeIndex(..),
expression: Name(
ExprName {
node_index: AtomicNodeIndex(..),
range: 3..6,
id: Name("foo"),
ctx: Load,
},
),
debug_text: None,
conversion: None,
format_spec: Some(
InterpolatedStringFormatSpec {
range: 7..13,
node_index: AtomicNodeIndex(..),
elements: [
Interpolation(
InterpolatedElement {
range: 7..13,
node_index: AtomicNodeIndex(..),
expression: Name(
ExprName {
node_index: AtomicNodeIndex(..),
range: 8..12,
id: Name("spec"),
ctx: Load,
},
),
debug_text: None,
conversion: None,
format_spec: None,
},
),
],
},
),
},
),
],
flags: TStringFlags {
quote_style: Double,
prefix: Regular,
triple_quoted: false,
},
),
},
),
},
},

View file

@ -13,72 +13,70 @@ expression: suite
range: 0..13,
value: TStringValue {
inner: Single(
TString(
TString {
range: 0..13,
node_index: AtomicNodeIndex(..),
elements: [
Interpolation(
InterpolatedElement {
range: 2..12,
node_index: AtomicNodeIndex(..),
expression: Name(
ExprName {
node_index: AtomicNodeIndex(..),
range: 3..6,
id: Name("foo"),
ctx: Load,
},
),
debug_text: None,
conversion: None,
format_spec: Some(
InterpolatedStringFormatSpec {
range: 7..11,
node_index: AtomicNodeIndex(..),
elements: [
Interpolation(
InterpolatedElement {
range: 7..11,
node_index: AtomicNodeIndex(..),
expression: StringLiteral(
ExprStringLiteral {
node_index: AtomicNodeIndex(..),
range: 8..10,
value: StringLiteralValue {
inner: Single(
StringLiteral {
range: 8..10,
node_index: AtomicNodeIndex(..),
value: "",
flags: StringLiteralFlags {
quote_style: Single,
prefix: Empty,
triple_quoted: false,
},
TString {
range: 0..13,
node_index: AtomicNodeIndex(..),
elements: [
Interpolation(
InterpolatedElement {
range: 2..12,
node_index: AtomicNodeIndex(..),
expression: Name(
ExprName {
node_index: AtomicNodeIndex(..),
range: 3..6,
id: Name("foo"),
ctx: Load,
},
),
debug_text: None,
conversion: None,
format_spec: Some(
InterpolatedStringFormatSpec {
range: 7..11,
node_index: AtomicNodeIndex(..),
elements: [
Interpolation(
InterpolatedElement {
range: 7..11,
node_index: AtomicNodeIndex(..),
expression: StringLiteral(
ExprStringLiteral {
node_index: AtomicNodeIndex(..),
range: 8..10,
value: StringLiteralValue {
inner: Single(
StringLiteral {
range: 8..10,
node_index: AtomicNodeIndex(..),
value: "",
flags: StringLiteralFlags {
quote_style: Single,
prefix: Empty,
triple_quoted: false,
},
),
},
},
),
},
),
debug_text: None,
conversion: None,
format_spec: None,
},
),
],
},
),
},
),
],
flags: TStringFlags {
quote_style: Double,
prefix: Regular,
triple_quoted: false,
},
},
),
debug_text: None,
conversion: None,
format_spec: None,
},
),
],
},
),
},
),
],
flags: TStringFlags {
quote_style: Double,
prefix: Regular,
triple_quoted: false,
},
),
},
),
},
},

View file

@ -13,57 +13,55 @@ expression: suite
range: 0..11,
value: TStringValue {
inner: Single(
TString(
TString {
range: 0..11,
node_index: AtomicNodeIndex(..),
elements: [
Interpolation(
InterpolatedElement {
range: 2..10,
node_index: AtomicNodeIndex(..),
expression: Compare(
ExprCompare {
node_index: AtomicNodeIndex(..),
range: 3..9,
left: NumberLiteral(
TString {
range: 0..11,
node_index: AtomicNodeIndex(..),
elements: [
Interpolation(
InterpolatedElement {
range: 2..10,
node_index: AtomicNodeIndex(..),
expression: Compare(
ExprCompare {
node_index: AtomicNodeIndex(..),
range: 3..9,
left: NumberLiteral(
ExprNumberLiteral {
node_index: AtomicNodeIndex(..),
range: 3..4,
value: Int(
1,
),
},
),
ops: [
NotEq,
],
comparators: [
NumberLiteral(
ExprNumberLiteral {
node_index: AtomicNodeIndex(..),
range: 3..4,
range: 8..9,
value: Int(
1,
2,
),
},
),
ops: [
NotEq,
],
comparators: [
NumberLiteral(
ExprNumberLiteral {
node_index: AtomicNodeIndex(..),
range: 8..9,
value: Int(
2,
),
},
),
],
},
),
debug_text: None,
conversion: None,
format_spec: None,
},
),
],
flags: TStringFlags {
quote_style: Double,
prefix: Regular,
triple_quoted: false,
},
],
},
),
debug_text: None,
conversion: None,
format_spec: None,
},
),
],
flags: TStringFlags {
quote_style: Double,
prefix: Regular,
triple_quoted: false,
},
),
},
),
},
},

View file

@ -13,50 +13,48 @@ expression: suite
range: 0..13,
value: TStringValue {
inner: Single(
TString(
TString {
range: 0..13,
node_index: AtomicNodeIndex(..),
elements: [
Interpolation(
InterpolatedElement {
range: 2..12,
node_index: AtomicNodeIndex(..),
expression: Name(
ExprName {
node_index: AtomicNodeIndex(..),
range: 3..6,
id: Name("foo"),
ctx: Load,
},
),
debug_text: None,
conversion: None,
format_spec: Some(
InterpolatedStringFormatSpec {
range: 7..11,
node_index: AtomicNodeIndex(..),
elements: [
Literal(
InterpolatedStringLiteralElement {
range: 7..11,
node_index: AtomicNodeIndex(..),
value: "spec",
},
),
],
},
),
},
),
],
flags: TStringFlags {
quote_style: Double,
prefix: Regular,
triple_quoted: false,
},
TString {
range: 0..13,
node_index: AtomicNodeIndex(..),
elements: [
Interpolation(
InterpolatedElement {
range: 2..12,
node_index: AtomicNodeIndex(..),
expression: Name(
ExprName {
node_index: AtomicNodeIndex(..),
range: 3..6,
id: Name("foo"),
ctx: Load,
},
),
debug_text: None,
conversion: None,
format_spec: Some(
InterpolatedStringFormatSpec {
range: 7..11,
node_index: AtomicNodeIndex(..),
elements: [
Literal(
InterpolatedStringLiteralElement {
range: 7..11,
node_index: AtomicNodeIndex(..),
value: "spec",
},
),
],
},
),
},
),
],
flags: TStringFlags {
quote_style: Double,
prefix: Regular,
triple_quoted: false,
},
),
},
),
},
},

View file

@ -13,41 +13,39 @@ expression: suite
range: 0..10,
value: TStringValue {
inner: Single(
TString(
TString {
range: 0..10,
node_index: AtomicNodeIndex(..),
elements: [
Interpolation(
InterpolatedElement {
range: 2..9,
node_index: AtomicNodeIndex(..),
expression: Name(
ExprName {
node_index: AtomicNodeIndex(..),
range: 3..4,
id: Name("x"),
ctx: Load,
},
),
debug_text: Some(
DebugText {
leading: "",
trailing: " =",
},
),
conversion: None,
format_spec: None,
},
),
],
flags: TStringFlags {
quote_style: Double,
prefix: Regular,
triple_quoted: false,
},
TString {
range: 0..10,
node_index: AtomicNodeIndex(..),
elements: [
Interpolation(
InterpolatedElement {
range: 2..9,
node_index: AtomicNodeIndex(..),
expression: Name(
ExprName {
node_index: AtomicNodeIndex(..),
range: 3..4,
id: Name("x"),
ctx: Load,
},
),
debug_text: Some(
DebugText {
leading: "",
trailing: " =",
},
),
conversion: None,
format_spec: None,
},
),
],
flags: TStringFlags {
quote_style: Double,
prefix: Regular,
triple_quoted: false,
},
),
},
),
},
},

View file

@ -13,41 +13,39 @@ expression: suite
range: 0..10,
value: TStringValue {
inner: Single(
TString(
TString {
range: 0..10,
node_index: AtomicNodeIndex(..),
elements: [
Interpolation(
InterpolatedElement {
range: 2..9,
node_index: AtomicNodeIndex(..),
expression: Name(
ExprName {
node_index: AtomicNodeIndex(..),
range: 3..4,
id: Name("x"),
ctx: Load,
},
),
debug_text: Some(
DebugText {
leading: "",
trailing: "= ",
},
),
conversion: None,
format_spec: None,
},
),
],
flags: TStringFlags {
quote_style: Double,
prefix: Regular,
triple_quoted: false,
},
TString {
range: 0..10,
node_index: AtomicNodeIndex(..),
elements: [
Interpolation(
InterpolatedElement {
range: 2..9,
node_index: AtomicNodeIndex(..),
expression: Name(
ExprName {
node_index: AtomicNodeIndex(..),
range: 3..4,
id: Name("x"),
ctx: Load,
},
),
debug_text: Some(
DebugText {
leading: "",
trailing: "= ",
},
),
conversion: None,
format_spec: None,
},
),
],
flags: TStringFlags {
quote_style: Double,
prefix: Regular,
triple_quoted: false,
},
),
},
),
},
},

View file

@ -13,35 +13,33 @@ expression: suite
range: 0..10,
value: TStringValue {
inner: Single(
TString(
TString {
range: 0..10,
node_index: AtomicNodeIndex(..),
elements: [
Interpolation(
InterpolatedElement {
range: 2..9,
node_index: AtomicNodeIndex(..),
expression: Yield(
ExprYield {
node_index: AtomicNodeIndex(..),
range: 3..8,
value: None,
},
),
debug_text: None,
conversion: None,
format_spec: None,
},
),
],
flags: TStringFlags {
quote_style: Double,
prefix: Regular,
triple_quoted: false,
},
TString {
range: 0..10,
node_index: AtomicNodeIndex(..),
elements: [
Interpolation(
InterpolatedElement {
range: 2..9,
node_index: AtomicNodeIndex(..),
expression: Yield(
ExprYield {
node_index: AtomicNodeIndex(..),
range: 3..8,
value: None,
},
),
debug_text: None,
conversion: None,
format_spec: None,
},
),
],
flags: TStringFlags {
quote_style: Double,
prefix: Regular,
triple_quoted: false,
},
),
},
),
},
},

View file

@ -1,56 +0,0 @@
---
source: crates/ruff_python_parser/src/string.rs
expression: suite
---
[
Expr(
StmtExpr {
node_index: AtomicNodeIndex(..),
range: 0..18,
value: TString(
ExprTString {
node_index: AtomicNodeIndex(..),
range: 0..18,
value: TStringValue {
inner: Concatenated(
[
Literal(
StringLiteral {
range: 0..9,
node_index: AtomicNodeIndex(..),
value: "Hello ",
flags: StringLiteralFlags {
quote_style: Single,
prefix: Unicode,
triple_quoted: false,
},
},
),
TString(
TString {
range: 10..18,
node_index: AtomicNodeIndex(..),
elements: [
Literal(
InterpolatedStringLiteralElement {
range: 12..17,
node_index: AtomicNodeIndex(..),
value: "world",
},
),
],
flags: TStringFlags {
quote_style: Single,
prefix: Regular,
triple_quoted: false,
},
},
),
],
),
},
},
),
},
),
]

View file

@ -0,0 +1,10 @@
---
source: crates/ruff_python_parser/src/string.rs
expression: suite
---
ParseError {
error: OtherError(
"cannot mix t-string literals with string or bytes literals",
),
location: 0..18,
}

View file

@ -1,68 +0,0 @@
---
source: crates/ruff_python_parser/src/string.rs
expression: suite
---
[
Expr(
StmtExpr {
node_index: AtomicNodeIndex(..),
range: 0..22,
value: TString(
ExprTString {
node_index: AtomicNodeIndex(..),
range: 0..22,
value: TStringValue {
inner: Concatenated(
[
Literal(
StringLiteral {
range: 0..9,
node_index: AtomicNodeIndex(..),
value: "Hello ",
flags: StringLiteralFlags {
quote_style: Single,
prefix: Unicode,
triple_quoted: false,
},
},
),
TString(
TString {
range: 10..18,
node_index: AtomicNodeIndex(..),
elements: [
Literal(
InterpolatedStringLiteralElement {
range: 12..17,
node_index: AtomicNodeIndex(..),
value: "world",
},
),
],
flags: TStringFlags {
quote_style: Single,
prefix: Regular,
triple_quoted: false,
},
},
),
Literal(
StringLiteral {
range: 19..22,
node_index: AtomicNodeIndex(..),
value: "!",
flags: StringLiteralFlags {
quote_style: Single,
prefix: Empty,
triple_quoted: false,
},
},
),
],
),
},
},
),
},
),
]

View file

@ -0,0 +1,10 @@
---
source: crates/ruff_python_parser/src/string.rs
expression: suite
---
ParseError {
error: OtherError(
"cannot mix t-string literals with string or bytes literals",
),
location: 0..22,
}

View file

@ -13,38 +13,36 @@ expression: suite
range: 0..7,
value: TStringValue {
inner: Single(
TString(
TString {
range: 0..7,
node_index: AtomicNodeIndex(..),
elements: [
Interpolation(
InterpolatedElement {
range: 3..6,
node_index: AtomicNodeIndex(..),
expression: Name(
ExprName {
node_index: AtomicNodeIndex(..),
range: 4..5,
id: Name("x"),
ctx: Load,
},
),
debug_text: None,
conversion: None,
format_spec: None,
},
),
],
flags: TStringFlags {
quote_style: Double,
prefix: Raw {
uppercase_r: false,
TString {
range: 0..7,
node_index: AtomicNodeIndex(..),
elements: [
Interpolation(
InterpolatedElement {
range: 3..6,
node_index: AtomicNodeIndex(..),
expression: Name(
ExprName {
node_index: AtomicNodeIndex(..),
range: 4..5,
id: Name("x"),
ctx: Load,
},
),
debug_text: None,
conversion: None,
format_spec: None,
},
triple_quoted: false,
),
],
flags: TStringFlags {
quote_style: Double,
prefix: Raw {
uppercase_r: false,
},
triple_quoted: false,
},
),
},
),
},
},

View file

@ -13,38 +13,36 @@ expression: suite
range: 0..11,
value: TStringValue {
inner: Single(
TString(
TString {
range: 0..11,
node_index: AtomicNodeIndex(..),
elements: [
Interpolation(
InterpolatedElement {
range: 5..8,
node_index: AtomicNodeIndex(..),
expression: Name(
ExprName {
node_index: AtomicNodeIndex(..),
range: 6..7,
id: Name("x"),
ctx: Load,
},
),
debug_text: None,
conversion: None,
format_spec: None,
},
),
],
flags: TStringFlags {
quote_style: Double,
prefix: Raw {
uppercase_r: false,
TString {
range: 0..11,
node_index: AtomicNodeIndex(..),
elements: [
Interpolation(
InterpolatedElement {
range: 5..8,
node_index: AtomicNodeIndex(..),
expression: Name(
ExprName {
node_index: AtomicNodeIndex(..),
range: 6..7,
id: Name("x"),
ctx: Load,
},
),
debug_text: None,
conversion: None,
format_spec: None,
},
triple_quoted: true,
),
],
flags: TStringFlags {
quote_style: Double,
prefix: Raw {
uppercase_r: false,
},
triple_quoted: true,
},
),
},
),
},
},

View file

@ -13,74 +13,72 @@ expression: suite
range: 0..22,
value: TStringValue {
inner: Single(
TString(
TString {
range: 0..22,
node_index: AtomicNodeIndex(..),
elements: [
Literal(
InterpolatedStringLiteralElement {
range: 2..5,
node_index: AtomicNodeIndex(..),
value: "aaa",
},
),
Interpolation(
InterpolatedElement {
range: 5..10,
node_index: AtomicNodeIndex(..),
expression: Name(
ExprName {
node_index: AtomicNodeIndex(..),
range: 6..9,
id: Name("bbb"),
ctx: Load,
},
),
debug_text: None,
conversion: None,
format_spec: None,
},
),
Literal(
InterpolatedStringLiteralElement {
range: 10..13,
node_index: AtomicNodeIndex(..),
value: "ccc",
},
),
Interpolation(
InterpolatedElement {
range: 13..18,
node_index: AtomicNodeIndex(..),
expression: Name(
ExprName {
node_index: AtomicNodeIndex(..),
range: 14..17,
id: Name("ddd"),
ctx: Load,
},
),
debug_text: None,
conversion: None,
format_spec: None,
},
),
Literal(
InterpolatedStringLiteralElement {
range: 18..21,
node_index: AtomicNodeIndex(..),
value: "eee",
},
),
],
flags: TStringFlags {
quote_style: Double,
prefix: Regular,
triple_quoted: false,
},
TString {
range: 0..22,
node_index: AtomicNodeIndex(..),
elements: [
Literal(
InterpolatedStringLiteralElement {
range: 2..5,
node_index: AtomicNodeIndex(..),
value: "aaa",
},
),
Interpolation(
InterpolatedElement {
range: 5..10,
node_index: AtomicNodeIndex(..),
expression: Name(
ExprName {
node_index: AtomicNodeIndex(..),
range: 6..9,
id: Name("bbb"),
ctx: Load,
},
),
debug_text: None,
conversion: None,
format_spec: None,
},
),
Literal(
InterpolatedStringLiteralElement {
range: 10..13,
node_index: AtomicNodeIndex(..),
value: "ccc",
},
),
Interpolation(
InterpolatedElement {
range: 13..18,
node_index: AtomicNodeIndex(..),
expression: Name(
ExprName {
node_index: AtomicNodeIndex(..),
range: 14..17,
id: Name("ddd"),
ctx: Load,
},
),
debug_text: None,
conversion: None,
format_spec: None,
},
),
Literal(
InterpolatedStringLiteralElement {
range: 18..21,
node_index: AtomicNodeIndex(..),
value: "eee",
},
),
],
flags: TStringFlags {
quote_style: Double,
prefix: Regular,
triple_quoted: false,
},
),
},
),
},
},

View file

@ -13,43 +13,41 @@ expression: suite
range: 0..8,
value: TStringValue {
inner: Single(
TString(
TString {
range: 0..8,
node_index: AtomicNodeIndex(..),
elements: [
Literal(
InterpolatedStringLiteralElement {
range: 2..4,
node_index: AtomicNodeIndex(..),
value: "\\",
},
),
Interpolation(
InterpolatedElement {
range: 4..7,
node_index: AtomicNodeIndex(..),
expression: Name(
ExprName {
node_index: AtomicNodeIndex(..),
range: 5..6,
id: Name("x"),
ctx: Load,
},
),
debug_text: None,
conversion: None,
format_spec: None,
},
),
],
flags: TStringFlags {
quote_style: Double,
prefix: Regular,
triple_quoted: false,
},
TString {
range: 0..8,
node_index: AtomicNodeIndex(..),
elements: [
Literal(
InterpolatedStringLiteralElement {
range: 2..4,
node_index: AtomicNodeIndex(..),
value: "\\",
},
),
Interpolation(
InterpolatedElement {
range: 4..7,
node_index: AtomicNodeIndex(..),
expression: Name(
ExprName {
node_index: AtomicNodeIndex(..),
range: 5..6,
id: Name("x"),
ctx: Load,
},
),
debug_text: None,
conversion: None,
format_spec: None,
},
),
],
flags: TStringFlags {
quote_style: Double,
prefix: Regular,
triple_quoted: false,
},
),
},
),
},
},

View file

@ -13,43 +13,41 @@ expression: suite
range: 0..8,
value: TStringValue {
inner: Single(
TString(
TString {
range: 0..8,
node_index: AtomicNodeIndex(..),
elements: [
Literal(
InterpolatedStringLiteralElement {
range: 2..4,
node_index: AtomicNodeIndex(..),
value: "\n",
},
),
Interpolation(
InterpolatedElement {
range: 4..7,
node_index: AtomicNodeIndex(..),
expression: Name(
ExprName {
node_index: AtomicNodeIndex(..),
range: 5..6,
id: Name("x"),
ctx: Load,
},
),
debug_text: None,
conversion: None,
format_spec: None,
},
),
],
flags: TStringFlags {
quote_style: Double,
prefix: Regular,
triple_quoted: false,
},
TString {
range: 0..8,
node_index: AtomicNodeIndex(..),
elements: [
Literal(
InterpolatedStringLiteralElement {
range: 2..4,
node_index: AtomicNodeIndex(..),
value: "\n",
},
),
Interpolation(
InterpolatedElement {
range: 4..7,
node_index: AtomicNodeIndex(..),
expression: Name(
ExprName {
node_index: AtomicNodeIndex(..),
range: 5..6,
id: Name("x"),
ctx: Load,
},
),
debug_text: None,
conversion: None,
format_spec: None,
},
),
],
flags: TStringFlags {
quote_style: Double,
prefix: Regular,
triple_quoted: false,
},
),
},
),
},
},

View file

@ -13,45 +13,43 @@ expression: suite
range: 0..9,
value: TStringValue {
inner: Single(
TString(
TString {
range: 0..9,
node_index: AtomicNodeIndex(..),
elements: [
Literal(
InterpolatedStringLiteralElement {
range: 3..5,
node_index: AtomicNodeIndex(..),
value: "\\\n",
},
),
Interpolation(
InterpolatedElement {
range: 5..8,
node_index: AtomicNodeIndex(..),
expression: Name(
ExprName {
node_index: AtomicNodeIndex(..),
range: 6..7,
id: Name("x"),
ctx: Load,
},
),
debug_text: None,
conversion: None,
format_spec: None,
},
),
],
flags: TStringFlags {
quote_style: Double,
prefix: Raw {
uppercase_r: false,
TString {
range: 0..9,
node_index: AtomicNodeIndex(..),
elements: [
Literal(
InterpolatedStringLiteralElement {
range: 3..5,
node_index: AtomicNodeIndex(..),
value: "\\\n",
},
triple_quoted: false,
),
Interpolation(
InterpolatedElement {
range: 5..8,
node_index: AtomicNodeIndex(..),
expression: Name(
ExprName {
node_index: AtomicNodeIndex(..),
range: 6..7,
id: Name("x"),
ctx: Load,
},
),
debug_text: None,
conversion: None,
format_spec: None,
},
),
],
flags: TStringFlags {
quote_style: Double,
prefix: Raw {
uppercase_r: false,
},
triple_quoted: false,
},
),
},
),
},
},

View file

@ -13,41 +13,39 @@ expression: suite
range: 0..10,
value: TStringValue {
inner: Single(
TString(
TString {
range: 0..10,
node_index: AtomicNodeIndex(..),
elements: [
Interpolation(
InterpolatedElement {
range: 2..9,
node_index: AtomicNodeIndex(..),
expression: Name(
ExprName {
node_index: AtomicNodeIndex(..),
range: 3..7,
id: Name("user"),
ctx: Load,
},
),
debug_text: Some(
DebugText {
leading: "",
trailing: "=",
},
),
conversion: None,
format_spec: None,
},
),
],
flags: TStringFlags {
quote_style: Double,
prefix: Regular,
triple_quoted: false,
},
TString {
range: 0..10,
node_index: AtomicNodeIndex(..),
elements: [
Interpolation(
InterpolatedElement {
range: 2..9,
node_index: AtomicNodeIndex(..),
expression: Name(
ExprName {
node_index: AtomicNodeIndex(..),
range: 3..7,
id: Name("user"),
ctx: Load,
},
),
debug_text: Some(
DebugText {
leading: "",
trailing: "=",
},
),
conversion: None,
format_spec: None,
},
),
],
flags: TStringFlags {
quote_style: Double,
prefix: Regular,
triple_quoted: false,
},
),
},
),
},
},

View file

@ -13,77 +13,75 @@ expression: suite
range: 0..38,
value: TStringValue {
inner: Single(
TString(
TString {
range: 0..38,
node_index: AtomicNodeIndex(..),
elements: [
Literal(
InterpolatedStringLiteralElement {
range: 2..6,
node_index: AtomicNodeIndex(..),
value: "mix ",
},
),
Interpolation(
InterpolatedElement {
range: 6..13,
node_index: AtomicNodeIndex(..),
expression: Name(
ExprName {
node_index: AtomicNodeIndex(..),
range: 7..11,
id: Name("user"),
ctx: Load,
},
),
debug_text: Some(
DebugText {
leading: "",
trailing: "=",
},
),
conversion: None,
format_spec: None,
},
),
Literal(
InterpolatedStringLiteralElement {
range: 13..28,
node_index: AtomicNodeIndex(..),
value: " with text and ",
},
),
Interpolation(
InterpolatedElement {
range: 28..37,
node_index: AtomicNodeIndex(..),
expression: Name(
ExprName {
node_index: AtomicNodeIndex(..),
range: 29..35,
id: Name("second"),
ctx: Load,
},
),
debug_text: Some(
DebugText {
leading: "",
trailing: "=",
},
),
conversion: None,
format_spec: None,
},
),
],
flags: TStringFlags {
quote_style: Double,
prefix: Regular,
triple_quoted: false,
},
TString {
range: 0..38,
node_index: AtomicNodeIndex(..),
elements: [
Literal(
InterpolatedStringLiteralElement {
range: 2..6,
node_index: AtomicNodeIndex(..),
value: "mix ",
},
),
Interpolation(
InterpolatedElement {
range: 6..13,
node_index: AtomicNodeIndex(..),
expression: Name(
ExprName {
node_index: AtomicNodeIndex(..),
range: 7..11,
id: Name("user"),
ctx: Load,
},
),
debug_text: Some(
DebugText {
leading: "",
trailing: "=",
},
),
conversion: None,
format_spec: None,
},
),
Literal(
InterpolatedStringLiteralElement {
range: 13..28,
node_index: AtomicNodeIndex(..),
value: " with text and ",
},
),
Interpolation(
InterpolatedElement {
range: 28..37,
node_index: AtomicNodeIndex(..),
expression: Name(
ExprName {
node_index: AtomicNodeIndex(..),
range: 29..35,
id: Name("second"),
ctx: Load,
},
),
debug_text: Some(
DebugText {
leading: "",
trailing: "=",
},
),
conversion: None,
format_spec: None,
},
),
],
flags: TStringFlags {
quote_style: Double,
prefix: Regular,
triple_quoted: false,
},
),
},
),
},
},

View file

@ -13,55 +13,53 @@ expression: suite
range: 0..14,
value: TStringValue {
inner: Single(
TString(
TString {
range: 0..14,
node_index: AtomicNodeIndex(..),
elements: [
Interpolation(
InterpolatedElement {
range: 2..13,
node_index: AtomicNodeIndex(..),
expression: Name(
ExprName {
node_index: AtomicNodeIndex(..),
range: 3..7,
id: Name("user"),
ctx: Load,
},
),
debug_text: Some(
DebugText {
leading: "",
trailing: "=",
},
),
conversion: None,
format_spec: Some(
InterpolatedStringFormatSpec {
range: 9..12,
node_index: AtomicNodeIndex(..),
elements: [
Literal(
InterpolatedStringLiteralElement {
range: 9..12,
node_index: AtomicNodeIndex(..),
value: ">10",
},
),
],
},
),
},
),
],
flags: TStringFlags {
quote_style: Double,
prefix: Regular,
triple_quoted: false,
},
TString {
range: 0..14,
node_index: AtomicNodeIndex(..),
elements: [
Interpolation(
InterpolatedElement {
range: 2..13,
node_index: AtomicNodeIndex(..),
expression: Name(
ExprName {
node_index: AtomicNodeIndex(..),
range: 3..7,
id: Name("user"),
ctx: Load,
},
),
debug_text: Some(
DebugText {
leading: "",
trailing: "=",
},
),
conversion: None,
format_spec: Some(
InterpolatedStringFormatSpec {
range: 9..12,
node_index: AtomicNodeIndex(..),
elements: [
Literal(
InterpolatedStringLiteralElement {
range: 9..12,
node_index: AtomicNodeIndex(..),
value: ">10",
},
),
],
},
),
},
),
],
flags: TStringFlags {
quote_style: Double,
prefix: Regular,
triple_quoted: false,
},
),
},
),
},
},

View file

@ -13,43 +13,41 @@ expression: suite
range: 0..11,
value: TStringValue {
inner: Single(
TString(
TString {
range: 0..11,
node_index: AtomicNodeIndex(..),
elements: [
Literal(
InterpolatedStringLiteralElement {
range: 4..5,
node_index: AtomicNodeIndex(..),
value: "\n",
},
),
Interpolation(
InterpolatedElement {
range: 5..8,
node_index: AtomicNodeIndex(..),
expression: Name(
ExprName {
node_index: AtomicNodeIndex(..),
range: 6..7,
id: Name("x"),
ctx: Load,
},
),
debug_text: None,
conversion: None,
format_spec: None,
},
),
],
flags: TStringFlags {
quote_style: Double,
prefix: Regular,
triple_quoted: true,
},
TString {
range: 0..11,
node_index: AtomicNodeIndex(..),
elements: [
Literal(
InterpolatedStringLiteralElement {
range: 4..5,
node_index: AtomicNodeIndex(..),
value: "\n",
},
),
Interpolation(
InterpolatedElement {
range: 5..8,
node_index: AtomicNodeIndex(..),
expression: Name(
ExprName {
node_index: AtomicNodeIndex(..),
range: 6..7,
id: Name("x"),
ctx: Load,
},
),
debug_text: None,
conversion: None,
format_spec: None,
},
),
],
flags: TStringFlags {
quote_style: Double,
prefix: Regular,
triple_quoted: true,
},
),
},
),
},
},

View file

@ -850,58 +850,58 @@ mod tests {
}
#[test]
fn test_parse_t_string_concat_1() {
fn test_parse_t_string_concat_1_error() {
let source = "'Hello ' t'world'";
let suite = parse_suite(source).unwrap();
let suite = parse_suite(source).unwrap_err();
insta::assert_debug_snapshot!(suite);
}
#[test]
fn test_parse_t_string_concat_2() {
fn test_parse_t_string_concat_2_error() {
let source = "'Hello ' t'world'";
let suite = parse_suite(source).unwrap();
let suite = parse_suite(source).unwrap_err();
insta::assert_debug_snapshot!(suite);
}
#[test]
fn test_parse_t_string_concat_3() {
fn test_parse_t_string_concat_3_error() {
let source = "'Hello ' t'world{\"!\"}'";
let suite = parse_suite(source).unwrap();
let suite = parse_suite(source).unwrap_err();
insta::assert_debug_snapshot!(suite);
}
#[test]
fn test_parse_t_string_concat_4() {
fn test_parse_t_string_concat_4_error() {
let source = "'Hello ' t'world{\"!\"}' 'again!'";
let suite = parse_suite(source).unwrap();
let suite = parse_suite(source).unwrap_err();
insta::assert_debug_snapshot!(suite);
}
#[test]
fn test_parse_u_t_string_concat_1() {
fn test_parse_u_t_string_concat_1_error() {
let source = "u'Hello ' t'world'";
let suite = parse_suite(source).unwrap();
let suite = parse_suite(source).unwrap_err();
insta::assert_debug_snapshot!(suite);
}
#[test]
fn test_parse_u_t_string_concat_2() {
fn test_parse_u_t_string_concat_2_error() {
let source = "u'Hello ' t'world' '!'";
let suite = parse_suite(source).unwrap();
let suite = parse_suite(source).unwrap_err();
insta::assert_debug_snapshot!(suite);
}
#[test]
fn test_parse_f_t_string_concat_1() {
fn test_parse_f_t_string_concat_1_error() {
let source = "f'Hello ' t'world'";
let suite = parse_suite(source).unwrap();
let suite = parse_suite(source).unwrap_err();
insta::assert_debug_snapshot!(suite);
}
#[test]
fn test_parse_f_t_string_concat_2() {
fn test_parse_f_t_string_concat_2_error() {
let source = "f'Hello ' t'world' '!'";
let suite = parse_suite(source).unwrap();
let suite = parse_suite(source).unwrap_err();
insta::assert_debug_snapshot!(suite);
}

View file

@ -66,36 +66,34 @@ Module(
range: 10..19,
value: TStringValue {
inner: Single(
TString(
TString {
range: 10..19,
node_index: AtomicNodeIndex(..),
elements: [
Interpolation(
InterpolatedElement {
range: 12..18,
node_index: AtomicNodeIndex(..),
expression: Name(
ExprName {
node_index: AtomicNodeIndex(..),
range: 13..14,
id: Name("x"),
ctx: Load,
},
),
debug_text: None,
conversion: Str,
format_spec: None,
},
),
],
flags: TStringFlags {
quote_style: Double,
prefix: Regular,
triple_quoted: false,
},
TString {
range: 10..19,
node_index: AtomicNodeIndex(..),
elements: [
Interpolation(
InterpolatedElement {
range: 12..18,
node_index: AtomicNodeIndex(..),
expression: Name(
ExprName {
node_index: AtomicNodeIndex(..),
range: 13..14,
id: Name("x"),
ctx: Load,
},
),
debug_text: None,
conversion: Str,
format_spec: None,
},
),
],
flags: TStringFlags {
quote_style: Double,
prefix: Regular,
triple_quoted: false,
},
),
},
),
},
},

View file

@ -20,36 +20,34 @@ Module(
range: 44..49,
value: TStringValue {
inner: Single(
TString(
TString {
range: 44..49,
node_index: AtomicNodeIndex(..),
elements: [
Interpolation(
InterpolatedElement {
range: 46..48,
node_index: AtomicNodeIndex(..),
expression: Name(
ExprName {
node_index: AtomicNodeIndex(..),
range: 47..47,
id: Name(""),
ctx: Invalid,
},
),
debug_text: None,
conversion: None,
format_spec: None,
},
),
],
flags: TStringFlags {
quote_style: Double,
prefix: Regular,
triple_quoted: false,
},
TString {
range: 44..49,
node_index: AtomicNodeIndex(..),
elements: [
Interpolation(
InterpolatedElement {
range: 46..48,
node_index: AtomicNodeIndex(..),
expression: Name(
ExprName {
node_index: AtomicNodeIndex(..),
range: 47..47,
id: Name(""),
ctx: Invalid,
},
),
debug_text: None,
conversion: None,
format_spec: None,
},
),
],
flags: TStringFlags {
quote_style: Double,
prefix: Regular,
triple_quoted: false,
},
),
},
),
},
},
@ -66,36 +64,34 @@ Module(
range: 50..57,
value: TStringValue {
inner: Single(
TString(
TString {
range: 50..57,
node_index: AtomicNodeIndex(..),
elements: [
Interpolation(
InterpolatedElement {
range: 52..56,
node_index: AtomicNodeIndex(..),
expression: Name(
ExprName {
node_index: AtomicNodeIndex(..),
range: 53..53,
id: Name(""),
ctx: Invalid,
},
),
debug_text: None,
conversion: None,
format_spec: None,
},
),
],
flags: TStringFlags {
quote_style: Double,
prefix: Regular,
triple_quoted: false,
},
TString {
range: 50..57,
node_index: AtomicNodeIndex(..),
elements: [
Interpolation(
InterpolatedElement {
range: 52..56,
node_index: AtomicNodeIndex(..),
expression: Name(
ExprName {
node_index: AtomicNodeIndex(..),
range: 53..53,
id: Name(""),
ctx: Invalid,
},
),
debug_text: None,
conversion: None,
format_spec: None,
},
),
],
flags: TStringFlags {
quote_style: Double,
prefix: Regular,
triple_quoted: false,
},
),
},
),
},
},

View file

@ -20,36 +20,34 @@ Module(
range: 44..52,
value: TStringValue {
inner: Single(
TString(
TString {
range: 44..52,
node_index: AtomicNodeIndex(..),
elements: [
Interpolation(
InterpolatedElement {
range: 46..51,
node_index: AtomicNodeIndex(..),
expression: Name(
ExprName {
node_index: AtomicNodeIndex(..),
range: 47..48,
id: Name("x"),
ctx: Load,
},
),
debug_text: None,
conversion: None,
format_spec: None,
},
),
],
flags: TStringFlags {
quote_style: Double,
prefix: Regular,
triple_quoted: false,
},
TString {
range: 44..52,
node_index: AtomicNodeIndex(..),
elements: [
Interpolation(
InterpolatedElement {
range: 46..51,
node_index: AtomicNodeIndex(..),
expression: Name(
ExprName {
node_index: AtomicNodeIndex(..),
range: 47..48,
id: Name("x"),
ctx: Load,
},
),
debug_text: None,
conversion: None,
format_spec: None,
},
),
],
flags: TStringFlags {
quote_style: Double,
prefix: Regular,
triple_quoted: false,
},
),
},
),
},
},

View file

@ -20,36 +20,34 @@ Module(
range: 44..54,
value: TStringValue {
inner: Single(
TString(
TString {
range: 44..54,
node_index: AtomicNodeIndex(..),
elements: [
Interpolation(
InterpolatedElement {
range: 46..53,
node_index: AtomicNodeIndex(..),
expression: Name(
ExprName {
node_index: AtomicNodeIndex(..),
range: 47..48,
id: Name("x"),
ctx: Load,
},
),
debug_text: None,
conversion: None,
format_spec: None,
},
),
],
flags: TStringFlags {
quote_style: Double,
prefix: Regular,
triple_quoted: false,
},
TString {
range: 44..54,
node_index: AtomicNodeIndex(..),
elements: [
Interpolation(
InterpolatedElement {
range: 46..53,
node_index: AtomicNodeIndex(..),
expression: Name(
ExprName {
node_index: AtomicNodeIndex(..),
range: 47..48,
id: Name("x"),
ctx: Load,
},
),
debug_text: None,
conversion: None,
format_spec: None,
},
),
],
flags: TStringFlags {
quote_style: Double,
prefix: Regular,
triple_quoted: false,
},
),
},
),
},
},
@ -66,36 +64,34 @@ Module(
range: 55..65,
value: TStringValue {
inner: Single(
TString(
TString {
range: 55..65,
node_index: AtomicNodeIndex(..),
elements: [
Interpolation(
InterpolatedElement {
range: 57..64,
node_index: AtomicNodeIndex(..),
expression: Name(
ExprName {
node_index: AtomicNodeIndex(..),
range: 58..59,
id: Name("x"),
ctx: Load,
},
),
debug_text: None,
conversion: None,
format_spec: None,
},
),
],
flags: TStringFlags {
quote_style: Double,
prefix: Regular,
triple_quoted: false,
},
TString {
range: 55..65,
node_index: AtomicNodeIndex(..),
elements: [
Interpolation(
InterpolatedElement {
range: 57..64,
node_index: AtomicNodeIndex(..),
expression: Name(
ExprName {
node_index: AtomicNodeIndex(..),
range: 58..59,
id: Name("x"),
ctx: Load,
},
),
debug_text: None,
conversion: None,
format_spec: None,
},
),
],
flags: TStringFlags {
quote_style: Double,
prefix: Regular,
triple_quoted: false,
},
),
},
),
},
},

View file

@ -20,43 +20,41 @@ Module(
range: 121..127,
value: TStringValue {
inner: Single(
TString(
TString {
range: 121..127,
node_index: AtomicNodeIndex(..),
elements: [
Interpolation(
InterpolatedElement {
range: 123..126,
node_index: AtomicNodeIndex(..),
expression: Starred(
ExprStarred {
node_index: AtomicNodeIndex(..),
range: 124..125,
value: Name(
ExprName {
node_index: AtomicNodeIndex(..),
range: 125..125,
id: Name(""),
ctx: Invalid,
},
),
ctx: Load,
},
),
debug_text: None,
conversion: None,
format_spec: None,
},
),
],
flags: TStringFlags {
quote_style: Double,
prefix: Regular,
triple_quoted: false,
},
TString {
range: 121..127,
node_index: AtomicNodeIndex(..),
elements: [
Interpolation(
InterpolatedElement {
range: 123..126,
node_index: AtomicNodeIndex(..),
expression: Starred(
ExprStarred {
node_index: AtomicNodeIndex(..),
range: 124..125,
value: Name(
ExprName {
node_index: AtomicNodeIndex(..),
range: 125..125,
id: Name(""),
ctx: Invalid,
},
),
ctx: Load,
},
),
debug_text: None,
conversion: None,
format_spec: None,
},
),
],
flags: TStringFlags {
quote_style: Double,
prefix: Regular,
triple_quoted: false,
},
),
},
),
},
},
@ -73,60 +71,58 @@ Module(
range: 128..141,
value: TStringValue {
inner: Single(
TString(
TString {
range: 128..141,
node_index: AtomicNodeIndex(..),
elements: [
Interpolation(
InterpolatedElement {
range: 130..140,
node_index: AtomicNodeIndex(..),
expression: Starred(
ExprStarred {
node_index: AtomicNodeIndex(..),
range: 131..139,
value: BoolOp(
ExprBoolOp {
node_index: AtomicNodeIndex(..),
range: 132..139,
op: And,
values: [
Name(
ExprName {
node_index: AtomicNodeIndex(..),
range: 132..133,
id: Name("x"),
ctx: Load,
},
),
Name(
ExprName {
node_index: AtomicNodeIndex(..),
range: 138..139,
id: Name("y"),
ctx: Load,
},
),
],
},
),
ctx: Load,
},
),
debug_text: None,
conversion: None,
format_spec: None,
},
),
],
flags: TStringFlags {
quote_style: Double,
prefix: Regular,
triple_quoted: false,
},
TString {
range: 128..141,
node_index: AtomicNodeIndex(..),
elements: [
Interpolation(
InterpolatedElement {
range: 130..140,
node_index: AtomicNodeIndex(..),
expression: Starred(
ExprStarred {
node_index: AtomicNodeIndex(..),
range: 131..139,
value: BoolOp(
ExprBoolOp {
node_index: AtomicNodeIndex(..),
range: 132..139,
op: And,
values: [
Name(
ExprName {
node_index: AtomicNodeIndex(..),
range: 132..133,
id: Name("x"),
ctx: Load,
},
),
Name(
ExprName {
node_index: AtomicNodeIndex(..),
range: 138..139,
id: Name("y"),
ctx: Load,
},
),
],
},
),
ctx: Load,
},
),
debug_text: None,
conversion: None,
format_spec: None,
},
),
],
flags: TStringFlags {
quote_style: Double,
prefix: Regular,
triple_quoted: false,
},
),
},
),
},
},
@ -143,51 +139,49 @@ Module(
range: 142..155,
value: TStringValue {
inner: Single(
TString(
TString {
range: 142..155,
node_index: AtomicNodeIndex(..),
elements: [
Interpolation(
InterpolatedElement {
range: 144..154,
node_index: AtomicNodeIndex(..),
expression: Starred(
ExprStarred {
node_index: AtomicNodeIndex(..),
range: 145..153,
value: Yield(
ExprYield {
node_index: AtomicNodeIndex(..),
range: 146..153,
value: Some(
Name(
ExprName {
node_index: AtomicNodeIndex(..),
range: 152..153,
id: Name("x"),
ctx: Load,
},
),
TString {
range: 142..155,
node_index: AtomicNodeIndex(..),
elements: [
Interpolation(
InterpolatedElement {
range: 144..154,
node_index: AtomicNodeIndex(..),
expression: Starred(
ExprStarred {
node_index: AtomicNodeIndex(..),
range: 145..153,
value: Yield(
ExprYield {
node_index: AtomicNodeIndex(..),
range: 146..153,
value: Some(
Name(
ExprName {
node_index: AtomicNodeIndex(..),
range: 152..153,
id: Name("x"),
ctx: Load,
},
),
},
),
ctx: Load,
},
),
debug_text: None,
conversion: None,
format_spec: None,
},
),
],
flags: TStringFlags {
quote_style: Double,
prefix: Regular,
triple_quoted: false,
},
),
},
),
ctx: Load,
},
),
debug_text: None,
conversion: None,
format_spec: None,
},
),
],
flags: TStringFlags {
quote_style: Double,
prefix: Regular,
triple_quoted: false,
},
),
},
),
},
},

View file

@ -20,78 +20,76 @@ Module(
range: 44..60,
value: TStringValue {
inner: Single(
TString(
TString {
range: 44..60,
node_index: AtomicNodeIndex(..),
elements: [
Interpolation(
InterpolatedElement {
range: 46..56,
node_index: AtomicNodeIndex(..),
expression: Lambda(
ExprLambda {
node_index: AtomicNodeIndex(..),
range: 47..56,
parameters: Some(
Parameters {
range: 54..55,
node_index: AtomicNodeIndex(
0,
),
posonlyargs: [],
args: [
ParameterWithDefault {
TString {
range: 44..60,
node_index: AtomicNodeIndex(..),
elements: [
Interpolation(
InterpolatedElement {
range: 46..56,
node_index: AtomicNodeIndex(..),
expression: Lambda(
ExprLambda {
node_index: AtomicNodeIndex(..),
range: 47..56,
parameters: Some(
Parameters {
range: 54..55,
node_index: AtomicNodeIndex(
0,
),
posonlyargs: [],
args: [
ParameterWithDefault {
range: 54..55,
node_index: AtomicNodeIndex(..),
parameter: Parameter {
range: 54..55,
node_index: AtomicNodeIndex(..),
parameter: Parameter {
name: Identifier {
id: Name("x"),
range: 54..55,
node_index: AtomicNodeIndex(..),
name: Identifier {
id: Name("x"),
range: 54..55,
node_index: AtomicNodeIndex(..),
},
annotation: None,
},
default: None,
annotation: None,
},
],
vararg: None,
kwonlyargs: [],
kwarg: None,
},
),
body: Name(
ExprName {
node_index: AtomicNodeIndex(..),
range: 56..56,
id: Name(""),
ctx: Invalid,
},
),
},
),
debug_text: None,
conversion: None,
format_spec: None,
},
),
Literal(
InterpolatedStringLiteralElement {
range: 56..58,
node_index: AtomicNodeIndex(..),
value: " x",
},
),
],
flags: TStringFlags {
quote_style: Double,
prefix: Regular,
triple_quoted: false,
},
default: None,
},
],
vararg: None,
kwonlyargs: [],
kwarg: None,
},
),
body: Name(
ExprName {
node_index: AtomicNodeIndex(..),
range: 56..56,
id: Name(""),
ctx: Invalid,
},
),
},
),
debug_text: None,
conversion: None,
format_spec: None,
},
),
Literal(
InterpolatedStringLiteralElement {
range: 56..58,
node_index: AtomicNodeIndex(..),
value: " x",
},
),
],
flags: TStringFlags {
quote_style: Double,
prefix: Regular,
triple_quoted: false,
},
),
},
),
},
},

View file

@ -20,36 +20,34 @@ Module(
range: 44..48,
value: TStringValue {
inner: Single(
TString(
TString {
range: 44..48,
node_index: AtomicNodeIndex(..),
elements: [
Interpolation(
InterpolatedElement {
range: 46..47,
node_index: AtomicNodeIndex(..),
expression: Name(
ExprName {
node_index: AtomicNodeIndex(..),
range: 47..47,
id: Name(""),
ctx: Invalid,
},
),
debug_text: None,
conversion: None,
format_spec: None,
},
),
],
flags: TStringFlags {
quote_style: Double,
prefix: Regular,
triple_quoted: false,
},
TString {
range: 44..48,
node_index: AtomicNodeIndex(..),
elements: [
Interpolation(
InterpolatedElement {
range: 46..47,
node_index: AtomicNodeIndex(..),
expression: Name(
ExprName {
node_index: AtomicNodeIndex(..),
range: 47..47,
id: Name(""),
ctx: Invalid,
},
),
debug_text: None,
conversion: None,
format_spec: None,
},
),
],
flags: TStringFlags {
quote_style: Double,
prefix: Regular,
triple_quoted: false,
},
),
},
),
},
},
@ -66,36 +64,34 @@ Module(
range: 49..58,
value: TStringValue {
inner: Single(
TString(
TString {
range: 49..58,
node_index: AtomicNodeIndex(..),
elements: [
Interpolation(
InterpolatedElement {
range: 51..58,
node_index: AtomicNodeIndex(..),
expression: Name(
ExprName {
node_index: AtomicNodeIndex(..),
range: 52..55,
id: Name("foo"),
ctx: Load,
},
),
debug_text: None,
conversion: None,
format_spec: None,
},
),
],
flags: TStringFlags {
quote_style: Double,
prefix: Regular,
triple_quoted: false,
},
TString {
range: 49..58,
node_index: AtomicNodeIndex(..),
elements: [
Interpolation(
InterpolatedElement {
range: 51..58,
node_index: AtomicNodeIndex(..),
expression: Name(
ExprName {
node_index: AtomicNodeIndex(..),
range: 52..55,
id: Name("foo"),
ctx: Load,
},
),
debug_text: None,
conversion: None,
format_spec: None,
},
),
],
flags: TStringFlags {
quote_style: Double,
prefix: Regular,
triple_quoted: false,
},
),
},
),
},
},
@ -112,41 +108,39 @@ Module(
range: 59..67,
value: TStringValue {
inner: Single(
TString(
TString {
range: 59..67,
node_index: AtomicNodeIndex(..),
elements: [
Interpolation(
InterpolatedElement {
range: 61..66,
node_index: AtomicNodeIndex(..),
expression: Name(
ExprName {
node_index: AtomicNodeIndex(..),
range: 62..65,
id: Name("foo"),
ctx: Load,
},
),
debug_text: Some(
DebugText {
leading: "",
trailing: "=",
},
),
conversion: None,
format_spec: None,
},
),
],
flags: TStringFlags {
quote_style: Double,
prefix: Regular,
triple_quoted: false,
},
TString {
range: 59..67,
node_index: AtomicNodeIndex(..),
elements: [
Interpolation(
InterpolatedElement {
range: 61..66,
node_index: AtomicNodeIndex(..),
expression: Name(
ExprName {
node_index: AtomicNodeIndex(..),
range: 62..65,
id: Name("foo"),
ctx: Load,
},
),
debug_text: Some(
DebugText {
leading: "",
trailing: "=",
},
),
conversion: None,
format_spec: None,
},
),
],
flags: TStringFlags {
quote_style: Double,
prefix: Regular,
triple_quoted: false,
},
),
},
),
},
},
@ -164,66 +158,62 @@ Module(
value: TStringValue {
inner: Concatenated(
[
TString(
TString {
range: 68..72,
node_index: AtomicNodeIndex(..),
elements: [
Interpolation(
InterpolatedElement {
range: 70..71,
node_index: AtomicNodeIndex(..),
expression: Name(
ExprName {
node_index: AtomicNodeIndex(..),
range: 71..71,
id: Name(""),
ctx: Invalid,
},
),
debug_text: None,
conversion: None,
format_spec: None,
},
),
],
flags: TStringFlags {
quote_style: Double,
prefix: Regular,
triple_quoted: false,
},
TString {
range: 68..72,
node_index: AtomicNodeIndex(..),
elements: [
Interpolation(
InterpolatedElement {
range: 70..71,
node_index: AtomicNodeIndex(..),
expression: Name(
ExprName {
node_index: AtomicNodeIndex(..),
range: 71..71,
id: Name(""),
ctx: Invalid,
},
),
debug_text: None,
conversion: None,
format_spec: None,
},
),
],
flags: TStringFlags {
quote_style: Double,
prefix: Regular,
triple_quoted: false,
},
),
TString(
TString {
range: 73..81,
node_index: AtomicNodeIndex(..),
elements: [
Interpolation(
InterpolatedElement {
range: 77..78,
node_index: AtomicNodeIndex(..),
expression: Name(
ExprName {
node_index: AtomicNodeIndex(..),
range: 78..78,
id: Name(""),
ctx: Invalid,
},
),
debug_text: None,
conversion: None,
format_spec: None,
},
),
],
flags: TStringFlags {
quote_style: Double,
prefix: Regular,
triple_quoted: true,
},
},
TString {
range: 73..81,
node_index: AtomicNodeIndex(..),
elements: [
Interpolation(
InterpolatedElement {
range: 77..78,
node_index: AtomicNodeIndex(..),
expression: Name(
ExprName {
node_index: AtomicNodeIndex(..),
range: 78..78,
id: Name(""),
ctx: Invalid,
},
),
debug_text: None,
conversion: None,
format_spec: None,
},
),
],
flags: TStringFlags {
quote_style: Double,
prefix: Regular,
triple_quoted: true,
},
),
},
],
),
},

View file

@ -20,49 +20,47 @@ Module(
range: 44..56,
value: TStringValue {
inner: Single(
TString(
TString {
range: 44..56,
node_index: AtomicNodeIndex(..),
elements: [
Literal(
InterpolatedStringLiteralElement {
range: 46..52,
node_index: AtomicNodeIndex(..),
value: "hello ",
},
),
Interpolation(
InterpolatedElement {
range: 52..55,
node_index: AtomicNodeIndex(..),
expression: Name(
ExprName {
node_index: AtomicNodeIndex(..),
range: 53..54,
id: Name("x"),
ctx: Load,
},
),
debug_text: None,
conversion: None,
format_spec: Some(
InterpolatedStringFormatSpec {
range: 55..55,
node_index: AtomicNodeIndex(..),
elements: [],
},
),
},
),
],
flags: TStringFlags {
quote_style: Double,
prefix: Regular,
triple_quoted: false,
},
TString {
range: 44..56,
node_index: AtomicNodeIndex(..),
elements: [
Literal(
InterpolatedStringLiteralElement {
range: 46..52,
node_index: AtomicNodeIndex(..),
value: "hello ",
},
),
Interpolation(
InterpolatedElement {
range: 52..55,
node_index: AtomicNodeIndex(..),
expression: Name(
ExprName {
node_index: AtomicNodeIndex(..),
range: 53..54,
id: Name("x"),
ctx: Load,
},
),
debug_text: None,
conversion: None,
format_spec: Some(
InterpolatedStringFormatSpec {
range: 55..55,
node_index: AtomicNodeIndex(..),
elements: [],
},
),
},
),
],
flags: TStringFlags {
quote_style: Double,
prefix: Regular,
triple_quoted: false,
},
),
},
),
},
},
@ -79,57 +77,55 @@ Module(
range: 57..72,
value: TStringValue {
inner: Single(
TString(
TString {
range: 57..72,
node_index: AtomicNodeIndex(..),
elements: [
Literal(
InterpolatedStringLiteralElement {
range: 59..65,
node_index: AtomicNodeIndex(..),
value: "hello ",
},
),
Interpolation(
InterpolatedElement {
range: 65..71,
node_index: AtomicNodeIndex(..),
expression: Name(
ExprName {
node_index: AtomicNodeIndex(..),
range: 66..67,
id: Name("x"),
ctx: Load,
},
),
debug_text: None,
conversion: None,
format_spec: Some(
InterpolatedStringFormatSpec {
range: 68..71,
node_index: AtomicNodeIndex(..),
elements: [
Literal(
InterpolatedStringLiteralElement {
range: 68..71,
node_index: AtomicNodeIndex(..),
value: ".3f",
},
),
],
},
),
},
),
],
flags: TStringFlags {
quote_style: Double,
prefix: Regular,
triple_quoted: false,
},
TString {
range: 57..72,
node_index: AtomicNodeIndex(..),
elements: [
Literal(
InterpolatedStringLiteralElement {
range: 59..65,
node_index: AtomicNodeIndex(..),
value: "hello ",
},
),
Interpolation(
InterpolatedElement {
range: 65..71,
node_index: AtomicNodeIndex(..),
expression: Name(
ExprName {
node_index: AtomicNodeIndex(..),
range: 66..67,
id: Name("x"),
ctx: Load,
},
),
debug_text: None,
conversion: None,
format_spec: Some(
InterpolatedStringFormatSpec {
range: 68..71,
node_index: AtomicNodeIndex(..),
elements: [
Literal(
InterpolatedStringLiteralElement {
range: 68..71,
node_index: AtomicNodeIndex(..),
value: ".3f",
},
),
],
},
),
},
),
],
flags: TStringFlags {
quote_style: Double,
prefix: Regular,
triple_quoted: false,
},
),
},
),
},
},

View file

@ -8,7 +8,7 @@ input_file: crates/ruff_python_parser/resources/inline/err/template_strings_py31
Module(
ModModule {
node_index: AtomicNodeIndex(..),
range: 0..117,
range: 0..89,
body: [
Expr(
StmtExpr {
@ -20,36 +20,34 @@ Module(
range: 44..52,
value: TStringValue {
inner: Single(
TString(
TString {
range: 44..52,
node_index: AtomicNodeIndex(..),
elements: [
Interpolation(
InterpolatedElement {
range: 46..51,
node_index: AtomicNodeIndex(..),
expression: Name(
ExprName {
node_index: AtomicNodeIndex(..),
range: 47..50,
id: Name("hey"),
ctx: Load,
},
),
debug_text: None,
conversion: None,
format_spec: None,
},
),
],
flags: TStringFlags {
quote_style: Double,
prefix: Regular,
triple_quoted: false,
},
TString {
range: 44..52,
node_index: AtomicNodeIndex(..),
elements: [
Interpolation(
InterpolatedElement {
range: 46..51,
node_index: AtomicNodeIndex(..),
expression: Name(
ExprName {
node_index: AtomicNodeIndex(..),
range: 47..50,
id: Name("hey"),
ctx: Load,
},
),
debug_text: None,
conversion: None,
format_spec: None,
},
),
],
flags: TStringFlags {
quote_style: Double,
prefix: Regular,
triple_quoted: false,
},
),
},
),
},
},
@ -66,36 +64,34 @@ Module(
range: 53..63,
value: TStringValue {
inner: Single(
TString(
TString {
range: 53..63,
node_index: AtomicNodeIndex(..),
elements: [
Interpolation(
InterpolatedElement {
range: 55..62,
node_index: AtomicNodeIndex(..),
expression: Name(
ExprName {
node_index: AtomicNodeIndex(..),
range: 56..61,
id: Name("there"),
ctx: Load,
},
),
debug_text: None,
conversion: None,
format_spec: None,
},
),
],
flags: TStringFlags {
quote_style: Single,
prefix: Regular,
triple_quoted: false,
},
TString {
range: 53..63,
node_index: AtomicNodeIndex(..),
elements: [
Interpolation(
InterpolatedElement {
range: 55..62,
node_index: AtomicNodeIndex(..),
expression: Name(
ExprName {
node_index: AtomicNodeIndex(..),
range: 56..61,
id: Name("there"),
ctx: Load,
},
),
debug_text: None,
conversion: None,
format_spec: None,
},
),
],
flags: TStringFlags {
quote_style: Single,
prefix: Regular,
triple_quoted: false,
},
),
},
),
},
},
@ -112,76 +108,24 @@ Module(
range: 64..88,
value: TStringValue {
inner: Single(
TString(
TString {
range: 64..88,
node_index: AtomicNodeIndex(..),
elements: [
Literal(
InterpolatedStringLiteralElement {
range: 68..85,
node_index: AtomicNodeIndex(..),
value: "what's\nhappening?",
},
),
],
flags: TStringFlags {
quote_style: Double,
prefix: Regular,
triple_quoted: true,
},
TString {
range: 64..88,
node_index: AtomicNodeIndex(..),
elements: [
Literal(
InterpolatedStringLiteralElement {
range: 68..85,
node_index: AtomicNodeIndex(..),
value: "what's\nhappening?",
},
),
],
flags: TStringFlags {
quote_style: Double,
prefix: Regular,
triple_quoted: true,
},
),
),
},
},
),
},
),
Expr(
StmtExpr {
node_index: AtomicNodeIndex(..),
range: 89..116,
value: TString(
ExprTString {
node_index: AtomicNodeIndex(..),
range: 89..116,
value: TStringValue {
inner: Concatenated(
[
Literal(
StringLiteral {
range: 89..101,
node_index: AtomicNodeIndex(..),
value: "implicitly",
flags: StringLiteralFlags {
quote_style: Double,
prefix: Empty,
triple_quoted: false,
},
},
),
TString(
TString {
range: 101..116,
node_index: AtomicNodeIndex(..),
elements: [
Literal(
InterpolatedStringLiteralElement {
range: 103..115,
node_index: AtomicNodeIndex(..),
value: "concatenated",
},
),
],
flags: TStringFlags {
quote_style: Double,
prefix: Regular,
triple_quoted: false,
},
},
),
],
},
),
},
},
@ -219,13 +163,4 @@ Module(
4 | / t"""what's
5 | | happening?"""
| |_____________^ Syntax Error: Cannot use t-strings on Python 3.13 (syntax was added in Python 3.14)
6 | "implicitly"t"concatenated"
|
|
4 | t"""what's
5 | happening?"""
6 | "implicitly"t"concatenated"
| ^^^^^^^^^^^^^^^ Syntax Error: Cannot use t-strings on Python 3.13 (syntax was added in Python 3.14)
|

View file

@ -8,7 +8,7 @@ input_file: crates/ruff_python_parser/resources/inline/ok/template_strings_py314
Module(
ModModule {
node_index: AtomicNodeIndex(..),
range: 0..117,
range: 0..89,
body: [
Expr(
StmtExpr {
@ -20,36 +20,34 @@ Module(
range: 44..52,
value: TStringValue {
inner: Single(
TString(
TString {
range: 44..52,
node_index: AtomicNodeIndex(..),
elements: [
Interpolation(
InterpolatedElement {
range: 46..51,
node_index: AtomicNodeIndex(..),
expression: Name(
ExprName {
node_index: AtomicNodeIndex(..),
range: 47..50,
id: Name("hey"),
ctx: Load,
},
),
debug_text: None,
conversion: None,
format_spec: None,
},
),
],
flags: TStringFlags {
quote_style: Double,
prefix: Regular,
triple_quoted: false,
},
TString {
range: 44..52,
node_index: AtomicNodeIndex(..),
elements: [
Interpolation(
InterpolatedElement {
range: 46..51,
node_index: AtomicNodeIndex(..),
expression: Name(
ExprName {
node_index: AtomicNodeIndex(..),
range: 47..50,
id: Name("hey"),
ctx: Load,
},
),
debug_text: None,
conversion: None,
format_spec: None,
},
),
],
flags: TStringFlags {
quote_style: Double,
prefix: Regular,
triple_quoted: false,
},
),
},
),
},
},
@ -66,36 +64,34 @@ Module(
range: 53..63,
value: TStringValue {
inner: Single(
TString(
TString {
range: 53..63,
node_index: AtomicNodeIndex(..),
elements: [
Interpolation(
InterpolatedElement {
range: 55..62,
node_index: AtomicNodeIndex(..),
expression: Name(
ExprName {
node_index: AtomicNodeIndex(..),
range: 56..61,
id: Name("there"),
ctx: Load,
},
),
debug_text: None,
conversion: None,
format_spec: None,
},
),
],
flags: TStringFlags {
quote_style: Single,
prefix: Regular,
triple_quoted: false,
},
TString {
range: 53..63,
node_index: AtomicNodeIndex(..),
elements: [
Interpolation(
InterpolatedElement {
range: 55..62,
node_index: AtomicNodeIndex(..),
expression: Name(
ExprName {
node_index: AtomicNodeIndex(..),
range: 56..61,
id: Name("there"),
ctx: Load,
},
),
debug_text: None,
conversion: None,
format_spec: None,
},
),
],
flags: TStringFlags {
quote_style: Single,
prefix: Regular,
triple_quoted: false,
},
),
},
),
},
},
@ -112,76 +108,24 @@ Module(
range: 64..88,
value: TStringValue {
inner: Single(
TString(
TString {
range: 64..88,
node_index: AtomicNodeIndex(..),
elements: [
Literal(
InterpolatedStringLiteralElement {
range: 68..85,
node_index: AtomicNodeIndex(..),
value: "what's\nhappening?",
},
),
],
flags: TStringFlags {
quote_style: Double,
prefix: Regular,
triple_quoted: true,
},
TString {
range: 64..88,
node_index: AtomicNodeIndex(..),
elements: [
Literal(
InterpolatedStringLiteralElement {
range: 68..85,
node_index: AtomicNodeIndex(..),
value: "what's\nhappening?",
},
),
],
flags: TStringFlags {
quote_style: Double,
prefix: Regular,
triple_quoted: true,
},
),
),
},
},
),
},
),
Expr(
StmtExpr {
node_index: AtomicNodeIndex(..),
range: 89..116,
value: TString(
ExprTString {
node_index: AtomicNodeIndex(..),
range: 89..116,
value: TStringValue {
inner: Concatenated(
[
Literal(
StringLiteral {
range: 89..101,
node_index: AtomicNodeIndex(..),
value: "implicitly",
flags: StringLiteralFlags {
quote_style: Double,
prefix: Empty,
triple_quoted: false,
},
},
),
TString(
TString {
range: 101..116,
node_index: AtomicNodeIndex(..),
elements: [
Literal(
InterpolatedStringLiteralElement {
range: 103..115,
node_index: AtomicNodeIndex(..),
value: "concatenated",
},
),
],
flags: TStringFlags {
quote_style: Double,
prefix: Regular,
triple_quoted: false,
},
},
),
],
},
),
},
},