diff --git a/crates/ruff_linter/resources/test/fixtures/flake8_bandit/S104.py b/crates/ruff_linter/resources/test/fixtures/flake8_bandit/S104.py index 9dcd08ecec..76ea6ce8f6 100644 --- a/crates/ruff_linter/resources/test/fixtures/flake8_bandit/S104.py +++ b/crates/ruff_linter/resources/test/fixtures/flake8_bandit/S104.py @@ -25,5 +25,5 @@ def my_func(): # t-strings - all ok t"0.0.0.0" -"0.0.0.0" t"0.0.0.0{expr}0.0.0.0" -"0.0.0.0" f"0.0.0.0{expr}0.0.0.0" t"0.0.0.0{expr}0.0.0.0" +t"0.0.0.0" t"0.0.0.0{expr}0.0.0.0" +t"0.0.0.0" t"0.0.0.0{expr}0.0.0.0" t"0.0.0.0{expr}0.0.0.0" diff --git a/crates/ruff_python_ast/src/comparable.rs b/crates/ruff_python_ast/src/comparable.rs index 170e20ebc7..8494eca2b8 100644 --- a/crates/ruff_python_ast/src/comparable.rs +++ b/crates/ruff_python_ast/src/comparable.rs @@ -708,23 +708,10 @@ pub struct ComparableTString<'a> { } impl<'a> From<&'a ast::TStringValue> for ComparableTString<'a> { - // The approach taken below necessarily deviates from the - // corresponding implementation for [`ast::FStringValue`]. - // The reason is that a t-string value is composed of _three_ - // non-comparable parts: literals, f-string expressions, and - // t-string interpolations. Since we have merged the AST nodes - // that capture f-string expressions and t-string interpolations - // into the shared [`ast::InterpolatedElement`], we must - // be careful to distinguish between them here. + // We model a [`ComparableTString`] on the actual + // [CPython implementation] of a `string.templatelib.Template` object. // - // Consequently, we model a [`ComparableTString`] on the actual - // [CPython implementation] of a `string.templatelib.Template` object: - // it is composed of `strings` and `interpolations`. In CPython, - // the `strings` field is a tuple of honest strings (since f-strings - // are evaluated). Our `strings` field will house both f-string - // expressions and string literals. - // - // Finally, as in CPython, we must be careful to ensure that the length + // As in CPython, we must be careful to ensure that the length // of `strings` is always one more than the length of `interpolations` - // that way we can recover the original reading order by interleaving // starting with `strings`. This is how we can tell the @@ -768,19 +755,6 @@ impl<'a> From<&'a ast::TStringValue> for ComparableTString<'a> { .push(ComparableInterpolatedStringElement::Literal("".into())); } - fn push_fstring_expression(&mut self, expression: &'a ast::InterpolatedElement) { - if let Some(ComparableInterpolatedStringElement::Literal(last_literal)) = - self.strings.last() - { - // Recall that we insert empty strings after - // each interpolation. If we encounter an f-string - // expression, we replace the empty string with it. - if last_literal.is_empty() { - self.strings.pop(); - } - } - self.strings.push(expression.into()); - } fn push_tstring_interpolation(&mut self, expression: &'a ast::InterpolatedElement) { self.interpolations.push(expression.into()); self.start_new_literal(); @@ -789,34 +763,13 @@ impl<'a> From<&'a ast::TStringValue> for ComparableTString<'a> { let mut collector = Collector::default(); - for part in value { - match part { - ast::TStringPart::Literal(string_literal) => { - collector.push_literal(&string_literal.value); + for element in value.elements() { + match element { + ast::InterpolatedStringElement::Literal(literal) => { + collector.push_literal(&literal.value); } - ast::TStringPart::TString(fstring) => { - for element in &fstring.elements { - match element { - ast::InterpolatedStringElement::Literal(literal) => { - collector.push_literal(&literal.value); - } - ast::InterpolatedStringElement::Interpolation(interpolation) => { - collector.push_tstring_interpolation(interpolation); - } - } - } - } - ast::TStringPart::FString(fstring) => { - for element in &fstring.elements { - match element { - ast::InterpolatedStringElement::Literal(literal) => { - collector.push_literal(&literal.value); - } - ast::InterpolatedStringElement::Interpolation(expression) => { - collector.push_fstring_expression(expression); - } - } - } + ast::InterpolatedStringElement::Interpolation(interpolation) => { + collector.push_tstring_interpolation(interpolation); } } } diff --git a/crates/ruff_python_ast/src/expression.rs b/crates/ruff_python_ast/src/expression.rs index 14fe4e1170..7aaa82c95f 100644 --- a/crates/ruff_python_ast/src/expression.rs +++ b/crates/ruff_python_ast/src/expression.rs @@ -320,7 +320,7 @@ pub enum StringLikePartIter<'a> { String(std::slice::Iter<'a, ast::StringLiteral>), Bytes(std::slice::Iter<'a, ast::BytesLiteral>), FString(std::slice::Iter<'a, ast::FStringPart>), - TString(std::slice::Iter<'a, ast::TStringPart>), + TString(std::slice::Iter<'a, ast::TString>), } impl<'a> Iterator for StringLikePartIter<'a> { @@ -339,16 +339,7 @@ impl<'a> Iterator for StringLikePartIter<'a> { ast::FStringPart::FString(f_string) => StringLikePart::FString(f_string), } } - StringLikePartIter::TString(inner) => { - let part = inner.next()?; - match part { - ast::TStringPart::Literal(string_literal) => { - StringLikePart::String(string_literal) - } - ast::TStringPart::TString(t_string) => StringLikePart::TString(t_string), - ast::TStringPart::FString(f_string) => StringLikePart::FString(f_string), - } - } + StringLikePartIter::TString(inner) => StringLikePart::TString(inner.next()?), }; Some(part) @@ -378,16 +369,7 @@ impl DoubleEndedIterator for StringLikePartIter<'_> { ast::FStringPart::FString(f_string) => StringLikePart::FString(f_string), } } - StringLikePartIter::TString(inner) => { - let part = inner.next_back()?; - match part { - ast::TStringPart::Literal(string_literal) => { - StringLikePart::String(string_literal) - } - ast::TStringPart::TString(t_string) => StringLikePart::TString(t_string), - ast::TStringPart::FString(f_string) => StringLikePart::FString(f_string), - } - } + StringLikePartIter::TString(inner) => StringLikePart::TString(inner.next_back()?), }; Some(part) diff --git a/crates/ruff_python_ast/src/helpers.rs b/crates/ruff_python_ast/src/helpers.rs index de17f50869..b2535ecfb1 100644 --- a/crates/ruff_python_ast/src/helpers.rs +++ b/crates/ruff_python_ast/src/helpers.rs @@ -1274,6 +1274,7 @@ impl Truthiness { Self::Unknown } } + Expr::TString(_) => Self::Truthy, Expr::List(ast::ExprList { elts, .. }) | Expr::Set(ast::ExprSet { elts, .. }) | Expr::Tuple(ast::ExprTuple { elts, .. }) => { @@ -1362,6 +1363,7 @@ fn is_non_empty_f_string(expr: &ast::ExprFString) -> bool { Expr::EllipsisLiteral(_) => true, Expr::List(_) => true, Expr::Tuple(_) => true, + Expr::TString(_) => true, // These expressions must resolve to the inner expression. Expr::If(ast::ExprIf { body, orelse, .. }) => inner(body) && inner(orelse), @@ -1386,7 +1388,6 @@ fn is_non_empty_f_string(expr: &ast::ExprFString) -> bool { // These literals may or may not be empty. Expr::FString(f_string) => is_non_empty_f_string(f_string), // These literals may or may not be empty. - Expr::TString(f_string) => is_non_empty_t_string(f_string), Expr::StringLiteral(ast::ExprStringLiteral { value, .. }) => !value.is_empty(), Expr::BytesLiteral(ast::ExprBytesLiteral { value, .. }) => !value.is_empty(), } @@ -1403,76 +1404,6 @@ fn is_non_empty_f_string(expr: &ast::ExprFString) -> bool { }) } -/// Returns `true` if the expression definitely resolves to a non-empty string, when used as an -/// f-string expression, or `false` if the expression may resolve to an empty string. -fn is_non_empty_t_string(expr: &ast::ExprTString) -> bool { - fn inner(expr: &Expr) -> bool { - match expr { - // When stringified, these expressions are always non-empty. - Expr::Lambda(_) => true, - Expr::Dict(_) => true, - Expr::Set(_) => true, - Expr::ListComp(_) => true, - Expr::SetComp(_) => true, - Expr::DictComp(_) => true, - Expr::Compare(_) => true, - Expr::NumberLiteral(_) => true, - Expr::BooleanLiteral(_) => true, - Expr::NoneLiteral(_) => true, - Expr::EllipsisLiteral(_) => true, - Expr::List(_) => true, - Expr::Tuple(_) => true, - - // These expressions must resolve to the inner expression. - Expr::If(ast::ExprIf { body, orelse, .. }) => inner(body) && inner(orelse), - Expr::Named(ast::ExprNamed { value, .. }) => inner(value), - - // These expressions are complex. We can't determine whether they're empty or not. - Expr::BoolOp(ast::ExprBoolOp { .. }) => false, - Expr::BinOp(ast::ExprBinOp { .. }) => false, - Expr::UnaryOp(ast::ExprUnaryOp { .. }) => false, - Expr::Generator(_) => false, - Expr::Await(_) => false, - Expr::Yield(_) => false, - Expr::YieldFrom(_) => false, - Expr::Call(_) => false, - Expr::Attribute(_) => false, - Expr::Subscript(_) => false, - Expr::Starred(_) => false, - Expr::Name(_) => false, - Expr::Slice(_) => false, - Expr::IpyEscapeCommand(_) => false, - - // These literals may or may not be empty. - Expr::FString(f_string) => is_non_empty_f_string(f_string), - // These literals may or may not be empty. - Expr::TString(t_string) => is_non_empty_t_string(t_string), - Expr::StringLiteral(ast::ExprStringLiteral { value, .. }) => !value.is_empty(), - Expr::BytesLiteral(ast::ExprBytesLiteral { value, .. }) => !value.is_empty(), - } - } - - expr.value.iter().any(|part| match part { - ast::TStringPart::Literal(string_literal) => !string_literal.is_empty(), - ast::TStringPart::TString(t_string) => { - t_string.elements.iter().all(|element| match element { - ast::InterpolatedStringElement::Literal(string_literal) => { - !string_literal.is_empty() - } - ast::InterpolatedStringElement::Interpolation(t_string) => { - inner(&t_string.expression) - } - }) - } - ast::TStringPart::FString(f_string) => { - f_string.elements.iter().all(|element| match element { - InterpolatedStringElement::Literal(string_literal) => !string_literal.is_empty(), - InterpolatedStringElement::Interpolation(f_string) => inner(&f_string.expression), - }) - } - }) -} - /// Returns `true` if the expression definitely resolves to the empty string, when used as an f-string /// expression. fn is_empty_f_string(expr: &ast::ExprFString) -> bool { diff --git a/crates/ruff_python_ast/src/node.rs b/crates/ruff_python_ast/src/node.rs index b9b637b2b4..58ad37925c 100644 --- a/crates/ruff_python_ast/src/node.rs +++ b/crates/ruff_python_ast/src/node.rs @@ -171,18 +171,8 @@ impl ast::ExprTString { node_index: _, } = self; - for t_string_part in value { - match t_string_part { - ast::TStringPart::Literal(string_literal) => { - visitor.visit_string_literal(string_literal); - } - ast::TStringPart::FString(f_string) => { - visitor.visit_f_string(f_string); - } - ast::TStringPart::TString(t_string) => { - visitor.visit_t_string(t_string); - } - } + for t_string in value { + visitor.visit_t_string(t_string); } } } diff --git a/crates/ruff_python_ast/src/nodes.rs b/crates/ruff_python_ast/src/nodes.rs index fc9c3f8851..2c90c0fe7c 100644 --- a/crates/ruff_python_ast/src/nodes.rs +++ b/crates/ruff_python_ast/src/nodes.rs @@ -597,8 +597,8 @@ impl ExprTString { /// otherwise. pub const fn as_single_part_tstring(&self) -> Option<&TString> { match &self.value.inner { - TStringValueInner::Single(TStringPart::TString(tstring)) => Some(tstring), - _ => None, + TStringValueInner::Single(tstring) => Some(tstring), + TStringValueInner::Concatenated(_) => None, } } } @@ -614,7 +614,7 @@ impl TStringValue { /// Creates a new t-string literal with a single [`TString`] part. pub fn single(value: TString) -> Self { Self { - inner: TStringValueInner::Single(TStringPart::TString(value)), + inner: TStringValueInner::Single(value), } } @@ -625,7 +625,7 @@ impl TStringValue { /// /// Panics if `values` has less than 2 elements. /// Use [`TStringValue::single`] instead. - pub fn concatenated(values: Vec) -> Self { + pub fn concatenated(values: Vec) -> Self { assert!( values.len() > 1, "Use `TStringValue::single` to create single-part t-strings" @@ -640,78 +640,52 @@ impl TStringValue { matches!(self.inner, TStringValueInner::Concatenated(_)) } - /// Returns a slice of all the [`TStringPart`]s contained in this value. - pub fn as_slice(&self) -> &[TStringPart] { + /// Returns a slice of all the [`TString`]s contained in this value. + pub fn as_slice(&self) -> &[TString] { match &self.inner { TStringValueInner::Single(part) => std::slice::from_ref(part), TStringValueInner::Concatenated(parts) => parts, } } - /// Returns a mutable slice of all the [`TStringPart`]s contained in this value. - fn as_mut_slice(&mut self) -> &mut [TStringPart] { + /// Returns a mutable slice of all the [`TString`]s contained in this value. + fn as_mut_slice(&mut self) -> &mut [TString] { match &mut self.inner { TStringValueInner::Single(part) => std::slice::from_mut(part), TStringValueInner::Concatenated(parts) => parts, } } - /// Returns an iterator over all the [`TStringPart`]s contained in this value. - pub fn iter(&self) -> Iter { + /// Returns an iterator over all the [`TString`]s contained in this value. + pub fn iter(&self) -> Iter { self.as_slice().iter() } - /// Returns an iterator over all the [`TStringPart`]s contained in this value + /// Returns an iterator over all the [`TString`]s contained in this value /// that allows modification. - pub fn iter_mut(&mut self) -> IterMut { + pub fn iter_mut(&mut self) -> IterMut { self.as_mut_slice().iter_mut() } - /// Returns an iterator over the [`StringLiteral`] parts contained in this value. - /// - /// Note that this doesn't recurse into the t-string parts. For example, - /// - /// ```python - /// "foo" t"bar {x}" "baz" t"qux" - /// ``` - /// - /// Here, the string literal parts returned would be `"foo"` and `"baz"`. - pub fn literals(&self) -> impl Iterator { - self.iter().filter_map(|part| part.as_literal()) - } - - /// Returns an iterator over the [`TString`] parts contained in this value. - /// - /// Note that this doesn't recurse into the t-string parts. For example, - /// - /// ```python - /// "foo" t"bar {x}" "baz" t"qux" - /// ``` - /// - /// Here, the t-string parts returned would be `f"bar {x}"` and `f"qux"`. - pub fn t_strings(&self) -> impl Iterator { - self.iter().filter_map(|part| part.as_t_string()) - } - /// Returns an iterator over all the [`InterpolatedStringElement`] contained in this value. /// - /// An t-string element is what makes up an [`TString`] i.e., it is either a + /// An interpolated string element is what makes up an [`TString`] i.e., it is either a /// string literal or an interpolation. In the following example, /// /// ```python - /// "foo" t"bar {x}" "baz" t"qux" + /// t"foo" t"bar {x}" t"baz" t"qux" /// ``` /// - /// The t-string elements returned would be string literal (`"bar "`), + /// The interpolated string elements returned would be string literal (`"bar "`), /// interpolation (`x`) and string literal (`"qux"`). pub fn elements(&self) -> impl Iterator { - self.t_strings().flat_map(|fstring| fstring.elements.iter()) + self.iter().flat_map(|tstring| tstring.elements.iter()) } } impl<'a> IntoIterator for &'a TStringValue { - type Item = &'a TStringPart; - type IntoIter = Iter<'a, TStringPart>; + type Item = &'a TString; + type IntoIter = Iter<'a, TString>; fn into_iter(self) -> Self::IntoIter { self.iter() @@ -719,8 +693,8 @@ impl<'a> IntoIterator for &'a TStringValue { } impl<'a> IntoIterator for &'a mut TStringValue { - type Item = &'a mut TStringPart; - type IntoIter = IterMut<'a, TStringPart>; + type Item = &'a mut TString; + type IntoIter = IterMut<'a, TString>; fn into_iter(self) -> Self::IntoIter { self.iter_mut() } @@ -731,43 +705,10 @@ impl<'a> IntoIterator for &'a mut TStringValue { #[cfg_attr(feature = "get-size", derive(get_size2::GetSize))] enum TStringValueInner { /// A single t-string i.e., `t"foo"`. - /// - /// This is always going to be `TStringPart::TString` variant which is - /// maintained by the `TStringValue::single` constructor. - Single(TStringPart), + Single(TString), - /// An implicitly concatenated t-string i.e., `"foo" t"bar {x}"`. - Concatenated(Vec), -} - -/// An t-string part which is either a string literal, an f-string, -/// or a t-string. -#[derive(Clone, Debug, PartialEq, is_macro::Is)] -#[cfg_attr(feature = "get-size", derive(get_size2::GetSize))] -pub enum TStringPart { - Literal(StringLiteral), - FString(FString), - TString(TString), -} - -impl TStringPart { - pub fn quote_style(&self) -> Quote { - match self { - Self::Literal(string_literal) => string_literal.flags.quote_style(), - Self::FString(f_string) => f_string.flags.quote_style(), - Self::TString(t_string) => t_string.flags.quote_style(), - } - } -} - -impl Ranged for TStringPart { - fn range(&self) -> TextRange { - match self { - TStringPart::Literal(string_literal) => string_literal.range(), - TStringPart::FString(f_string) => f_string.range(), - TStringPart::TString(t_string) => t_string.range(), - } - } + /// An implicitly concatenated t-string i.e., `t"foo" t"bar {x}"`. + Concatenated(Vec), } pub trait StringFlags: Copy { @@ -1237,6 +1178,12 @@ pub struct TString { pub flags: TStringFlags, } +impl TString { + pub fn quote_style(&self) -> Quote { + self.flags.quote_style() + } +} + impl From for Expr { fn from(payload: TString) -> Self { ExprTString { diff --git a/crates/ruff_python_ast/src/visitor.rs b/crates/ruff_python_ast/src/visitor.rs index 786a7c643f..425c317dc3 100644 --- a/crates/ruff_python_ast/src/visitor.rs +++ b/crates/ruff_python_ast/src/visitor.rs @@ -7,8 +7,8 @@ use crate::{ self as ast, Alias, AnyParameterRef, Arguments, BoolOp, BytesLiteral, CmpOp, Comprehension, Decorator, ElifElseClause, ExceptHandler, Expr, ExprContext, FString, FStringPart, InterpolatedStringElement, Keyword, MatchCase, Operator, Parameter, Parameters, Pattern, - PatternArguments, PatternKeyword, Stmt, StringLiteral, TString, TStringPart, TypeParam, - TypeParamParamSpec, TypeParamTypeVar, TypeParamTypeVarTuple, TypeParams, UnaryOp, WithItem, + PatternArguments, PatternKeyword, Stmt, StringLiteral, TString, TypeParam, TypeParamParamSpec, + TypeParamTypeVar, TypeParamTypeVarTuple, TypeParams, UnaryOp, WithItem, }; /// A trait for AST visitors. Visits all nodes in the AST recursively in evaluation-order. @@ -547,14 +547,8 @@ pub fn walk_expr<'a, V: Visitor<'a> + ?Sized>(visitor: &mut V, expr: &'a Expr) { } } Expr::TString(ast::ExprTString { value, .. }) => { - for part in value { - match part { - TStringPart::Literal(string_literal) => { - visitor.visit_string_literal(string_literal); - } - TStringPart::FString(f_string) => visitor.visit_f_string(f_string), - TStringPart::TString(t_string) => visitor.visit_t_string(t_string), - } + for t_string in value { + visitor.visit_t_string(t_string); } } Expr::StringLiteral(ast::ExprStringLiteral { value, .. }) => { diff --git a/crates/ruff_python_ast/src/visitor/transformer.rs b/crates/ruff_python_ast/src/visitor/transformer.rs index 4ceebf619a..3a526c0471 100644 --- a/crates/ruff_python_ast/src/visitor/transformer.rs +++ b/crates/ruff_python_ast/src/visitor/transformer.rs @@ -533,18 +533,8 @@ pub fn walk_expr(visitor: &V, expr: &mut Expr) { } } Expr::TString(ast::ExprTString { value, .. }) => { - for t_string_part in value.iter_mut() { - match t_string_part { - ast::TStringPart::Literal(string_literal) => { - visitor.visit_string_literal(string_literal); - } - ast::TStringPart::FString(f_string) => { - visitor.visit_f_string(f_string); - } - ast::TStringPart::TString(t_string) => { - visitor.visit_t_string(t_string); - } - } + for t_string in value.iter_mut() { + visitor.visit_t_string(t_string); } } Expr::StringLiteral(ast::ExprStringLiteral { value, .. }) => { diff --git a/crates/ruff_python_ast_integration_tests/tests/comparable.rs b/crates/ruff_python_ast_integration_tests/tests/comparable.rs index 8f792f1bdd..e9e6d7b183 100644 --- a/crates/ruff_python_ast_integration_tests/tests/comparable.rs +++ b/crates/ruff_python_ast_integration_tests/tests/comparable.rs @@ -51,28 +51,12 @@ fn concatenated_fstrings_compare_equal() -> Result<(), ParseError> { #[test] fn concatenated_tstrings_compare_equal() -> Result<(), ParseError> { - let split_contents = r#"t"{foo!r} this" r"\n raw" t" and {bar!s} that""#; + let split_contents = r#"t"{foo!r} this" rt"\n raw" t" and {bar!s} that""#; let value_contents = r#"t"{foo!r} this\\n raw and {bar!s} that""#; assert_comparable(split_contents, value_contents) } -#[test] -fn concatenated_f_and_t_strings_interwoven_compare_equal() -> Result<(), ParseError> { - let split_contents = r#"f"{foo} this " t"{bar}" "baz""#; - let value_contents = r#"f"{foo}" t" this {bar}" "baz""#; - - assert_comparable(split_contents, value_contents) -} - -#[test] -fn concatenated_f_and_t_strings_compare_unequal_when_swapped() -> Result<(), ParseError> { - let f_then_t_contents = r#"f"{foo!r} this" r"\n raw" t" and {bar!s} that""#; - let t_then_f_contents = r#"t"{foo!r} this" r"\n raw" f" and {bar!s} that""#; - - assert_noncomparable(f_then_t_contents, t_then_f_contents) -} - #[test] fn t_strings_literal_order_matters_compare_unequal() -> Result<(), ParseError> { let interp_then_literal_contents = r#"t"{foo}bar""#; @@ -80,11 +64,3 @@ fn t_strings_literal_order_matters_compare_unequal() -> Result<(), ParseError> { assert_noncomparable(interp_then_literal_contents, literal_then_interp_contents) } - -#[test] -fn t_strings_empty_concat_equal() -> Result<(), ParseError> { - let empty_literal = r#""" t"hey{foo}""#; - let empty_f_string = r#"f""t"hey{foo}""#; - - assert_comparable(empty_literal, empty_f_string) -} diff --git a/crates/ruff_python_ast_integration_tests/tests/snapshots/source_order__t_strings.snap b/crates/ruff_python_ast_integration_tests/tests/snapshots/source_order__t_strings.snap index 75e4f537b2..a8f8eeb7e2 100644 --- a/crates/ruff_python_ast_integration_tests/tests/snapshots/source_order__t_strings.snap +++ b/crates/ruff_python_ast_integration_tests/tests/snapshots/source_order__t_strings.snap @@ -5,7 +5,8 @@ expression: trace - ModModule - StmtExpr - ExprTString - - StringLiteral + - TString + - InterpolatedStringLiteralElement - TString - InterpolatedStringLiteralElement - InterpolatedElement diff --git a/crates/ruff_python_ast_integration_tests/tests/snapshots/visitor__t_strings.snap b/crates/ruff_python_ast_integration_tests/tests/snapshots/visitor__t_strings.snap index 58def387aa..7dd12a0b44 100644 --- a/crates/ruff_python_ast_integration_tests/tests/snapshots/visitor__t_strings.snap +++ b/crates/ruff_python_ast_integration_tests/tests/snapshots/visitor__t_strings.snap @@ -4,7 +4,8 @@ expression: trace --- - StmtExpr - ExprTString - - StringLiteral + - TString + - InterpolatedStringLiteralElement - TString - InterpolatedStringLiteralElement - InterpolatedElement diff --git a/crates/ruff_python_ast_integration_tests/tests/source_order.rs b/crates/ruff_python_ast_integration_tests/tests/source_order.rs index ea257eb279..6535152ab5 100644 --- a/crates/ruff_python_ast_integration_tests/tests/source_order.rs +++ b/crates/ruff_python_ast_integration_tests/tests/source_order.rs @@ -148,7 +148,7 @@ fn f_strings() { #[test] fn t_strings() { - let source = r"'pre' t'foo {bar:.{x}f} baz'"; + let source = r"t'pre' t'foo {bar:.{x}f} baz'"; let trace = trace_source_order_visitation(source); diff --git a/crates/ruff_python_ast_integration_tests/tests/visitor.rs b/crates/ruff_python_ast_integration_tests/tests/visitor.rs index b05655d9ba..5f1d01f071 100644 --- a/crates/ruff_python_ast_integration_tests/tests/visitor.rs +++ b/crates/ruff_python_ast_integration_tests/tests/visitor.rs @@ -157,7 +157,7 @@ fn f_strings() { #[test] fn t_strings() { - let source = r"'pre' t'foo {bar:.{x}f} baz'"; + let source = r"t'pre' t'foo {bar:.{x}f} baz'"; let trace = trace_visitation(source); diff --git a/crates/ruff_python_codegen/src/generator.rs b/crates/ruff_python_codegen/src/generator.rs index db6bbd3eec..85d24f48a5 100644 --- a/crates/ruff_python_codegen/src/generator.rs +++ b/crates/ruff_python_codegen/src/generator.rs @@ -1538,19 +1538,9 @@ impl<'a> Generator<'a> { fn unparse_t_string_value(&mut self, value: &ast::TStringValue) { let mut first = true; - for t_string_part in value { + for t_string in value { self.p_delim(&mut first, " "); - match t_string_part { - ast::TStringPart::Literal(string_literal) => { - self.unparse_string_literal(string_literal); - } - ast::TStringPart::FString(f_string) => { - self.unparse_interpolated_string(&f_string.elements, f_string.flags.into()); - } - ast::TStringPart::TString(t_string) => { - self.unparse_interpolated_string(&t_string.elements, t_string.flags.into()); - } - } + self.unparse_interpolated_string(&t_string.elements, t_string.flags.into()); } } diff --git a/crates/ruff_python_formatter/resources/test/fixtures/ruff/expression/join_implicit_concatenated_string.py b/crates/ruff_python_formatter/resources/test/fixtures/ruff/expression/join_implicit_concatenated_string.py index e945211bec..6842ef5da2 100644 --- a/crates/ruff_python_formatter/resources/test/fixtures/ruff/expression/join_implicit_concatenated_string.py +++ b/crates/ruff_python_formatter/resources/test/fixtures/ruff/expression/join_implicit_concatenated_string.py @@ -104,16 +104,13 @@ f"{10 + len('bar')=}" f'{10 + len("bar")=}' # T-strings ############################################################################## -# Escape `{` and `}` when merging a t-string with a string -"a {not_a_variable}" t"b {10}" "c" - # Join, and break expressions t"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa{ expression -}bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb" t"cccccccccccccccccccc {20999}" "more" +}bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb" t"cccccccccccccccccccc {20999}" t"more" # Join, but don't break the expressions -t"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa{expression}bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb" t"cccccccccccccccccccc {20999}" "more" +t"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa{expression}bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb" t"cccccccccccccccccccc {20999}" t"more" t"test{ expression @@ -171,22 +168,11 @@ t"test" tR"test" "single" f""""single""" -"single" t""""single""" +t"single" t""""single""" b"single" b"""triple""" -############################################################################## -# Don't join t-strings and f-strings -############################################################################## - -t"{interp}" f"{expr}" - -f"{expr}" t"{interp}" - -f"{expr}" "string" t"{interp}" - - ############################################################################## # Join strings in with statements ############################################################################## diff --git a/crates/ruff_python_formatter/resources/test/fixtures/ruff/expression/join_implicit_concatenated_string_assignment.py b/crates/ruff_python_formatter/resources/test/fixtures/ruff/expression/join_implicit_concatenated_string_assignment.py index c70233ea52..ed0b5035d8 100644 --- a/crates/ruff_python_formatter/resources/test/fixtures/ruff/expression/join_implicit_concatenated_string_assignment.py +++ b/crates/ruff_python_formatter/resources/test/fixtures/ruff/expression/join_implicit_concatenated_string_assignment.py @@ -345,7 +345,7 @@ a[ b ] = ( t"ccccc{ - expression}ccccccccccc" "cccccccccccccccccccccccc" # comment + expression}ccccccccccc" t"cccccccccccccccccccccccc" # comment ) # Same but starting with a joined string. They should both result in the same formatting. @@ -361,7 +361,7 @@ a[ aaaaaaa, b ] = t"ccccc{ -expression}ccccccccccc" "ccccccccccccccccccccccccccccccccccccccccccc" # comment +expression}ccccccccccc" t"ccccccccccccccccccccccccccccccccccccccccccc" # comment # Split an overlong target, but join the string if it fits @@ -370,7 +370,7 @@ a[ b ].bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb = ( t"ccccc{ - expression}ccccccccccc" "cccccccccccccccccccccccccccccc" # comment + expression}ccccccccccc" t"cccccccccccccccccccccccccccccc" # comment ) # Split both if necessary and keep multiline @@ -379,66 +379,66 @@ a[ b ].bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb = ( t"ccccc{ - expression}cccccccccccccccccccccccccccccccc" "ccccccccccccccccccccccccccccccc" # comment + expression}cccccccccccccccccccccccccccccccc" t"ccccccccccccccccccccccccccccccc" # comment ) # Don't inline t-strings that contain expressions that are guaranteed to split, e.b. because of a magic trailing comma aaaaaaaaaaaaaaaaaa = t"testeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee{ [a,] -}" "moreeeeeeeeeeeeeeeeeeee" "test" # comment +}" t"moreeeeeeeeeeeeeeeeeeee" t"test" # comment aaaaaaaaaaaaaaaaaa = ( t"testeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee{ [a,] -}" "moreeeeeeeeeeeeeeeeeeee" "test" # comment +}" t"moreeeeeeeeeeeeeeeeeeee" t"test" # comment ) aaaaa[aaaaaaaaaaa] = t"testeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee{ [a,] -}" "moreeeeeeeeeeeeeeeeeeee" "test" # comment +}" t"moreeeeeeeeeeeeeeeeeeee" t"test" # comment aaaaa[aaaaaaaaaaa] = (t"testeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee{ [a,] -}" "moreeeeeeeeeeeeeeeeeeee" "test" # comment +}" t"moreeeeeeeeeeeeeeeeeeee" t"test" # comment ) # Don't inline t-strings that contain commented expressions aaaaaaaaaaaaaaaaaa = ( t"testeeeeeeeeeeeeeeeeeeeeeeeee{[ a # comment - ]}" "moreeeeeeeeeeeeeeeeeetest" # comment + ]}" t"moreeeeeeeeeeeeeeeeeetest" # comment ) aaaaa[aaaaaaaaaaa] = ( t"testeeeeeeeeeeeeeeeeeeeeeeeee{[ a # comment - ]}" "moreeeeeeeeeeeeeeeeeetest" # comment + ]}" t"moreeeeeeeeeeeeeeeeeetest" # comment ) # Don't inline t-strings with multiline debug expressions: aaaaaaaaaaaaaaaaaa = ( t"testeeeeeeeeeeeeeeeeeeeeeeeee{ - a=}" "moreeeeeeeeeeeeeeeeeetest" # comment + a=}" t"moreeeeeeeeeeeeeeeeeetest" # comment ) aaaaaaaaaaaaaaaaaa = ( t"testeeeeeeeeeeeeeeeeeeeeeeeee{a + - b=}" "moreeeeeeeeeeeeeeeeeetest" # comment + b=}" t"moreeeeeeeeeeeeeeeeeetest" # comment ) aaaaaaaaaaaaaaaaaa = ( t"testeeeeeeeeeeeeeeeeeeeeeeeee{a - =}" "moreeeeeeeeeeeeeeeeeetest" # comment + =}" t"moreeeeeeeeeeeeeeeeeetest" # comment ) aaaaa[aaaaaaaaaaa] = ( t"testeeeeeeeeeeeeeeeeeeeeeeeee{ - a=}" "moreeeeeeeeeeeeeeeeeetest" # comment + a=}" t"moreeeeeeeeeeeeeeeeeetest" # comment ) aaaaa[aaaaaaaaaaa] = ( t"testeeeeeeeeeeeeeeeeeeeeeeeee{a - =}" "moreeeeeeeeeeeeeeeeeetest" # comment + =}" t"moreeeeeeeeeeeeeeeeeetest" # comment ) @@ -499,7 +499,7 @@ a = ( ) logger.error( - f"Failed to run task {task} for job" + f"Failed to run task {task} for job" f"with id {str(job.id)}" # type: ignore[union-attr] ) diff --git a/crates/ruff_python_formatter/resources/test/fixtures/ruff/expression/tstring.py b/crates/ruff_python_formatter/resources/test/fixtures/ruff/expression/tstring.py index 8e1aaf635b..14bf7c6983 100644 --- a/crates/ruff_python_formatter/resources/test/fixtures/ruff/expression/tstring.py +++ b/crates/ruff_python_formatter/resources/test/fixtures/ruff/expression/tstring.py @@ -8,21 +8,21 @@ rt"Not-so-tricky \"quote" # Regression test for tstrings dropping comments result_f = ( - 'Traceback (most recent call last):\n' + t'Traceback (most recent call last):\n' t' File "{__file__}", line {lineno_f+5}, in _check_recursive_traceback_display\n' - ' f()\n' + t' f()\n' t' File "{__file__}", line {lineno_f+1}, in f\n' - ' f()\n' + t' f()\n' t' File "{__file__}", line {lineno_f+1}, in f\n' - ' f()\n' + t' f()\n' t' File "{__file__}", line {lineno_f+1}, in f\n' - ' f()\n' + t' f()\n' # XXX: The following line changes depending on whether the tests # are run through the interactive interpreter or with -m # It also varies depending on the platform (stack size) # Fortunately, we don't care about exactness here, so we use regex - r' \[Previous line repeated (\d+) more times\]' '\n' - 'RecursionError: maximum recursion depth exceeded\n' + rt' \[Previous line repeated (\d+) more times\]' t'\n' + t'RecursionError: maximum recursion depth exceeded\n' ) @@ -31,7 +31,7 @@ result_f = ( ( t'{1}' # comment 1 - '' + t'' ) ( @@ -655,7 +655,7 @@ hello { # Implicit concatenated t-string containing quotes _ = ( - 'This string should change its quotes to double quotes' + t'This string should change its quotes to double quotes' t'This string uses double quotes in an expression {"it's a quote"}' t'This t-string does not use any quotes.' ) diff --git a/crates/ruff_python_formatter/tests/snapshots/format@expression__join_implicit_concatenated_string.py.snap b/crates/ruff_python_formatter/tests/snapshots/format@expression__join_implicit_concatenated_string.py.snap index 6c577df6bb..4c44a8ecba 100644 --- a/crates/ruff_python_formatter/tests/snapshots/format@expression__join_implicit_concatenated_string.py.snap +++ b/crates/ruff_python_formatter/tests/snapshots/format@expression__join_implicit_concatenated_string.py.snap @@ -110,16 +110,13 @@ f"{10 + len('bar')=}" f'{10 + len("bar")=}' # T-strings ############################################################################## -# Escape `{` and `}` when merging a t-string with a string -"a {not_a_variable}" t"b {10}" "c" - # Join, and break expressions t"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa{ expression -}bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb" t"cccccccccccccccccccc {20999}" "more" +}bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb" t"cccccccccccccccccccc {20999}" t"more" # Join, but don't break the expressions -t"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa{expression}bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb" t"cccccccccccccccccccc {20999}" "more" +t"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa{expression}bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb" t"cccccccccccccccccccc {20999}" t"more" t"test{ expression @@ -177,22 +174,11 @@ t"test" tR"test" "single" f""""single""" -"single" t""""single""" +t"single" t""""single""" b"single" b"""triple""" -############################################################################## -# Don't join t-strings and f-strings -############################################################################## - -t"{interp}" f"{expr}" - -f"{expr}" t"{interp}" - -f"{expr}" "string" t"{interp}" - - ############################################################################## # Join strings in with statements ############################################################################## @@ -521,9 +507,6 @@ f"{10 + len('bar')=}" f'{10 + len("bar")=}' # T-strings ############################################################################## -# Escape `{` and `}` when merging a t-string with a string -t"a {{not_a_variable}}b {10}c" - # Join, and break expressions t"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa{ expression @@ -583,22 +566,11 @@ t"test" Rt"test" "single" f""""single""" -"single" t""""single""" +t"single" t""""single""" b"single" b"""triple""" -############################################################################## -# Don't join t-strings and f-strings -############################################################################## - -t"{interp}" f"{expr}" - -f"{expr}" t"{interp}" - -f"{expr}" "string" t"{interp}" - - ############################################################################## # Join strings in with statements ############################################################################## @@ -905,7 +877,7 @@ f"aaaaaaaaaaaaaaaa \ ```diff --- Stable +++ Preview -@@ -302,9 +302,12 @@ +@@ -288,9 +288,12 @@ ############################################################################## # Use can_omit_optional_parentheses layout to avoid an instability where the formatter # picks the can_omit_optional_parentheses layout when the strings are joined. diff --git a/crates/ruff_python_formatter/tests/snapshots/format@expression__join_implicit_concatenated_string_assignment.py.snap b/crates/ruff_python_formatter/tests/snapshots/format@expression__join_implicit_concatenated_string_assignment.py.snap index c5237dcb54..7e6375d06d 100644 --- a/crates/ruff_python_formatter/tests/snapshots/format@expression__join_implicit_concatenated_string_assignment.py.snap +++ b/crates/ruff_python_formatter/tests/snapshots/format@expression__join_implicit_concatenated_string_assignment.py.snap @@ -351,7 +351,7 @@ a[ b ] = ( t"ccccc{ - expression}ccccccccccc" "cccccccccccccccccccccccc" # comment + expression}ccccccccccc" t"cccccccccccccccccccccccc" # comment ) # Same but starting with a joined string. They should both result in the same formatting. @@ -367,7 +367,7 @@ a[ aaaaaaa, b ] = t"ccccc{ -expression}ccccccccccc" "ccccccccccccccccccccccccccccccccccccccccccc" # comment +expression}ccccccccccc" t"ccccccccccccccccccccccccccccccccccccccccccc" # comment # Split an overlong target, but join the string if it fits @@ -376,7 +376,7 @@ a[ b ].bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb = ( t"ccccc{ - expression}ccccccccccc" "cccccccccccccccccccccccccccccc" # comment + expression}ccccccccccc" t"cccccccccccccccccccccccccccccc" # comment ) # Split both if necessary and keep multiline @@ -385,66 +385,66 @@ a[ b ].bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb = ( t"ccccc{ - expression}cccccccccccccccccccccccccccccccc" "ccccccccccccccccccccccccccccccc" # comment + expression}cccccccccccccccccccccccccccccccc" t"ccccccccccccccccccccccccccccccc" # comment ) # Don't inline t-strings that contain expressions that are guaranteed to split, e.b. because of a magic trailing comma aaaaaaaaaaaaaaaaaa = t"testeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee{ [a,] -}" "moreeeeeeeeeeeeeeeeeeee" "test" # comment +}" t"moreeeeeeeeeeeeeeeeeeee" t"test" # comment aaaaaaaaaaaaaaaaaa = ( t"testeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee{ [a,] -}" "moreeeeeeeeeeeeeeeeeeee" "test" # comment +}" t"moreeeeeeeeeeeeeeeeeeee" t"test" # comment ) aaaaa[aaaaaaaaaaa] = t"testeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee{ [a,] -}" "moreeeeeeeeeeeeeeeeeeee" "test" # comment +}" t"moreeeeeeeeeeeeeeeeeeee" t"test" # comment aaaaa[aaaaaaaaaaa] = (t"testeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee{ [a,] -}" "moreeeeeeeeeeeeeeeeeeee" "test" # comment +}" t"moreeeeeeeeeeeeeeeeeeee" t"test" # comment ) # Don't inline t-strings that contain commented expressions aaaaaaaaaaaaaaaaaa = ( t"testeeeeeeeeeeeeeeeeeeeeeeeee{[ a # comment - ]}" "moreeeeeeeeeeeeeeeeeetest" # comment + ]}" t"moreeeeeeeeeeeeeeeeeetest" # comment ) aaaaa[aaaaaaaaaaa] = ( t"testeeeeeeeeeeeeeeeeeeeeeeeee{[ a # comment - ]}" "moreeeeeeeeeeeeeeeeeetest" # comment + ]}" t"moreeeeeeeeeeeeeeeeeetest" # comment ) # Don't inline t-strings with multiline debug expressions: aaaaaaaaaaaaaaaaaa = ( t"testeeeeeeeeeeeeeeeeeeeeeeeee{ - a=}" "moreeeeeeeeeeeeeeeeeetest" # comment + a=}" t"moreeeeeeeeeeeeeeeeeetest" # comment ) aaaaaaaaaaaaaaaaaa = ( t"testeeeeeeeeeeeeeeeeeeeeeeeee{a + - b=}" "moreeeeeeeeeeeeeeeeeetest" # comment + b=}" t"moreeeeeeeeeeeeeeeeeetest" # comment ) aaaaaaaaaaaaaaaaaa = ( t"testeeeeeeeeeeeeeeeeeeeeeeeee{a - =}" "moreeeeeeeeeeeeeeeeeetest" # comment + =}" t"moreeeeeeeeeeeeeeeeeetest" # comment ) aaaaa[aaaaaaaaaaa] = ( t"testeeeeeeeeeeeeeeeeeeeeeeeee{ - a=}" "moreeeeeeeeeeeeeeeeeetest" # comment + a=}" t"moreeeeeeeeeeeeeeeeeetest" # comment ) aaaaa[aaaaaaaaaaa] = ( t"testeeeeeeeeeeeeeeeeeeeeeeeee{a - =}" "moreeeeeeeeeeeeeeeeeetest" # comment + =}" t"moreeeeeeeeeeeeeeeeeetest" # comment ) @@ -505,7 +505,7 @@ a = ( ) logger.error( - f"Failed to run task {task} for job" + f"Failed to run task {task} for job" f"with id {str(job.id)}" # type: ignore[union-attr] ) @@ -909,7 +909,7 @@ a[aaaaaaa, b] = t"ccccc{expression}ccccccccccccccccccccccccccccccccccc" # comme # The string gets parenthesized because it, with the inlined comment, exceeds the line length limit. a[aaaaaaa, b] = ( t"ccccc{expression}ccccccccccc" - "ccccccccccccccccccccccccccccccccccccccccccc" + t"ccccccccccccccccccccccccccccccccccccccccccc" ) # comment @@ -925,7 +925,7 @@ a[ aaaaaaa, b ].bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb = ( t"ccccc{expression}cccccccccccccccccccccccccccccccc" - "ccccccccccccccccccccccccccccccc" + t"ccccccccccccccccccccccccccccccc" ) # comment # Don't inline t-strings that contain expressions that are guaranteed to split, e.b. because of a magic trailing comma @@ -935,8 +935,8 @@ aaaaaaaaaaaaaaaaaa = ( a, ] }" - "moreeeeeeeeeeeeeeeeeeee" - "test" + t"moreeeeeeeeeeeeeeeeeeee" + t"test" ) # comment aaaaaaaaaaaaaaaaaa = ( @@ -945,8 +945,8 @@ aaaaaaaaaaaaaaaaaa = ( a, ] }" - "moreeeeeeeeeeeeeeeeeeee" - "test" # comment + t"moreeeeeeeeeeeeeeeeeeee" + t"test" # comment ) aaaaa[aaaaaaaaaaa] = ( @@ -955,8 +955,8 @@ aaaaa[aaaaaaaaaaa] = ( a, ] }" - "moreeeeeeeeeeeeeeeeeeee" - "test" + t"moreeeeeeeeeeeeeeeeeeee" + t"test" ) # comment aaaaa[aaaaaaaaaaa] = ( @@ -965,8 +965,8 @@ aaaaa[aaaaaaaaaaa] = ( a, ] }" - "moreeeeeeeeeeeeeeeeeeee" - "test" # comment + t"moreeeeeeeeeeeeeeeeeeee" + t"test" # comment ) # Don't inline t-strings that contain commented expressions @@ -976,7 +976,7 @@ aaaaaaaaaaaaaaaaaa = ( a # comment ] }" - "moreeeeeeeeeeeeeeeeeetest" # comment + t"moreeeeeeeeeeeeeeeeeetest" # comment ) aaaaa[aaaaaaaaaaa] = ( @@ -985,38 +985,38 @@ aaaaa[aaaaaaaaaaa] = ( a # comment ] }" - "moreeeeeeeeeeeeeeeeeetest" # comment + t"moreeeeeeeeeeeeeeeeeetest" # comment ) # Don't inline t-strings with multiline debug expressions: aaaaaaaaaaaaaaaaaa = ( t"testeeeeeeeeeeeeeeeeeeeeeeeee{ a=}" - "moreeeeeeeeeeeeeeeeeetest" # comment + t"moreeeeeeeeeeeeeeeeeetest" # comment ) aaaaaaaaaaaaaaaaaa = ( t"testeeeeeeeeeeeeeeeeeeeeeeeee{a + b=}" - "moreeeeeeeeeeeeeeeeeetest" # comment + t"moreeeeeeeeeeeeeeeeeetest" # comment ) aaaaaaaaaaaaaaaaaa = ( t"testeeeeeeeeeeeeeeeeeeeeeeeee{a =}" - "moreeeeeeeeeeeeeeeeeetest" # comment + t"moreeeeeeeeeeeeeeeeeetest" # comment ) aaaaa[aaaaaaaaaaa] = ( t"testeeeeeeeeeeeeeeeeeeeeeeeee{ a=}" - "moreeeeeeeeeeeeeeeeeetest" # comment + t"moreeeeeeeeeeeeeeeeeetest" # comment ) aaaaa[aaaaaaaaaaa] = ( t"testeeeeeeeeeeeeeeeeeeeeeeeee{a =}" - "moreeeeeeeeeeeeeeeeeetest" # comment + t"moreeeeeeeeeeeeeeeeeetest" # comment ) diff --git a/crates/ruff_python_formatter/tests/snapshots/format@expression__tstring.py.snap b/crates/ruff_python_formatter/tests/snapshots/format@expression__tstring.py.snap index 3352f2e85f..9e11142b7b 100644 --- a/crates/ruff_python_formatter/tests/snapshots/format@expression__tstring.py.snap +++ b/crates/ruff_python_formatter/tests/snapshots/format@expression__tstring.py.snap @@ -14,21 +14,21 @@ rt"Not-so-tricky \"quote" # Regression test for tstrings dropping comments result_f = ( - 'Traceback (most recent call last):\n' + t'Traceback (most recent call last):\n' t' File "{__file__}", line {lineno_f+5}, in _check_recursive_traceback_display\n' - ' f()\n' + t' f()\n' t' File "{__file__}", line {lineno_f+1}, in f\n' - ' f()\n' + t' f()\n' t' File "{__file__}", line {lineno_f+1}, in f\n' - ' f()\n' + t' f()\n' t' File "{__file__}", line {lineno_f+1}, in f\n' - ' f()\n' + t' f()\n' # XXX: The following line changes depending on whether the tests # are run through the interactive interpreter or with -m # It also varies depending on the platform (stack size) # Fortunately, we don't care about exactness here, so we use regex - r' \[Previous line repeated (\d+) more times\]' '\n' - 'RecursionError: maximum recursion depth exceeded\n' + rt' \[Previous line repeated (\d+) more times\]' t'\n' + t'RecursionError: maximum recursion depth exceeded\n' ) @@ -37,7 +37,7 @@ result_f = ( ( t'{1}' # comment 1 - '' + t'' ) ( @@ -661,7 +661,7 @@ hello { # Implicit concatenated t-string containing quotes _ = ( - 'This string should change its quotes to double quotes' + t'This string should change its quotes to double quotes' t'This string uses double quotes in an expression {"it's a quote"}' t'This t-string does not use any quotes.' ) @@ -761,22 +761,22 @@ rt"Not-so-tricky \"quote" # Regression test for tstrings dropping comments result_f = ( - "Traceback (most recent call last):\n" + t"Traceback (most recent call last):\n" t' File "{__file__}", line {lineno_f + 5}, in _check_recursive_traceback_display\n' - " f()\n" + t" f()\n" t' File "{__file__}", line {lineno_f + 1}, in f\n' - " f()\n" + t" f()\n" t' File "{__file__}", line {lineno_f + 1}, in f\n' - " f()\n" + t" f()\n" t' File "{__file__}", line {lineno_f + 1}, in f\n' - " f()\n" + t" f()\n" # XXX: The following line changes depending on whether the tests # are run through the interactive interpreter or with -m # It also varies depending on the platform (stack size) # Fortunately, we don't care about exactness here, so we use regex - r" \[Previous line repeated (\d+) more times\]" - "\n" - "RecursionError: maximum recursion depth exceeded\n" + rt" \[Previous line repeated (\d+) more times\]" + t"\n" + t"RecursionError: maximum recursion depth exceeded\n" ) @@ -785,7 +785,7 @@ result_f = ( ( t"{1}" # comment 1 - "" + t"" ) ( @@ -1463,7 +1463,7 @@ hello { # Implicit concatenated t-string containing quotes _ = ( - "This string should change its quotes to double quotes" + t"This string should change its quotes to double quotes" t"This string uses double quotes in an expression {"it's a quote"}" t"This t-string does not use any quotes." ) diff --git a/crates/ruff_python_parser/resources/inline/err/template_strings_py313.py b/crates/ruff_python_parser/resources/inline/err/template_strings_py313.py index 2c7fde825a..cd8a338881 100644 --- a/crates/ruff_python_parser/resources/inline/err/template_strings_py313.py +++ b/crates/ruff_python_parser/resources/inline/err/template_strings_py313.py @@ -3,4 +3,3 @@ t"{hey}" t'{there}' t"""what's happening?""" -"implicitly"t"concatenated" diff --git a/crates/ruff_python_parser/resources/inline/ok/template_strings_py314.py b/crates/ruff_python_parser/resources/inline/ok/template_strings_py314.py index 541f49917a..0fe5d66db0 100644 --- a/crates/ruff_python_parser/resources/inline/ok/template_strings_py314.py +++ b/crates/ruff_python_parser/resources/inline/ok/template_strings_py314.py @@ -3,4 +3,3 @@ t"{hey}" t'{there}' t"""what's happening?""" -"implicitly"t"concatenated" diff --git a/crates/ruff_python_parser/resources/valid/expressions/t_string.py b/crates/ruff_python_parser/resources/valid/expressions/t_string.py index 0bb6278492..2fa7adc2cc 100644 --- a/crates/ruff_python_parser/resources/valid/expressions/t_string.py +++ b/crates/ruff_python_parser/resources/valid/expressions/t_string.py @@ -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}"}"}" diff --git a/crates/ruff_python_parser/src/parser/expression.rs b/crates/ruff_python_parser/src/parser/expression.rs index f953cc367c..de9a1bad52 100644 --- a/crates/ruff_python_parser/src/parser/expression.rs +++ b/crates/ruff_python_parser/src/parser/expression.rs @@ -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()), )), diff --git a/crates/ruff_python_parser/src/snapshots/ruff_python_parser__string__tests__parse_empty_tstring.snap b/crates/ruff_python_parser/src/snapshots/ruff_python_parser__string__tests__parse_empty_tstring.snap index 3e32e6364a..8a95e3a166 100644 --- a/crates/ruff_python_parser/src/snapshots/ruff_python_parser__string__tests__parse_empty_tstring.snap +++ b/crates/ruff_python_parser/src/snapshots/ruff_python_parser__string__tests__parse_empty_tstring.snap @@ -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, }, - ), + }, ), }, }, diff --git a/crates/ruff_python_parser/src/snapshots/ruff_python_parser__string__tests__parse_f_t_string_concat_1.snap b/crates/ruff_python_parser/src/snapshots/ruff_python_parser__string__tests__parse_f_t_string_concat_1.snap deleted file mode 100644 index 5e211ea8ca..0000000000 --- a/crates/ruff_python_parser/src/snapshots/ruff_python_parser__string__tests__parse_f_t_string_concat_1.snap +++ /dev/null @@ -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, - }, - }, - ), - ], - ), - }, - }, - ), - }, - ), -] diff --git a/crates/ruff_python_parser/src/snapshots/ruff_python_parser__string__tests__parse_f_t_string_concat_1_error.snap b/crates/ruff_python_parser/src/snapshots/ruff_python_parser__string__tests__parse_f_t_string_concat_1_error.snap new file mode 100644 index 0000000000..819956a427 --- /dev/null +++ b/crates/ruff_python_parser/src/snapshots/ruff_python_parser__string__tests__parse_f_t_string_concat_1_error.snap @@ -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, +} diff --git a/crates/ruff_python_parser/src/snapshots/ruff_python_parser__string__tests__parse_f_t_string_concat_2.snap b/crates/ruff_python_parser/src/snapshots/ruff_python_parser__string__tests__parse_f_t_string_concat_2.snap deleted file mode 100644 index 67c09862be..0000000000 --- a/crates/ruff_python_parser/src/snapshots/ruff_python_parser__string__tests__parse_f_t_string_concat_2.snap +++ /dev/null @@ -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, - }, - }, - ), - ], - ), - }, - }, - ), - }, - ), -] diff --git a/crates/ruff_python_parser/src/snapshots/ruff_python_parser__string__tests__parse_f_t_string_concat_2_error.snap b/crates/ruff_python_parser/src/snapshots/ruff_python_parser__string__tests__parse_f_t_string_concat_2_error.snap new file mode 100644 index 0000000000..3b4b4164ec --- /dev/null +++ b/crates/ruff_python_parser/src/snapshots/ruff_python_parser__string__tests__parse_f_t_string_concat_2_error.snap @@ -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, +} diff --git a/crates/ruff_python_parser/src/snapshots/ruff_python_parser__string__tests__parse_t_string_concat_1.snap b/crates/ruff_python_parser/src/snapshots/ruff_python_parser__string__tests__parse_t_string_concat_1.snap deleted file mode 100644 index e09433deb3..0000000000 --- a/crates/ruff_python_parser/src/snapshots/ruff_python_parser__string__tests__parse_t_string_concat_1.snap +++ /dev/null @@ -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, - }, - }, - ), - ], - ), - }, - }, - ), - }, - ), -] diff --git a/crates/ruff_python_parser/src/snapshots/ruff_python_parser__string__tests__parse_t_string_concat_1_error.snap b/crates/ruff_python_parser/src/snapshots/ruff_python_parser__string__tests__parse_t_string_concat_1_error.snap new file mode 100644 index 0000000000..c9da8b3ca7 --- /dev/null +++ b/crates/ruff_python_parser/src/snapshots/ruff_python_parser__string__tests__parse_t_string_concat_1_error.snap @@ -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, +} diff --git a/crates/ruff_python_parser/src/snapshots/ruff_python_parser__string__tests__parse_t_string_concat_2.snap b/crates/ruff_python_parser/src/snapshots/ruff_python_parser__string__tests__parse_t_string_concat_2.snap deleted file mode 100644 index e09433deb3..0000000000 --- a/crates/ruff_python_parser/src/snapshots/ruff_python_parser__string__tests__parse_t_string_concat_2.snap +++ /dev/null @@ -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, - }, - }, - ), - ], - ), - }, - }, - ), - }, - ), -] diff --git a/crates/ruff_python_parser/src/snapshots/ruff_python_parser__string__tests__parse_t_string_concat_2_error.snap b/crates/ruff_python_parser/src/snapshots/ruff_python_parser__string__tests__parse_t_string_concat_2_error.snap new file mode 100644 index 0000000000..c9da8b3ca7 --- /dev/null +++ b/crates/ruff_python_parser/src/snapshots/ruff_python_parser__string__tests__parse_t_string_concat_2_error.snap @@ -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, +} diff --git a/crates/ruff_python_parser/src/snapshots/ruff_python_parser__string__tests__parse_t_string_concat_3.snap b/crates/ruff_python_parser/src/snapshots/ruff_python_parser__string__tests__parse_t_string_concat_3.snap deleted file mode 100644 index 3497f4897d..0000000000 --- a/crates/ruff_python_parser/src/snapshots/ruff_python_parser__string__tests__parse_t_string_concat_3.snap +++ /dev/null @@ -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, - }, - }, - ), - ], - ), - }, - }, - ), - }, - ), -] diff --git a/crates/ruff_python_parser/src/snapshots/ruff_python_parser__string__tests__parse_t_string_concat_3_error.snap b/crates/ruff_python_parser/src/snapshots/ruff_python_parser__string__tests__parse_t_string_concat_3_error.snap new file mode 100644 index 0000000000..3b4b4164ec --- /dev/null +++ b/crates/ruff_python_parser/src/snapshots/ruff_python_parser__string__tests__parse_t_string_concat_3_error.snap @@ -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, +} diff --git a/crates/ruff_python_parser/src/snapshots/ruff_python_parser__string__tests__parse_t_string_concat_4.snap b/crates/ruff_python_parser/src/snapshots/ruff_python_parser__string__tests__parse_t_string_concat_4.snap deleted file mode 100644 index 9415927781..0000000000 --- a/crates/ruff_python_parser/src/snapshots/ruff_python_parser__string__tests__parse_t_string_concat_4.snap +++ /dev/null @@ -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, - }, - }, - ), - ], - ), - }, - }, - ), - }, - ), -] diff --git a/crates/ruff_python_parser/src/snapshots/ruff_python_parser__string__tests__parse_t_string_concat_4_error.snap b/crates/ruff_python_parser/src/snapshots/ruff_python_parser__string__tests__parse_t_string_concat_4_error.snap new file mode 100644 index 0000000000..9ae7f8f91d --- /dev/null +++ b/crates/ruff_python_parser/src/snapshots/ruff_python_parser__string__tests__parse_t_string_concat_4_error.snap @@ -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, +} diff --git a/crates/ruff_python_parser/src/snapshots/ruff_python_parser__string__tests__parse_tstring.snap b/crates/ruff_python_parser/src/snapshots/ruff_python_parser__string__tests__parse_tstring.snap index 343661c2b0..f7e45b3308 100644 --- a/crates/ruff_python_parser/src/snapshots/ruff_python_parser__string__tests__parse_tstring.snap +++ b/crates/ruff_python_parser/src/snapshots/ruff_python_parser__string__tests__parse_tstring.snap @@ -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, }, - ), + }, ), }, }, diff --git a/crates/ruff_python_parser/src/snapshots/ruff_python_parser__string__tests__parse_tstring_equals.snap b/crates/ruff_python_parser/src/snapshots/ruff_python_parser__string__tests__parse_tstring_equals.snap index 676e05c163..655c257691 100644 --- a/crates/ruff_python_parser/src/snapshots/ruff_python_parser__string__tests__parse_tstring_equals.snap +++ b/crates/ruff_python_parser/src/snapshots/ruff_python_parser__string__tests__parse_tstring_equals.snap @@ -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, }, - ), + }, ), }, }, diff --git a/crates/ruff_python_parser/src/snapshots/ruff_python_parser__string__tests__parse_tstring_nested_concatenation_string_spec.snap b/crates/ruff_python_parser/src/snapshots/ruff_python_parser__string__tests__parse_tstring_nested_concatenation_string_spec.snap index 7154789c31..8b719bdbef 100644 --- a/crates/ruff_python_parser/src/snapshots/ruff_python_parser__string__tests__parse_tstring_nested_concatenation_string_spec.snap +++ b/crates/ruff_python_parser/src/snapshots/ruff_python_parser__string__tests__parse_tstring_nested_concatenation_string_spec.snap @@ -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, }, - ), + }, ), }, }, diff --git a/crates/ruff_python_parser/src/snapshots/ruff_python_parser__string__tests__parse_tstring_nested_spec.snap b/crates/ruff_python_parser/src/snapshots/ruff_python_parser__string__tests__parse_tstring_nested_spec.snap index 68bb64bd87..11102f6346 100644 --- a/crates/ruff_python_parser/src/snapshots/ruff_python_parser__string__tests__parse_tstring_nested_spec.snap +++ b/crates/ruff_python_parser/src/snapshots/ruff_python_parser__string__tests__parse_tstring_nested_spec.snap @@ -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, }, - ), + }, ), }, }, diff --git a/crates/ruff_python_parser/src/snapshots/ruff_python_parser__string__tests__parse_tstring_nested_string_spec.snap b/crates/ruff_python_parser/src/snapshots/ruff_python_parser__string__tests__parse_tstring_nested_string_spec.snap index e860374bd0..789ef89073 100644 --- a/crates/ruff_python_parser/src/snapshots/ruff_python_parser__string__tests__parse_tstring_nested_string_spec.snap +++ b/crates/ruff_python_parser/src/snapshots/ruff_python_parser__string__tests__parse_tstring_nested_string_spec.snap @@ -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, }, - ), + }, ), }, }, diff --git a/crates/ruff_python_parser/src/snapshots/ruff_python_parser__string__tests__parse_tstring_not_equals.snap b/crates/ruff_python_parser/src/snapshots/ruff_python_parser__string__tests__parse_tstring_not_equals.snap index 4747eef4cd..151ac16383 100644 --- a/crates/ruff_python_parser/src/snapshots/ruff_python_parser__string__tests__parse_tstring_not_equals.snap +++ b/crates/ruff_python_parser/src/snapshots/ruff_python_parser__string__tests__parse_tstring_not_equals.snap @@ -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, }, - ), + }, ), }, }, diff --git a/crates/ruff_python_parser/src/snapshots/ruff_python_parser__string__tests__parse_tstring_not_nested_spec.snap b/crates/ruff_python_parser/src/snapshots/ruff_python_parser__string__tests__parse_tstring_not_nested_spec.snap index 360789335e..38fb62b089 100644 --- a/crates/ruff_python_parser/src/snapshots/ruff_python_parser__string__tests__parse_tstring_not_nested_spec.snap +++ b/crates/ruff_python_parser/src/snapshots/ruff_python_parser__string__tests__parse_tstring_not_nested_spec.snap @@ -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, }, - ), + }, ), }, }, diff --git a/crates/ruff_python_parser/src/snapshots/ruff_python_parser__string__tests__parse_tstring_self_doc_prec_space.snap b/crates/ruff_python_parser/src/snapshots/ruff_python_parser__string__tests__parse_tstring_self_doc_prec_space.snap index cd25297e73..b1972bb8c2 100644 --- a/crates/ruff_python_parser/src/snapshots/ruff_python_parser__string__tests__parse_tstring_self_doc_prec_space.snap +++ b/crates/ruff_python_parser/src/snapshots/ruff_python_parser__string__tests__parse_tstring_self_doc_prec_space.snap @@ -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, }, - ), + }, ), }, }, diff --git a/crates/ruff_python_parser/src/snapshots/ruff_python_parser__string__tests__parse_tstring_self_doc_trailing_space.snap b/crates/ruff_python_parser/src/snapshots/ruff_python_parser__string__tests__parse_tstring_self_doc_trailing_space.snap index ab56895948..0abdf4feea 100644 --- a/crates/ruff_python_parser/src/snapshots/ruff_python_parser__string__tests__parse_tstring_self_doc_trailing_space.snap +++ b/crates/ruff_python_parser/src/snapshots/ruff_python_parser__string__tests__parse_tstring_self_doc_trailing_space.snap @@ -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, }, - ), + }, ), }, }, diff --git a/crates/ruff_python_parser/src/snapshots/ruff_python_parser__string__tests__parse_tstring_yield_expr.snap b/crates/ruff_python_parser/src/snapshots/ruff_python_parser__string__tests__parse_tstring_yield_expr.snap index bb265f1a94..2efd41e5a3 100644 --- a/crates/ruff_python_parser/src/snapshots/ruff_python_parser__string__tests__parse_tstring_yield_expr.snap +++ b/crates/ruff_python_parser/src/snapshots/ruff_python_parser__string__tests__parse_tstring_yield_expr.snap @@ -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, }, - ), + }, ), }, }, diff --git a/crates/ruff_python_parser/src/snapshots/ruff_python_parser__string__tests__parse_u_t_string_concat_1.snap b/crates/ruff_python_parser/src/snapshots/ruff_python_parser__string__tests__parse_u_t_string_concat_1.snap deleted file mode 100644 index 0a72333dda..0000000000 --- a/crates/ruff_python_parser/src/snapshots/ruff_python_parser__string__tests__parse_u_t_string_concat_1.snap +++ /dev/null @@ -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, - }, - }, - ), - ], - ), - }, - }, - ), - }, - ), -] diff --git a/crates/ruff_python_parser/src/snapshots/ruff_python_parser__string__tests__parse_u_t_string_concat_1_error.snap b/crates/ruff_python_parser/src/snapshots/ruff_python_parser__string__tests__parse_u_t_string_concat_1_error.snap new file mode 100644 index 0000000000..819956a427 --- /dev/null +++ b/crates/ruff_python_parser/src/snapshots/ruff_python_parser__string__tests__parse_u_t_string_concat_1_error.snap @@ -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, +} diff --git a/crates/ruff_python_parser/src/snapshots/ruff_python_parser__string__tests__parse_u_t_string_concat_2.snap b/crates/ruff_python_parser/src/snapshots/ruff_python_parser__string__tests__parse_u_t_string_concat_2.snap deleted file mode 100644 index ac4d44cd3f..0000000000 --- a/crates/ruff_python_parser/src/snapshots/ruff_python_parser__string__tests__parse_u_t_string_concat_2.snap +++ /dev/null @@ -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, - }, - }, - ), - ], - ), - }, - }, - ), - }, - ), -] diff --git a/crates/ruff_python_parser/src/snapshots/ruff_python_parser__string__tests__parse_u_t_string_concat_2_error.snap b/crates/ruff_python_parser/src/snapshots/ruff_python_parser__string__tests__parse_u_t_string_concat_2_error.snap new file mode 100644 index 0000000000..3b4b4164ec --- /dev/null +++ b/crates/ruff_python_parser/src/snapshots/ruff_python_parser__string__tests__parse_u_t_string_concat_2_error.snap @@ -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, +} diff --git a/crates/ruff_python_parser/src/snapshots/ruff_python_parser__string__tests__raw_tstring.snap b/crates/ruff_python_parser/src/snapshots/ruff_python_parser__string__tests__raw_tstring.snap index 50449bdc14..5200cdade1 100644 --- a/crates/ruff_python_parser/src/snapshots/ruff_python_parser__string__tests__raw_tstring.snap +++ b/crates/ruff_python_parser/src/snapshots/ruff_python_parser__string__tests__raw_tstring.snap @@ -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, }, - ), + }, ), }, }, diff --git a/crates/ruff_python_parser/src/snapshots/ruff_python_parser__string__tests__triple_quoted_raw_tstring.snap b/crates/ruff_python_parser/src/snapshots/ruff_python_parser__string__tests__triple_quoted_raw_tstring.snap index afbf6c6688..71a7e8c067 100644 --- a/crates/ruff_python_parser/src/snapshots/ruff_python_parser__string__tests__triple_quoted_raw_tstring.snap +++ b/crates/ruff_python_parser/src/snapshots/ruff_python_parser__string__tests__triple_quoted_raw_tstring.snap @@ -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, }, - ), + }, ), }, }, diff --git a/crates/ruff_python_parser/src/snapshots/ruff_python_parser__string__tests__tstring_constant_range.snap b/crates/ruff_python_parser/src/snapshots/ruff_python_parser__string__tests__tstring_constant_range.snap index 8e099c0f66..d87b9c51f3 100644 --- a/crates/ruff_python_parser/src/snapshots/ruff_python_parser__string__tests__tstring_constant_range.snap +++ b/crates/ruff_python_parser/src/snapshots/ruff_python_parser__string__tests__tstring_constant_range.snap @@ -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, }, - ), + }, ), }, }, diff --git a/crates/ruff_python_parser/src/snapshots/ruff_python_parser__string__tests__tstring_escaped_character.snap b/crates/ruff_python_parser/src/snapshots/ruff_python_parser__string__tests__tstring_escaped_character.snap index d65d8f0a38..416ad8570a 100644 --- a/crates/ruff_python_parser/src/snapshots/ruff_python_parser__string__tests__tstring_escaped_character.snap +++ b/crates/ruff_python_parser/src/snapshots/ruff_python_parser__string__tests__tstring_escaped_character.snap @@ -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, }, - ), + }, ), }, }, diff --git a/crates/ruff_python_parser/src/snapshots/ruff_python_parser__string__tests__tstring_escaped_newline.snap b/crates/ruff_python_parser/src/snapshots/ruff_python_parser__string__tests__tstring_escaped_newline.snap index 7b3fa58457..85e4ce745b 100644 --- a/crates/ruff_python_parser/src/snapshots/ruff_python_parser__string__tests__tstring_escaped_newline.snap +++ b/crates/ruff_python_parser/src/snapshots/ruff_python_parser__string__tests__tstring_escaped_newline.snap @@ -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, }, - ), + }, ), }, }, diff --git a/crates/ruff_python_parser/src/snapshots/ruff_python_parser__string__tests__tstring_line_continuation.snap b/crates/ruff_python_parser/src/snapshots/ruff_python_parser__string__tests__tstring_line_continuation.snap index d285f2ff88..04ca645b9e 100644 --- a/crates/ruff_python_parser/src/snapshots/ruff_python_parser__string__tests__tstring_line_continuation.snap +++ b/crates/ruff_python_parser/src/snapshots/ruff_python_parser__string__tests__tstring_line_continuation.snap @@ -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, }, - ), + }, ), }, }, diff --git a/crates/ruff_python_parser/src/snapshots/ruff_python_parser__string__tests__tstring_parse_self_documenting_base.snap b/crates/ruff_python_parser/src/snapshots/ruff_python_parser__string__tests__tstring_parse_self_documenting_base.snap index 2540e8745b..147b6c7b10 100644 --- a/crates/ruff_python_parser/src/snapshots/ruff_python_parser__string__tests__tstring_parse_self_documenting_base.snap +++ b/crates/ruff_python_parser/src/snapshots/ruff_python_parser__string__tests__tstring_parse_self_documenting_base.snap @@ -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, }, - ), + }, ), }, }, diff --git a/crates/ruff_python_parser/src/snapshots/ruff_python_parser__string__tests__tstring_parse_self_documenting_base_more.snap b/crates/ruff_python_parser/src/snapshots/ruff_python_parser__string__tests__tstring_parse_self_documenting_base_more.snap index 2bb2303078..8f098418fc 100644 --- a/crates/ruff_python_parser/src/snapshots/ruff_python_parser__string__tests__tstring_parse_self_documenting_base_more.snap +++ b/crates/ruff_python_parser/src/snapshots/ruff_python_parser__string__tests__tstring_parse_self_documenting_base_more.snap @@ -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, }, - ), + }, ), }, }, diff --git a/crates/ruff_python_parser/src/snapshots/ruff_python_parser__string__tests__tstring_parse_self_documenting_format.snap b/crates/ruff_python_parser/src/snapshots/ruff_python_parser__string__tests__tstring_parse_self_documenting_format.snap index 43e424c4bc..c11b0164f6 100644 --- a/crates/ruff_python_parser/src/snapshots/ruff_python_parser__string__tests__tstring_parse_self_documenting_format.snap +++ b/crates/ruff_python_parser/src/snapshots/ruff_python_parser__string__tests__tstring_parse_self_documenting_format.snap @@ -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, }, - ), + }, ), }, }, diff --git a/crates/ruff_python_parser/src/snapshots/ruff_python_parser__string__tests__tstring_unescaped_newline.snap b/crates/ruff_python_parser/src/snapshots/ruff_python_parser__string__tests__tstring_unescaped_newline.snap index 188b88a0d3..728682c92c 100644 --- a/crates/ruff_python_parser/src/snapshots/ruff_python_parser__string__tests__tstring_unescaped_newline.snap +++ b/crates/ruff_python_parser/src/snapshots/ruff_python_parser__string__tests__tstring_unescaped_newline.snap @@ -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, }, - ), + }, ), }, }, diff --git a/crates/ruff_python_parser/src/string.rs b/crates/ruff_python_parser/src/string.rs index a3fe1490de..8a0342ded2 100644 --- a/crates/ruff_python_parser/src/string.rs +++ b/crates/ruff_python_parser/src/string.rs @@ -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); } diff --git a/crates/ruff_python_parser/tests/snapshots/invalid_syntax@f_string_conversion_follows_exclamation.py.snap b/crates/ruff_python_parser/tests/snapshots/invalid_syntax@f_string_conversion_follows_exclamation.py.snap index f3725bcbab..ac3df95658 100644 --- a/crates/ruff_python_parser/tests/snapshots/invalid_syntax@f_string_conversion_follows_exclamation.py.snap +++ b/crates/ruff_python_parser/tests/snapshots/invalid_syntax@f_string_conversion_follows_exclamation.py.snap @@ -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, }, - ), + }, ), }, }, diff --git a/crates/ruff_python_parser/tests/snapshots/invalid_syntax@t_string_empty_expression.py.snap b/crates/ruff_python_parser/tests/snapshots/invalid_syntax@t_string_empty_expression.py.snap index 6b3811f0e1..6fade07f51 100644 --- a/crates/ruff_python_parser/tests/snapshots/invalid_syntax@t_string_empty_expression.py.snap +++ b/crates/ruff_python_parser/tests/snapshots/invalid_syntax@t_string_empty_expression.py.snap @@ -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, }, - ), + }, ), }, }, diff --git a/crates/ruff_python_parser/tests/snapshots/invalid_syntax@t_string_invalid_conversion_flag_name_tok.py.snap b/crates/ruff_python_parser/tests/snapshots/invalid_syntax@t_string_invalid_conversion_flag_name_tok.py.snap index ebf7817858..4666c540d1 100644 --- a/crates/ruff_python_parser/tests/snapshots/invalid_syntax@t_string_invalid_conversion_flag_name_tok.py.snap +++ b/crates/ruff_python_parser/tests/snapshots/invalid_syntax@t_string_invalid_conversion_flag_name_tok.py.snap @@ -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, }, - ), + }, ), }, }, diff --git a/crates/ruff_python_parser/tests/snapshots/invalid_syntax@t_string_invalid_conversion_flag_other_tok.py.snap b/crates/ruff_python_parser/tests/snapshots/invalid_syntax@t_string_invalid_conversion_flag_other_tok.py.snap index f448523735..def26a3f18 100644 --- a/crates/ruff_python_parser/tests/snapshots/invalid_syntax@t_string_invalid_conversion_flag_other_tok.py.snap +++ b/crates/ruff_python_parser/tests/snapshots/invalid_syntax@t_string_invalid_conversion_flag_other_tok.py.snap @@ -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, }, - ), + }, ), }, }, diff --git a/crates/ruff_python_parser/tests/snapshots/invalid_syntax@t_string_invalid_starred_expr.py.snap b/crates/ruff_python_parser/tests/snapshots/invalid_syntax@t_string_invalid_starred_expr.py.snap index b2a595bf80..ea5934128b 100644 --- a/crates/ruff_python_parser/tests/snapshots/invalid_syntax@t_string_invalid_starred_expr.py.snap +++ b/crates/ruff_python_parser/tests/snapshots/invalid_syntax@t_string_invalid_starred_expr.py.snap @@ -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, }, - ), + }, ), }, }, diff --git a/crates/ruff_python_parser/tests/snapshots/invalid_syntax@t_string_lambda_without_parentheses.py.snap b/crates/ruff_python_parser/tests/snapshots/invalid_syntax@t_string_lambda_without_parentheses.py.snap index d87a72858f..ceeb8540da 100644 --- a/crates/ruff_python_parser/tests/snapshots/invalid_syntax@t_string_lambda_without_parentheses.py.snap +++ b/crates/ruff_python_parser/tests/snapshots/invalid_syntax@t_string_lambda_without_parentheses.py.snap @@ -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, }, - ), + }, ), }, }, diff --git a/crates/ruff_python_parser/tests/snapshots/invalid_syntax@t_string_unclosed_lbrace.py.snap b/crates/ruff_python_parser/tests/snapshots/invalid_syntax@t_string_unclosed_lbrace.py.snap index 5c1f43a2b7..3078488a98 100644 --- a/crates/ruff_python_parser/tests/snapshots/invalid_syntax@t_string_unclosed_lbrace.py.snap +++ b/crates/ruff_python_parser/tests/snapshots/invalid_syntax@t_string_unclosed_lbrace.py.snap @@ -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, }, - ), + }, ], ), }, diff --git a/crates/ruff_python_parser/tests/snapshots/invalid_syntax@t_string_unclosed_lbrace_in_format_spec.py.snap b/crates/ruff_python_parser/tests/snapshots/invalid_syntax@t_string_unclosed_lbrace_in_format_spec.py.snap index 117976d898..0a7f827af2 100644 --- a/crates/ruff_python_parser/tests/snapshots/invalid_syntax@t_string_unclosed_lbrace_in_format_spec.py.snap +++ b/crates/ruff_python_parser/tests/snapshots/invalid_syntax@t_string_unclosed_lbrace_in_format_spec.py.snap @@ -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, }, - ), + }, ), }, }, diff --git a/crates/ruff_python_parser/tests/snapshots/invalid_syntax@template_strings_py313.py.snap b/crates/ruff_python_parser/tests/snapshots/invalid_syntax@template_strings_py313.py.snap index 87586ee1bc..8767d279bf 100644 --- a/crates/ruff_python_parser/tests/snapshots/invalid_syntax@template_strings_py313.py.snap +++ b/crates/ruff_python_parser/tests/snapshots/invalid_syntax@template_strings_py313.py.snap @@ -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) | diff --git a/crates/ruff_python_parser/tests/snapshots/valid_syntax@expressions__t_string.py.snap b/crates/ruff_python_parser/tests/snapshots/valid_syntax@expressions__t_string.py.snap index b9d44898d1..c2ee44b3be 100644 --- a/crates/ruff_python_parser/tests/snapshots/valid_syntax@expressions__t_string.py.snap +++ b/crates/ruff_python_parser/tests/snapshots/valid_syntax@expressions__t_string.py.snap @@ -8,7 +8,7 @@ input_file: crates/ruff_python_parser/resources/valid/expressions/t_string.py Module( ModModule { node_index: AtomicNodeIndex(..), - range: 0..1143, + range: 0..864, body: [ Expr( StmtExpr { @@ -20,18 +20,16 @@ Module( range: 18..21, value: TStringValue { inner: Single( - TString( - TString { - range: 18..21, - node_index: AtomicNodeIndex(..), - elements: [], - flags: TStringFlags { - quote_style: Double, - prefix: Regular, - triple_quoted: false, - }, + TString { + range: 18..21, + node_index: AtomicNodeIndex(..), + elements: [], + flags: TStringFlags { + quote_style: Double, + prefix: Regular, + triple_quoted: false, }, - ), + }, ), }, }, @@ -48,18 +46,16 @@ Module( range: 22..25, value: TStringValue { inner: Single( - TString( - TString { - range: 22..25, - node_index: AtomicNodeIndex(..), - elements: [], - flags: TStringFlags { - quote_style: Double, - prefix: Regular, - triple_quoted: false, - }, + TString { + range: 22..25, + node_index: AtomicNodeIndex(..), + elements: [], + flags: TStringFlags { + quote_style: Double, + prefix: Regular, + triple_quoted: false, }, - ), + }, ), }, }, @@ -76,18 +72,16 @@ Module( range: 26..29, value: TStringValue { inner: Single( - TString( - TString { - range: 26..29, - node_index: AtomicNodeIndex(..), - elements: [], - flags: TStringFlags { - quote_style: Single, - prefix: Regular, - triple_quoted: false, - }, + TString { + range: 26..29, + node_index: AtomicNodeIndex(..), + elements: [], + flags: TStringFlags { + quote_style: Single, + prefix: Regular, + triple_quoted: false, }, - ), + }, ), }, }, @@ -104,18 +98,16 @@ Module( range: 30..37, value: TStringValue { inner: Single( - TString( - TString { - range: 30..37, - node_index: AtomicNodeIndex(..), - elements: [], - flags: TStringFlags { - quote_style: Double, - prefix: Regular, - triple_quoted: true, - }, + TString { + range: 30..37, + node_index: AtomicNodeIndex(..), + elements: [], + flags: TStringFlags { + quote_style: Double, + prefix: Regular, + triple_quoted: true, }, - ), + }, ), }, }, @@ -132,18 +124,16 @@ Module( range: 38..45, value: TStringValue { inner: Single( - TString( - TString { - range: 38..45, - node_index: AtomicNodeIndex(..), - elements: [], - flags: TStringFlags { - quote_style: Single, - prefix: Regular, - triple_quoted: true, - }, + TString { + range: 38..45, + node_index: AtomicNodeIndex(..), + elements: [], + flags: TStringFlags { + quote_style: Single, + prefix: Regular, + triple_quoted: true, }, - ), + }, ), }, }, @@ -160,48 +150,46 @@ Module( range: 47..56, value: TStringValue { inner: Single( - TString( - TString { - range: 47..56, - node_index: AtomicNodeIndex(..), - elements: [ - Interpolation( - InterpolatedElement { - range: 49..55, - node_index: AtomicNodeIndex(..), - expression: StringLiteral( - ExprStringLiteral { - node_index: AtomicNodeIndex(..), - range: 50..54, - value: StringLiteralValue { - inner: Single( - StringLiteral { - range: 50..54, - node_index: AtomicNodeIndex(..), - value: " t", - flags: StringLiteralFlags { - quote_style: Double, - prefix: Empty, - triple_quoted: false, - }, + TString { + range: 47..56, + node_index: AtomicNodeIndex(..), + elements: [ + Interpolation( + InterpolatedElement { + range: 49..55, + node_index: AtomicNodeIndex(..), + expression: StringLiteral( + ExprStringLiteral { + node_index: AtomicNodeIndex(..), + range: 50..54, + value: StringLiteralValue { + inner: Single( + StringLiteral { + range: 50..54, + node_index: AtomicNodeIndex(..), + value: " t", + flags: StringLiteralFlags { + quote_style: Double, + 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, }, - ), + }, ), }, }, @@ -218,36 +206,34 @@ Module( range: 57..67, value: TStringValue { inner: Single( - TString( - TString { - range: 57..67, - node_index: AtomicNodeIndex(..), - elements: [ - Interpolation( - InterpolatedElement { - range: 59..66, - node_index: AtomicNodeIndex(..), - expression: Name( - ExprName { - node_index: AtomicNodeIndex(..), - range: 60..63, - id: Name("foo"), - ctx: Load, - }, - ), - debug_text: None, - conversion: Str, - format_spec: None, - }, - ), - ], - flags: TStringFlags { - quote_style: Double, - prefix: Regular, - triple_quoted: false, - }, + TString { + range: 57..67, + node_index: AtomicNodeIndex(..), + elements: [ + Interpolation( + InterpolatedElement { + range: 59..66, + node_index: AtomicNodeIndex(..), + expression: Name( + ExprName { + node_index: AtomicNodeIndex(..), + range: 60..63, + id: Name("foo"), + ctx: Load, + }, + ), + debug_text: None, + conversion: Str, + format_spec: None, + }, + ), + ], + flags: TStringFlags { + quote_style: Double, + prefix: Regular, + triple_quoted: false, }, - ), + }, ), }, }, @@ -264,47 +250,45 @@ Module( range: 68..75, value: TStringValue { inner: Single( - TString( - TString { - range: 68..75, - node_index: AtomicNodeIndex(..), - elements: [ - Interpolation( - InterpolatedElement { - range: 70..74, - node_index: AtomicNodeIndex(..), - expression: Tuple( - ExprTuple { - node_index: AtomicNodeIndex(..), - range: 71..73, - elts: [ - NumberLiteral( - ExprNumberLiteral { - node_index: AtomicNodeIndex(..), - range: 71..72, - value: Int( - 3, - ), - }, - ), - ], - ctx: Load, - parenthesized: false, - }, - ), - debug_text: None, - conversion: None, - format_spec: None, - }, - ), - ], - flags: TStringFlags { - quote_style: Double, - prefix: Regular, - triple_quoted: false, - }, + TString { + range: 68..75, + node_index: AtomicNodeIndex(..), + elements: [ + Interpolation( + InterpolatedElement { + range: 70..74, + node_index: AtomicNodeIndex(..), + expression: Tuple( + ExprTuple { + node_index: AtomicNodeIndex(..), + range: 71..73, + elts: [ + NumberLiteral( + ExprNumberLiteral { + node_index: AtomicNodeIndex(..), + range: 71..72, + value: Int( + 3, + ), + }, + ), + ], + ctx: Load, + parenthesized: false, + }, + ), + debug_text: None, + conversion: None, + format_spec: None, + }, + ), + ], + flags: TStringFlags { + quote_style: Double, + prefix: Regular, + triple_quoted: false, }, - ), + }, ), }, }, @@ -321,63 +305,61 @@ Module( range: 76..86, value: TStringValue { inner: Single( - TString( - TString { - range: 76..86, - node_index: AtomicNodeIndex(..), - elements: [ - Interpolation( - InterpolatedElement { - range: 78..85, - node_index: AtomicNodeIndex(..), - expression: Compare( - ExprCompare { - node_index: AtomicNodeIndex(..), - range: 79..83, - left: NumberLiteral( + TString { + range: 76..86, + node_index: AtomicNodeIndex(..), + elements: [ + Interpolation( + InterpolatedElement { + range: 78..85, + node_index: AtomicNodeIndex(..), + expression: Compare( + ExprCompare { + node_index: AtomicNodeIndex(..), + range: 79..83, + left: NumberLiteral( + ExprNumberLiteral { + node_index: AtomicNodeIndex(..), + range: 79..80, + value: Int( + 3, + ), + }, + ), + ops: [ + NotEq, + ], + comparators: [ + NumberLiteral( ExprNumberLiteral { node_index: AtomicNodeIndex(..), - range: 79..80, + range: 82..83, value: Int( - 3, + 4, ), }, ), - ops: [ - NotEq, - ], - comparators: [ - NumberLiteral( - ExprNumberLiteral { - node_index: AtomicNodeIndex(..), - range: 82..83, - value: Int( - 4, - ), - }, - ), - ], - }, - ), - debug_text: None, - conversion: None, - format_spec: Some( - InterpolatedStringFormatSpec { - range: 84..84, - node_index: AtomicNodeIndex(..), - elements: [], - }, - ), - }, - ), - ], - flags: TStringFlags { - quote_style: Double, - prefix: Regular, - triple_quoted: false, - }, + ], + }, + ), + debug_text: None, + conversion: None, + format_spec: Some( + InterpolatedStringFormatSpec { + range: 84..84, + node_index: AtomicNodeIndex(..), + elements: [], + }, + ), + }, + ), + ], + flags: TStringFlags { + quote_style: Double, + prefix: Regular, + triple_quoted: false, }, - ), + }, ), }, }, @@ -394,80 +376,78 @@ Module( range: 87..102, value: TStringValue { inner: Single( - TString( - TString { - range: 87..102, - node_index: AtomicNodeIndex(..), - elements: [ - Interpolation( - InterpolatedElement { - range: 89..101, - node_index: AtomicNodeIndex(..), - expression: NumberLiteral( - ExprNumberLiteral { - node_index: AtomicNodeIndex(..), - range: 90..91, - value: Int( - 3, - ), - }, - ), - debug_text: None, - conversion: None, - format_spec: Some( - InterpolatedStringFormatSpec { - range: 92..100, - node_index: AtomicNodeIndex(..), - elements: [ - Interpolation( - InterpolatedElement { - range: 92..97, - node_index: AtomicNodeIndex(..), - expression: StringLiteral( - ExprStringLiteral { - node_index: AtomicNodeIndex(..), - range: 93..96, - value: StringLiteralValue { - inner: Single( - StringLiteral { - range: 93..96, - node_index: AtomicNodeIndex(..), - value: "}", - flags: StringLiteralFlags { - quote_style: Double, - prefix: Empty, - triple_quoted: false, - }, + TString { + range: 87..102, + node_index: AtomicNodeIndex(..), + elements: [ + Interpolation( + InterpolatedElement { + range: 89..101, + node_index: AtomicNodeIndex(..), + expression: NumberLiteral( + ExprNumberLiteral { + node_index: AtomicNodeIndex(..), + range: 90..91, + value: Int( + 3, + ), + }, + ), + debug_text: None, + conversion: None, + format_spec: Some( + InterpolatedStringFormatSpec { + range: 92..100, + node_index: AtomicNodeIndex(..), + elements: [ + Interpolation( + InterpolatedElement { + range: 92..97, + node_index: AtomicNodeIndex(..), + expression: StringLiteral( + ExprStringLiteral { + node_index: AtomicNodeIndex(..), + range: 93..96, + value: StringLiteralValue { + inner: Single( + StringLiteral { + range: 93..96, + node_index: AtomicNodeIndex(..), + value: "}", + flags: StringLiteralFlags { + quote_style: Double, + prefix: Empty, + triple_quoted: false, }, - ), - }, + }, + ), }, - ), - debug_text: None, - conversion: None, - format_spec: None, - }, - ), - Literal( - InterpolatedStringLiteralElement { - range: 97..100, - node_index: AtomicNodeIndex(..), - value: ">10", - }, - ), - ], - }, - ), - }, - ), - ], - flags: TStringFlags { - quote_style: Single, - prefix: Regular, - triple_quoted: false, - }, + }, + ), + debug_text: None, + conversion: None, + format_spec: None, + }, + ), + Literal( + InterpolatedStringLiteralElement { + range: 97..100, + node_index: AtomicNodeIndex(..), + value: ">10", + }, + ), + ], + }, + ), + }, + ), + ], + flags: TStringFlags { + quote_style: Single, + prefix: Regular, + triple_quoted: false, }, - ), + }, ), }, }, @@ -484,80 +464,78 @@ Module( range: 103..118, value: TStringValue { inner: Single( - TString( - TString { - range: 103..118, - node_index: AtomicNodeIndex(..), - elements: [ - Interpolation( - InterpolatedElement { - range: 105..117, - node_index: AtomicNodeIndex(..), - expression: NumberLiteral( - ExprNumberLiteral { - node_index: AtomicNodeIndex(..), - range: 106..107, - value: Int( - 3, - ), - }, - ), - debug_text: None, - conversion: None, - format_spec: Some( - InterpolatedStringFormatSpec { - range: 108..116, - node_index: AtomicNodeIndex(..), - elements: [ - Interpolation( - InterpolatedElement { - range: 108..113, - node_index: AtomicNodeIndex(..), - expression: StringLiteral( - ExprStringLiteral { - node_index: AtomicNodeIndex(..), - range: 109..112, - value: StringLiteralValue { - inner: Single( - StringLiteral { - range: 109..112, - node_index: AtomicNodeIndex(..), - value: "{", - flags: StringLiteralFlags { - quote_style: Double, - prefix: Empty, - triple_quoted: false, - }, + TString { + range: 103..118, + node_index: AtomicNodeIndex(..), + elements: [ + Interpolation( + InterpolatedElement { + range: 105..117, + node_index: AtomicNodeIndex(..), + expression: NumberLiteral( + ExprNumberLiteral { + node_index: AtomicNodeIndex(..), + range: 106..107, + value: Int( + 3, + ), + }, + ), + debug_text: None, + conversion: None, + format_spec: Some( + InterpolatedStringFormatSpec { + range: 108..116, + node_index: AtomicNodeIndex(..), + elements: [ + Interpolation( + InterpolatedElement { + range: 108..113, + node_index: AtomicNodeIndex(..), + expression: StringLiteral( + ExprStringLiteral { + node_index: AtomicNodeIndex(..), + range: 109..112, + value: StringLiteralValue { + inner: Single( + StringLiteral { + range: 109..112, + node_index: AtomicNodeIndex(..), + value: "{", + flags: StringLiteralFlags { + quote_style: Double, + prefix: Empty, + triple_quoted: false, }, - ), - }, + }, + ), }, - ), - debug_text: None, - conversion: None, - format_spec: None, - }, - ), - Literal( - InterpolatedStringLiteralElement { - range: 113..116, - node_index: AtomicNodeIndex(..), - value: ">10", - }, - ), - ], - }, - ), - }, - ), - ], - flags: TStringFlags { - quote_style: Single, - prefix: Regular, - triple_quoted: false, - }, + }, + ), + debug_text: None, + conversion: None, + format_spec: None, + }, + ), + Literal( + InterpolatedStringLiteralElement { + range: 113..116, + node_index: AtomicNodeIndex(..), + value: ">10", + }, + ), + ], + }, + ), + }, + ), + ], + flags: TStringFlags { + quote_style: Single, + prefix: Regular, + triple_quoted: false, }, - ), + }, ), }, }, @@ -574,41 +552,39 @@ Module( range: 119..133, value: TStringValue { inner: Single( - TString( - TString { - range: 119..133, - node_index: AtomicNodeIndex(..), - elements: [ - Interpolation( - InterpolatedElement { - range: 121..132, - node_index: AtomicNodeIndex(..), - expression: Name( - ExprName { - node_index: AtomicNodeIndex(..), - range: 124..127, - 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: 119..133, + node_index: AtomicNodeIndex(..), + elements: [ + Interpolation( + InterpolatedElement { + range: 121..132, + node_index: AtomicNodeIndex(..), + expression: Name( + ExprName { + node_index: AtomicNodeIndex(..), + range: 124..127, + 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, }, - ), + }, ), }, }, @@ -625,55 +601,53 @@ Module( range: 134..154, value: TStringValue { inner: Single( - TString( - TString { - range: 134..154, - node_index: AtomicNodeIndex(..), - elements: [ - Interpolation( - InterpolatedElement { - range: 136..153, - node_index: AtomicNodeIndex(..), - expression: Name( - ExprName { - node_index: AtomicNodeIndex(..), - range: 139..142, - id: Name("foo"), - ctx: Load, - }, - ), - debug_text: Some( - DebugText { - leading: " ", - trailing: " = ", - }, - ), - conversion: None, - format_spec: Some( - InterpolatedStringFormatSpec { - range: 147..152, - node_index: AtomicNodeIndex(..), - elements: [ - Literal( - InterpolatedStringLiteralElement { - range: 147..152, - node_index: AtomicNodeIndex(..), - value: ".3f ", - }, - ), - ], - }, - ), - }, - ), - ], - flags: TStringFlags { - quote_style: Double, - prefix: Regular, - triple_quoted: false, - }, + TString { + range: 134..154, + node_index: AtomicNodeIndex(..), + elements: [ + Interpolation( + InterpolatedElement { + range: 136..153, + node_index: AtomicNodeIndex(..), + expression: Name( + ExprName { + node_index: AtomicNodeIndex(..), + range: 139..142, + id: Name("foo"), + ctx: Load, + }, + ), + debug_text: Some( + DebugText { + leading: " ", + trailing: " = ", + }, + ), + conversion: None, + format_spec: Some( + InterpolatedStringFormatSpec { + range: 147..152, + node_index: AtomicNodeIndex(..), + elements: [ + Literal( + InterpolatedStringLiteralElement { + range: 147..152, + node_index: AtomicNodeIndex(..), + value: ".3f ", + }, + ), + ], + }, + ), + }, + ), + ], + flags: TStringFlags { + quote_style: Double, + prefix: Regular, + triple_quoted: false, }, - ), + }, ), }, }, @@ -690,41 +664,39 @@ Module( range: 155..173, value: TStringValue { inner: Single( - TString( - TString { - range: 155..173, - node_index: AtomicNodeIndex(..), - elements: [ - Interpolation( - InterpolatedElement { - range: 157..172, - node_index: AtomicNodeIndex(..), - expression: Name( - ExprName { - node_index: AtomicNodeIndex(..), - range: 160..163, - id: Name("foo"), - ctx: Load, - }, - ), - debug_text: Some( - DebugText { - leading: " ", - trailing: " = ", - }, - ), - conversion: Str, - format_spec: None, - }, - ), - ], - flags: TStringFlags { - quote_style: Double, - prefix: Regular, - triple_quoted: false, - }, + TString { + range: 155..173, + node_index: AtomicNodeIndex(..), + elements: [ + Interpolation( + InterpolatedElement { + range: 157..172, + node_index: AtomicNodeIndex(..), + expression: Name( + ExprName { + node_index: AtomicNodeIndex(..), + range: 160..163, + id: Name("foo"), + ctx: Load, + }, + ), + debug_text: Some( + DebugText { + leading: " ", + trailing: " = ", + }, + ), + conversion: Str, + format_spec: None, + }, + ), + ], + flags: TStringFlags { + quote_style: Double, + prefix: Regular, + triple_quoted: false, }, - ), + }, ), }, }, @@ -741,61 +713,59 @@ Module( range: 174..190, value: TStringValue { inner: Single( - TString( - TString { - range: 174..190, - node_index: AtomicNodeIndex(..), - elements: [ - Interpolation( - InterpolatedElement { - range: 176..189, - node_index: AtomicNodeIndex(..), - expression: Tuple( - ExprTuple { - node_index: AtomicNodeIndex(..), - range: 179..183, - elts: [ - NumberLiteral( - ExprNumberLiteral { - node_index: AtomicNodeIndex(..), - range: 179..180, - value: Int( - 1, - ), - }, - ), - NumberLiteral( - ExprNumberLiteral { - node_index: AtomicNodeIndex(..), - range: 182..183, - value: Int( - 2, - ), - }, - ), - ], - ctx: Load, - parenthesized: false, - }, - ), - debug_text: Some( - DebugText { - leading: " ", - trailing: " = ", - }, - ), - conversion: None, - format_spec: None, - }, - ), - ], - flags: TStringFlags { - quote_style: Double, - prefix: Regular, - triple_quoted: false, - }, + TString { + range: 174..190, + node_index: AtomicNodeIndex(..), + elements: [ + Interpolation( + InterpolatedElement { + range: 176..189, + node_index: AtomicNodeIndex(..), + expression: Tuple( + ExprTuple { + node_index: AtomicNodeIndex(..), + range: 179..183, + elts: [ + NumberLiteral( + ExprNumberLiteral { + node_index: AtomicNodeIndex(..), + range: 179..180, + value: Int( + 1, + ), + }, + ), + NumberLiteral( + ExprNumberLiteral { + node_index: AtomicNodeIndex(..), + range: 182..183, + value: Int( + 2, + ), + }, + ), + ], + ctx: Load, + parenthesized: false, + }, + ), + debug_text: Some( + DebugText { + leading: " ", + trailing: " = ", + }, + ), + conversion: None, + format_spec: None, + }, + ), + ], + flags: TStringFlags { + quote_style: Double, + prefix: Regular, + triple_quoted: false, }, - ), + }, ), }, }, @@ -812,102 +782,98 @@ Module( range: 191..217, value: TStringValue { inner: Single( - TString( - TString { - range: 191..217, - node_index: AtomicNodeIndex(..), - elements: [ - Interpolation( - InterpolatedElement { - range: 193..216, - node_index: AtomicNodeIndex(..), - expression: TString( - ExprTString { - node_index: AtomicNodeIndex(..), - range: 194..210, - value: TStringValue { - inner: Single( - TString( - TString { - range: 194..210, - node_index: AtomicNodeIndex(..), - elements: [ - Interpolation( - InterpolatedElement { - range: 196..209, + TString { + range: 191..217, + node_index: AtomicNodeIndex(..), + elements: [ + Interpolation( + InterpolatedElement { + range: 193..216, + node_index: AtomicNodeIndex(..), + expression: TString( + ExprTString { + node_index: AtomicNodeIndex(..), + range: 194..210, + value: TStringValue { + inner: Single( + TString { + range: 194..210, + node_index: AtomicNodeIndex(..), + elements: [ + Interpolation( + InterpolatedElement { + range: 196..209, + node_index: AtomicNodeIndex(..), + expression: NumberLiteral( + ExprNumberLiteral { node_index: AtomicNodeIndex(..), - expression: NumberLiteral( - ExprNumberLiteral { - node_index: AtomicNodeIndex(..), - range: 197..203, - value: Float( - 3.1415, - ), - }, - ), - debug_text: Some( - DebugText { - leading: "", - trailing: "=", - }, - ), - conversion: None, - format_spec: Some( - InterpolatedStringFormatSpec { - range: 205..208, - node_index: AtomicNodeIndex(..), - elements: [ - Literal( - InterpolatedStringLiteralElement { - range: 205..208, - node_index: AtomicNodeIndex(..), - value: ".1f", - }, - ), - ], - }, + range: 197..203, + value: Float( + 3.1415, ), }, ), - ], - flags: TStringFlags { - quote_style: Double, - prefix: Regular, - triple_quoted: false, + debug_text: Some( + DebugText { + leading: "", + trailing: "=", + }, + ), + conversion: None, + format_spec: Some( + InterpolatedStringFormatSpec { + range: 205..208, + node_index: AtomicNodeIndex(..), + elements: [ + Literal( + InterpolatedStringLiteralElement { + range: 205..208, + node_index: AtomicNodeIndex(..), + value: ".1f", + }, + ), + ], + }, + ), }, - }, - ), - ), - }, - }, - ), - debug_text: None, - conversion: None, - format_spec: Some( - InterpolatedStringFormatSpec { - range: 211..215, - node_index: AtomicNodeIndex(..), - elements: [ - Literal( - InterpolatedStringLiteralElement { - range: 211..215, - node_index: AtomicNodeIndex(..), - value: "*^20", + ), + ], + flags: TStringFlags { + quote_style: Double, + prefix: Regular, + triple_quoted: false, }, - ), - ], + }, + ), }, - ), - }, - ), - ], - flags: TStringFlags { - quote_style: Single, - prefix: Regular, - triple_quoted: false, - }, + }, + ), + debug_text: None, + conversion: None, + format_spec: Some( + InterpolatedStringFormatSpec { + range: 211..215, + node_index: AtomicNodeIndex(..), + elements: [ + Literal( + InterpolatedStringLiteralElement { + range: 211..215, + node_index: AtomicNodeIndex(..), + value: "*^20", + }, + ), + ], + }, + ), + }, + ), + ], + flags: TStringFlags { + quote_style: Single, + prefix: Regular, + triple_quoted: false, }, - ), + }, ), }, }, @@ -917,104 +883,114 @@ Module( Expr( StmtExpr { node_index: AtomicNodeIndex(..), - range: 219..253, + range: 219..255, value: Dict( ExprDict { node_index: AtomicNodeIndex(..), - range: 219..253, + range: 219..255, items: [ DictItem { key: Some( TString( ExprTString { node_index: AtomicNodeIndex(..), - range: 220..248, + range: 220..250, value: TStringValue { inner: Concatenated( [ - Literal( - StringLiteral { - range: 220..226, - node_index: AtomicNodeIndex(..), - value: "foo ", - flags: StringLiteralFlags { - quote_style: Double, - prefix: Empty, - triple_quoted: false, - }, + TString { + range: 220..227, + node_index: AtomicNodeIndex(..), + elements: [ + Literal( + InterpolatedStringLiteralElement { + range: 222..226, + node_index: AtomicNodeIndex(..), + value: "foo ", + }, + ), + ], + flags: TStringFlags { + quote_style: Double, + prefix: Regular, + triple_quoted: false, }, - ), - TString( - TString { - range: 227..242, - node_index: AtomicNodeIndex(..), - elements: [ - Literal( - InterpolatedStringLiteralElement { - range: 229..233, - node_index: AtomicNodeIndex(..), - value: "bar ", - }, - ), - Interpolation( - InterpolatedElement { - range: 233..240, - node_index: AtomicNodeIndex(..), - expression: BinOp( - ExprBinOp { - node_index: AtomicNodeIndex(..), - range: 234..239, - left: Name( - ExprName { - node_index: AtomicNodeIndex(..), - range: 234..235, - id: Name("x"), - ctx: Load, - }, - ), - op: Add, - right: Name( - ExprName { - node_index: AtomicNodeIndex(..), - range: 238..239, - id: Name("y"), - ctx: Load, - }, - ), - }, - ), - debug_text: None, - conversion: None, - format_spec: None, - }, - ), - Literal( - InterpolatedStringLiteralElement { - range: 240..241, - node_index: AtomicNodeIndex(..), - value: " ", - }, - ), - ], - flags: TStringFlags { - quote_style: Double, - prefix: Regular, - triple_quoted: false, - }, + }, + TString { + range: 228..243, + node_index: AtomicNodeIndex(..), + elements: [ + Literal( + InterpolatedStringLiteralElement { + range: 230..234, + node_index: AtomicNodeIndex(..), + value: "bar ", + }, + ), + Interpolation( + InterpolatedElement { + range: 234..241, + node_index: AtomicNodeIndex(..), + expression: BinOp( + ExprBinOp { + node_index: AtomicNodeIndex(..), + range: 235..240, + left: Name( + ExprName { + node_index: AtomicNodeIndex(..), + range: 235..236, + id: Name("x"), + ctx: Load, + }, + ), + op: Add, + right: Name( + ExprName { + node_index: AtomicNodeIndex(..), + range: 239..240, + id: Name("y"), + ctx: Load, + }, + ), + }, + ), + debug_text: None, + conversion: None, + format_spec: None, + }, + ), + Literal( + InterpolatedStringLiteralElement { + range: 241..242, + node_index: AtomicNodeIndex(..), + value: " ", + }, + ), + ], + flags: TStringFlags { + quote_style: Double, + prefix: Regular, + triple_quoted: false, }, - ), - Literal( - StringLiteral { - range: 243..248, - node_index: AtomicNodeIndex(..), - value: "baz", - flags: StringLiteralFlags { - quote_style: Double, - prefix: Empty, - triple_quoted: false, - }, + }, + TString { + range: 244..250, + node_index: AtomicNodeIndex(..), + elements: [ + Literal( + InterpolatedStringLiteralElement { + range: 246..249, + node_index: AtomicNodeIndex(..), + value: "baz", + }, + ), + ], + flags: TStringFlags { + quote_style: Double, + prefix: Regular, + triple_quoted: false, }, - ), + }, ], ), }, @@ -1024,7 +1000,7 @@ Module( value: NumberLiteral( ExprNumberLiteral { node_index: AtomicNodeIndex(..), - range: 250..252, + range: 252..254, value: Int( 10, ), @@ -1039,31 +1015,31 @@ Module( Match( StmtMatch { node_index: AtomicNodeIndex(..), - range: 254..345, + range: 256..347, subject: Name( ExprName { node_index: AtomicNodeIndex(..), - range: 260..263, + range: 262..265, id: Name("foo"), ctx: Load, }, ), cases: [ MatchCase { - range: 269..293, + range: 271..295, node_index: AtomicNodeIndex(..), pattern: MatchValue( PatternMatchValue { - range: 274..279, + range: 276..281, node_index: AtomicNodeIndex(..), value: StringLiteral( ExprStringLiteral { node_index: AtomicNodeIndex(..), - range: 274..279, + range: 276..281, value: StringLiteralValue { inner: Single( StringLiteral { - range: 274..279, + range: 276..281, node_index: AtomicNodeIndex(..), value: "one", flags: StringLiteralFlags { @@ -1083,28 +1059,28 @@ Module( Pass( StmtPass { node_index: AtomicNodeIndex(..), - range: 289..293, + range: 291..295, }, ), ], }, MatchCase { - range: 298..345, + range: 300..347, node_index: AtomicNodeIndex(..), pattern: MatchValue( PatternMatchValue { - range: 303..331, + range: 305..333, node_index: AtomicNodeIndex(..), value: StringLiteral( ExprStringLiteral { node_index: AtomicNodeIndex(..), - range: 303..331, + range: 305..333, value: StringLiteralValue { inner: Concatenated( ConcatenatedStringLiteral { strings: [ StringLiteral { - range: 303..316, + range: 305..318, node_index: AtomicNodeIndex(..), value: "implicitly ", flags: StringLiteralFlags { @@ -1114,7 +1090,7 @@ Module( }, }, StringLiteral { - range: 317..331, + range: 319..333, node_index: AtomicNodeIndex(..), value: "concatenated", flags: StringLiteralFlags { @@ -1137,7 +1113,7 @@ Module( Pass( StmtPass { node_index: AtomicNodeIndex(..), - range: 341..345, + range: 343..347, }, ), ], @@ -1148,727 +1124,86 @@ Module( Expr( StmtExpr { node_index: AtomicNodeIndex(..), - range: 347..364, + range: 349..366, value: TString( ExprTString { node_index: AtomicNodeIndex(..), - range: 347..364, + range: 349..366, value: TStringValue { inner: Single( - TString( - TString { - range: 347..364, - node_index: AtomicNodeIndex(..), - elements: [ - Literal( - InterpolatedStringLiteralElement { - range: 349..350, - node_index: AtomicNodeIndex(..), - value: "\\", - }, - ), - Interpolation( - InterpolatedElement { - range: 350..355, - node_index: AtomicNodeIndex(..), - expression: Name( - ExprName { - node_index: AtomicNodeIndex(..), - range: 351..354, - id: Name("foo"), - ctx: Load, - }, - ), - debug_text: None, - conversion: None, - format_spec: None, - }, - ), - Literal( - InterpolatedStringLiteralElement { - range: 355..356, - node_index: AtomicNodeIndex(..), - value: "\\", - }, - ), - Interpolation( - InterpolatedElement { - range: 356..363, - node_index: AtomicNodeIndex(..), - expression: Name( - ExprName { - node_index: AtomicNodeIndex(..), - range: 357..360, - id: Name("bar"), - ctx: Load, - }, - ), - debug_text: None, - conversion: None, - format_spec: Some( - InterpolatedStringFormatSpec { - range: 361..362, - node_index: AtomicNodeIndex(..), - elements: [ - Literal( - InterpolatedStringLiteralElement { - range: 361..362, - node_index: AtomicNodeIndex(..), - value: "\\", - }, - ), - ], - }, - ), - }, - ), - ], - flags: TStringFlags { - quote_style: Double, - prefix: Regular, - triple_quoted: false, - }, - }, - ), - ), - }, - }, - ), - }, - ), - Expr( - StmtExpr { - node_index: AtomicNodeIndex(..), - range: 365..379, - value: TString( - ExprTString { - node_index: AtomicNodeIndex(..), - range: 365..379, - value: TStringValue { - inner: Single( - TString( - TString { - range: 365..379, - node_index: AtomicNodeIndex(..), - elements: [ - Literal( - InterpolatedStringLiteralElement { - range: 367..378, - node_index: AtomicNodeIndex(..), - value: "\\{foo\\}", - }, - ), - ], - flags: TStringFlags { - quote_style: Double, - prefix: Regular, - triple_quoted: false, - }, - }, - ), - ), - }, - }, - ), - }, - ), - Expr( - StmtExpr { - node_index: AtomicNodeIndex(..), - range: 380..420, - value: TString( - ExprTString { - node_index: AtomicNodeIndex(..), - range: 380..420, - value: TStringValue { - inner: Single( - TString( - TString { - range: 380..420, - node_index: AtomicNodeIndex(..), - elements: [ - Interpolation( - InterpolatedElement { - range: 384..417, - node_index: AtomicNodeIndex(..), - expression: Name( - ExprName { - node_index: AtomicNodeIndex(..), - range: 390..393, - id: Name("foo"), - ctx: Load, - }, - ), - debug_text: None, - conversion: None, - format_spec: Some( - InterpolatedStringFormatSpec { - range: 394..416, - node_index: AtomicNodeIndex(..), - elements: [ - Literal( - InterpolatedStringLiteralElement { - range: 394..416, - node_index: AtomicNodeIndex(..), - value: "x\n y\n z\n", - }, - ), - ], - }, - ), - }, - ), - ], - flags: TStringFlags { - quote_style: Double, - prefix: Regular, - triple_quoted: true, - }, - }, - ), - ), - }, - }, - ), - }, - ), - Expr( - StmtExpr { - node_index: AtomicNodeIndex(..), - range: 421..439, - value: TString( - ExprTString { - node_index: AtomicNodeIndex(..), - range: 421..439, - value: TStringValue { - inner: Single( - TString( - TString { - range: 421..439, - node_index: AtomicNodeIndex(..), - elements: [ - Interpolation( - InterpolatedElement { - range: 423..438, - node_index: AtomicNodeIndex(..), - expression: Name( - ExprName { - node_index: AtomicNodeIndex(..), - range: 428..431, - 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, - }, - }, - ), - ), - }, - }, - ), - }, - ), - Expr( - StmtExpr { - node_index: AtomicNodeIndex(..), - range: 441..486, - value: TString( - ExprTString { - node_index: AtomicNodeIndex(..), - range: 441..486, - value: TStringValue { - inner: Single( - TString( - TString { - range: 441..486, - node_index: AtomicNodeIndex(..), - elements: [ - Literal( - InterpolatedStringLiteralElement { - range: 443..450, - node_index: AtomicNodeIndex(..), - value: "normal ", - }, - ), - Interpolation( - InterpolatedElement { - range: 450..455, - node_index: AtomicNodeIndex(..), - expression: Name( - ExprName { - node_index: AtomicNodeIndex(..), - range: 451..454, - id: Name("foo"), - ctx: Load, - }, - ), - debug_text: None, - conversion: None, - format_spec: None, - }, - ), - Literal( - InterpolatedStringLiteralElement { - range: 455..468, - node_index: AtomicNodeIndex(..), - value: " {another} ", - }, - ), - Interpolation( - InterpolatedElement { - range: 468..473, - node_index: AtomicNodeIndex(..), - expression: Name( - ExprName { - node_index: AtomicNodeIndex(..), - range: 469..472, - id: Name("bar"), - ctx: Load, - }, - ), - debug_text: None, - conversion: None, - format_spec: None, - }, - ), - Literal( - InterpolatedStringLiteralElement { - range: 473..476, - node_index: AtomicNodeIndex(..), - value: " {", - }, - ), - Interpolation( - InterpolatedElement { - range: 476..483, - node_index: AtomicNodeIndex(..), - expression: Name( - ExprName { - node_index: AtomicNodeIndex(..), - range: 477..482, - id: Name("three"), - ctx: Load, - }, - ), - debug_text: None, - conversion: None, - format_spec: None, - }, - ), - Literal( - InterpolatedStringLiteralElement { - range: 483..485, - node_index: AtomicNodeIndex(..), - value: "}", - }, - ), - ], - flags: TStringFlags { - quote_style: Double, - prefix: Regular, - triple_quoted: false, - }, - }, - ), - ), - }, - }, - ), - }, - ), - Expr( - StmtExpr { - node_index: AtomicNodeIndex(..), - range: 487..529, - value: TString( - ExprTString { - node_index: AtomicNodeIndex(..), - range: 487..529, - value: TStringValue { - inner: Single( - TString( - TString { - range: 487..529, - node_index: AtomicNodeIndex(..), - elements: [ - Literal( - InterpolatedStringLiteralElement { - range: 489..496, - node_index: AtomicNodeIndex(..), - value: "normal ", - }, - ), - Interpolation( - InterpolatedElement { - range: 496..503, - node_index: AtomicNodeIndex(..), - expression: Name( - ExprName { - node_index: AtomicNodeIndex(..), - range: 497..500, - id: Name("foo"), - ctx: Load, - }, - ), - debug_text: None, - conversion: Ascii, - format_spec: None, - }, - ), - Literal( - InterpolatedStringLiteralElement { - range: 503..504, - node_index: AtomicNodeIndex(..), - value: " ", - }, - ), - Interpolation( - InterpolatedElement { - range: 504..511, - node_index: AtomicNodeIndex(..), - expression: Name( - ExprName { - node_index: AtomicNodeIndex(..), - range: 505..508, - id: Name("bar"), - ctx: Load, - }, - ), - debug_text: None, - conversion: Str, - format_spec: None, - }, - ), - Literal( - InterpolatedStringLiteralElement { - range: 511..512, - node_index: AtomicNodeIndex(..), - value: " ", - }, - ), - Interpolation( - InterpolatedElement { - range: 512..519, - node_index: AtomicNodeIndex(..), - expression: Name( - ExprName { - node_index: AtomicNodeIndex(..), - range: 513..516, - id: Name("baz"), - ctx: Load, - }, - ), - debug_text: None, - conversion: Repr, - format_spec: None, - }, - ), - Literal( - InterpolatedStringLiteralElement { - range: 519..520, - node_index: AtomicNodeIndex(..), - value: " ", - }, - ), - Interpolation( - InterpolatedElement { - range: 520..528, - node_index: AtomicNodeIndex(..), - expression: Name( - ExprName { - node_index: AtomicNodeIndex(..), - range: 521..527, - id: Name("foobar"), - ctx: Load, - }, - ), - debug_text: None, - conversion: None, - format_spec: None, - }, - ), - ], - flags: TStringFlags { - quote_style: Double, - prefix: Regular, - triple_quoted: false, - }, - }, - ), - ), - }, - }, - ), - }, - ), - Expr( - StmtExpr { - node_index: AtomicNodeIndex(..), - range: 530..549, - value: TString( - ExprTString { - node_index: AtomicNodeIndex(..), - range: 530..549, - value: TStringValue { - inner: Single( - TString( - TString { - range: 530..549, - node_index: AtomicNodeIndex(..), - elements: [ - Literal( - InterpolatedStringLiteralElement { - range: 532..539, - node_index: AtomicNodeIndex(..), - value: "normal ", - }, - ), - Interpolation( - InterpolatedElement { - range: 539..548, - node_index: AtomicNodeIndex(..), - expression: Name( - ExprName { - node_index: AtomicNodeIndex(..), - range: 540..541, - id: Name("x"), - ctx: Load, - }, - ), - debug_text: None, - conversion: None, - format_spec: Some( - InterpolatedStringFormatSpec { - range: 542..547, - node_index: AtomicNodeIndex(..), - elements: [ - Literal( - InterpolatedStringLiteralElement { - range: 542..547, - node_index: AtomicNodeIndex(..), - value: "y + 2", - }, - ), - ], - }, - ), - }, - ), - ], - flags: TStringFlags { - quote_style: Double, - prefix: Regular, - triple_quoted: false, - }, - }, - ), - ), - }, - }, - ), - }, - ), - Expr( - StmtExpr { - node_index: AtomicNodeIndex(..), - range: 550..568, - value: TString( - ExprTString { - node_index: AtomicNodeIndex(..), - range: 550..568, - value: TStringValue { - inner: Single( - TString( - TString { - range: 550..568, - node_index: AtomicNodeIndex(..), - elements: [ - Interpolation( - InterpolatedElement { - range: 552..567, - node_index: AtomicNodeIndex(..), - expression: Name( - ExprName { - node_index: AtomicNodeIndex(..), - range: 553..554, - id: Name("x"), - ctx: Load, - }, - ), - debug_text: None, - conversion: None, - format_spec: Some( - InterpolatedStringFormatSpec { - range: 555..566, - node_index: AtomicNodeIndex(..), - elements: [ - Interpolation( - InterpolatedElement { - range: 555..566, - node_index: AtomicNodeIndex(..), - expression: Call( - ExprCall { - node_index: AtomicNodeIndex(..), - range: 556..565, - func: Attribute( - ExprAttribute { - node_index: AtomicNodeIndex(..), - range: 556..563, - value: Set( - ExprSet { - node_index: AtomicNodeIndex(..), - range: 556..559, - elts: [ - NumberLiteral( - ExprNumberLiteral { - node_index: AtomicNodeIndex(..), - range: 557..558, - value: Int( - 1, - ), - }, - ), - ], - }, - ), - attr: Identifier { - id: Name("pop"), - range: 560..563, - node_index: AtomicNodeIndex(..), - }, - ctx: Load, - }, - ), - arguments: Arguments { - range: 563..565, - node_index: AtomicNodeIndex(..), - args: [], - keywords: [], - }, - }, - ), - debug_text: None, - conversion: None, - format_spec: None, - }, - ), - ], - }, - ), - }, - ), - ], - flags: TStringFlags { - quote_style: Double, - prefix: Regular, - triple_quoted: false, - }, - }, - ), - ), - }, - }, - ), - }, - ), - Expr( - StmtExpr { - node_index: AtomicNodeIndex(..), - range: 569..588, - value: TString( - ExprTString { - node_index: AtomicNodeIndex(..), - range: 569..588, - value: TStringValue { - inner: Single( - TString( - TString { - range: 569..588, - node_index: AtomicNodeIndex(..), - elements: [ - Interpolation( - InterpolatedElement { - range: 571..587, - node_index: AtomicNodeIndex(..), - expression: Lambda( - ExprLambda { - node_index: AtomicNodeIndex(..), - range: 573..585, - parameters: Some( - Parameters { - range: 580..581, - node_index: AtomicNodeIndex( - 0, - ), - posonlyargs: [], - args: [ - ParameterWithDefault { - range: 580..581, - node_index: AtomicNodeIndex(..), - parameter: Parameter { - range: 580..581, - node_index: AtomicNodeIndex(..), - name: Identifier { - id: Name("x"), - range: 580..581, - node_index: AtomicNodeIndex(..), - }, - annotation: None, - }, - default: None, - }, - ], - vararg: None, - kwonlyargs: [], - kwarg: None, - }, - ), - body: Set( - ExprSet { + TString { + range: 349..366, + node_index: AtomicNodeIndex(..), + elements: [ + Literal( + InterpolatedStringLiteralElement { + range: 351..352, + node_index: AtomicNodeIndex(..), + value: "\\", + }, + ), + Interpolation( + InterpolatedElement { + range: 352..357, + node_index: AtomicNodeIndex(..), + expression: Name( + ExprName { + node_index: AtomicNodeIndex(..), + range: 353..356, + id: Name("foo"), + ctx: Load, + }, + ), + debug_text: None, + conversion: None, + format_spec: None, + }, + ), + Literal( + InterpolatedStringLiteralElement { + range: 357..358, + node_index: AtomicNodeIndex(..), + value: "\\", + }, + ), + Interpolation( + InterpolatedElement { + range: 358..365, + node_index: AtomicNodeIndex(..), + expression: Name( + ExprName { + node_index: AtomicNodeIndex(..), + range: 359..362, + id: Name("bar"), + ctx: Load, + }, + ), + debug_text: None, + conversion: None, + format_spec: Some( + InterpolatedStringFormatSpec { + range: 363..364, + node_index: AtomicNodeIndex(..), + elements: [ + Literal( + InterpolatedStringLiteralElement { + range: 363..364, node_index: AtomicNodeIndex(..), - range: 582..585, - elts: [ - Name( - ExprName { - node_index: AtomicNodeIndex(..), - range: 583..584, - id: Name("x"), - ctx: Load, - }, - ), - ], + value: "\\", }, ), - }, - ), - debug_text: None, - conversion: None, - format_spec: None, - }, - ), - ], - flags: TStringFlags { - quote_style: Double, - prefix: Regular, - triple_quoted: false, - }, + ], + }, + ), + }, + ), + ], + flags: TStringFlags { + quote_style: Double, + prefix: Regular, + triple_quoted: false, }, - ), + }, ), }, }, @@ -1878,48 +1213,31 @@ Module( Expr( StmtExpr { node_index: AtomicNodeIndex(..), - range: 589..597, + range: 367..381, value: TString( ExprTString { node_index: AtomicNodeIndex(..), - range: 589..597, + range: 367..381, value: TStringValue { inner: Single( - TString( - TString { - range: 589..597, - node_index: AtomicNodeIndex(..), - elements: [ - Interpolation( - InterpolatedElement { - range: 591..596, - node_index: AtomicNodeIndex(..), - expression: Name( - ExprName { - node_index: AtomicNodeIndex(..), - range: 592..593, - 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: 367..381, + node_index: AtomicNodeIndex(..), + elements: [ + Literal( + InterpolatedStringLiteralElement { + range: 369..380, + node_index: AtomicNodeIndex(..), + value: "\\{foo\\}", + }, + ), + ], + flags: TStringFlags { + quote_style: Double, + prefix: Regular, + triple_quoted: false, }, - ), + }, ), }, }, @@ -1929,48 +1247,55 @@ Module( Expr( StmtExpr { node_index: AtomicNodeIndex(..), - range: 598..611, + range: 382..422, value: TString( ExprTString { node_index: AtomicNodeIndex(..), - range: 598..611, + range: 382..422, value: TStringValue { inner: Single( - TString( - TString { - range: 598..611, - node_index: AtomicNodeIndex(..), - elements: [ - Interpolation( - InterpolatedElement { - range: 600..610, - node_index: AtomicNodeIndex(..), - expression: Name( - ExprName { - node_index: AtomicNodeIndex(..), - range: 605..606, - 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: 382..422, + node_index: AtomicNodeIndex(..), + elements: [ + Interpolation( + InterpolatedElement { + range: 386..419, + node_index: AtomicNodeIndex(..), + expression: Name( + ExprName { + node_index: AtomicNodeIndex(..), + range: 392..395, + id: Name("foo"), + ctx: Load, + }, + ), + debug_text: None, + conversion: None, + format_spec: Some( + InterpolatedStringFormatSpec { + range: 396..418, + node_index: AtomicNodeIndex(..), + elements: [ + Literal( + InterpolatedStringLiteralElement { + range: 396..418, + node_index: AtomicNodeIndex(..), + value: "x\n y\n z\n", + }, + ), + ], + }, + ), + }, + ), + ], + flags: TStringFlags { + quote_style: Double, + prefix: Regular, + triple_quoted: true, }, - ), + }, ), }, }, @@ -1980,48 +1305,46 @@ Module( Expr( StmtExpr { node_index: AtomicNodeIndex(..), - range: 612..621, + range: 423..441, value: TString( ExprTString { node_index: AtomicNodeIndex(..), - range: 612..621, + range: 423..441, value: TStringValue { inner: Single( - TString( - TString { - range: 612..621, - node_index: AtomicNodeIndex(..), - elements: [ - Interpolation( - InterpolatedElement { - range: 614..620, - node_index: AtomicNodeIndex(..), - expression: Name( - ExprName { - node_index: AtomicNodeIndex(..), - range: 615..616, - id: Name("x"), - ctx: Load, - }, - ), - debug_text: Some( - DebugText { - leading: "", - trailing: "=", - }, - ), - conversion: Ascii, - format_spec: None, - }, - ), - ], - flags: TStringFlags { - quote_style: Double, - prefix: Regular, - triple_quoted: false, - }, + TString { + range: 423..441, + node_index: AtomicNodeIndex(..), + elements: [ + Interpolation( + InterpolatedElement { + range: 425..440, + node_index: AtomicNodeIndex(..), + expression: Name( + ExprName { + node_index: AtomicNodeIndex(..), + range: 430..433, + 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, }, - ), + }, ), }, }, @@ -2031,57 +1354,479 @@ Module( Expr( StmtExpr { node_index: AtomicNodeIndex(..), - range: 622..636, + range: 443..488, value: TString( ExprTString { node_index: AtomicNodeIndex(..), - range: 622..636, + range: 443..488, value: TStringValue { inner: Single( - TString( - TString { - range: 622..636, - node_index: AtomicNodeIndex(..), - elements: [ - Interpolation( - InterpolatedElement { - range: 624..635, - node_index: AtomicNodeIndex(..), - expression: Name( - ExprName { - node_index: AtomicNodeIndex(..), - range: 625..626, - id: Name("x"), - ctx: Load, - }, - ), - debug_text: None, - conversion: None, - format_spec: Some( - InterpolatedStringFormatSpec { - range: 627..634, - node_index: AtomicNodeIndex(..), - elements: [ - Literal( - InterpolatedStringLiteralElement { - range: 627..634, - node_index: AtomicNodeIndex(..), - value: ".3f!r =", - }, + TString { + range: 443..488, + node_index: AtomicNodeIndex(..), + elements: [ + Literal( + InterpolatedStringLiteralElement { + range: 445..452, + node_index: AtomicNodeIndex(..), + value: "normal ", + }, + ), + Interpolation( + InterpolatedElement { + range: 452..457, + node_index: AtomicNodeIndex(..), + expression: Name( + ExprName { + node_index: AtomicNodeIndex(..), + range: 453..456, + id: Name("foo"), + ctx: Load, + }, + ), + debug_text: None, + conversion: None, + format_spec: None, + }, + ), + Literal( + InterpolatedStringLiteralElement { + range: 457..470, + node_index: AtomicNodeIndex(..), + value: " {another} ", + }, + ), + Interpolation( + InterpolatedElement { + range: 470..475, + node_index: AtomicNodeIndex(..), + expression: Name( + ExprName { + node_index: AtomicNodeIndex(..), + range: 471..474, + id: Name("bar"), + ctx: Load, + }, + ), + debug_text: None, + conversion: None, + format_spec: None, + }, + ), + Literal( + InterpolatedStringLiteralElement { + range: 475..478, + node_index: AtomicNodeIndex(..), + value: " {", + }, + ), + Interpolation( + InterpolatedElement { + range: 478..485, + node_index: AtomicNodeIndex(..), + expression: Name( + ExprName { + node_index: AtomicNodeIndex(..), + range: 479..484, + id: Name("three"), + ctx: Load, + }, + ), + debug_text: None, + conversion: None, + format_spec: None, + }, + ), + Literal( + InterpolatedStringLiteralElement { + range: 485..487, + node_index: AtomicNodeIndex(..), + value: "}", + }, + ), + ], + flags: TStringFlags { + quote_style: Double, + prefix: Regular, + triple_quoted: false, + }, + }, + ), + }, + }, + ), + }, + ), + Expr( + StmtExpr { + node_index: AtomicNodeIndex(..), + range: 489..531, + value: TString( + ExprTString { + node_index: AtomicNodeIndex(..), + range: 489..531, + value: TStringValue { + inner: Single( + TString { + range: 489..531, + node_index: AtomicNodeIndex(..), + elements: [ + Literal( + InterpolatedStringLiteralElement { + range: 491..498, + node_index: AtomicNodeIndex(..), + value: "normal ", + }, + ), + Interpolation( + InterpolatedElement { + range: 498..505, + node_index: AtomicNodeIndex(..), + expression: Name( + ExprName { + node_index: AtomicNodeIndex(..), + range: 499..502, + id: Name("foo"), + ctx: Load, + }, + ), + debug_text: None, + conversion: Ascii, + format_spec: None, + }, + ), + Literal( + InterpolatedStringLiteralElement { + range: 505..506, + node_index: AtomicNodeIndex(..), + value: " ", + }, + ), + Interpolation( + InterpolatedElement { + range: 506..513, + node_index: AtomicNodeIndex(..), + expression: Name( + ExprName { + node_index: AtomicNodeIndex(..), + range: 507..510, + id: Name("bar"), + ctx: Load, + }, + ), + debug_text: None, + conversion: Str, + format_spec: None, + }, + ), + Literal( + InterpolatedStringLiteralElement { + range: 513..514, + node_index: AtomicNodeIndex(..), + value: " ", + }, + ), + Interpolation( + InterpolatedElement { + range: 514..521, + node_index: AtomicNodeIndex(..), + expression: Name( + ExprName { + node_index: AtomicNodeIndex(..), + range: 515..518, + id: Name("baz"), + ctx: Load, + }, + ), + debug_text: None, + conversion: Repr, + format_spec: None, + }, + ), + Literal( + InterpolatedStringLiteralElement { + range: 521..522, + node_index: AtomicNodeIndex(..), + value: " ", + }, + ), + Interpolation( + InterpolatedElement { + range: 522..530, + node_index: AtomicNodeIndex(..), + expression: Name( + ExprName { + node_index: AtomicNodeIndex(..), + range: 523..529, + id: Name("foobar"), + ctx: Load, + }, + ), + debug_text: None, + conversion: None, + format_spec: None, + }, + ), + ], + flags: TStringFlags { + quote_style: Double, + prefix: Regular, + triple_quoted: false, + }, + }, + ), + }, + }, + ), + }, + ), + Expr( + StmtExpr { + node_index: AtomicNodeIndex(..), + range: 532..551, + value: TString( + ExprTString { + node_index: AtomicNodeIndex(..), + range: 532..551, + value: TStringValue { + inner: Single( + TString { + range: 532..551, + node_index: AtomicNodeIndex(..), + elements: [ + Literal( + InterpolatedStringLiteralElement { + range: 534..541, + node_index: AtomicNodeIndex(..), + value: "normal ", + }, + ), + Interpolation( + InterpolatedElement { + range: 541..550, + node_index: AtomicNodeIndex(..), + expression: Name( + ExprName { + node_index: AtomicNodeIndex(..), + range: 542..543, + id: Name("x"), + ctx: Load, + }, + ), + debug_text: None, + conversion: None, + format_spec: Some( + InterpolatedStringFormatSpec { + range: 544..549, + node_index: AtomicNodeIndex(..), + elements: [ + Literal( + InterpolatedStringLiteralElement { + range: 544..549, + node_index: AtomicNodeIndex(..), + value: "y + 2", + }, + ), + ], + }, + ), + }, + ), + ], + flags: TStringFlags { + quote_style: Double, + prefix: Regular, + triple_quoted: false, + }, + }, + ), + }, + }, + ), + }, + ), + Expr( + StmtExpr { + node_index: AtomicNodeIndex(..), + range: 552..570, + value: TString( + ExprTString { + node_index: AtomicNodeIndex(..), + range: 552..570, + value: TStringValue { + inner: Single( + TString { + range: 552..570, + node_index: AtomicNodeIndex(..), + elements: [ + Interpolation( + InterpolatedElement { + range: 554..569, + node_index: AtomicNodeIndex(..), + expression: Name( + ExprName { + node_index: AtomicNodeIndex(..), + range: 555..556, + id: Name("x"), + ctx: Load, + }, + ), + debug_text: None, + conversion: None, + format_spec: Some( + InterpolatedStringFormatSpec { + range: 557..568, + node_index: AtomicNodeIndex(..), + elements: [ + Interpolation( + InterpolatedElement { + range: 557..568, + node_index: AtomicNodeIndex(..), + expression: Call( + ExprCall { + node_index: AtomicNodeIndex(..), + range: 558..567, + func: Attribute( + ExprAttribute { + node_index: AtomicNodeIndex(..), + range: 558..565, + value: Set( + ExprSet { + node_index: AtomicNodeIndex(..), + range: 558..561, + elts: [ + NumberLiteral( + ExprNumberLiteral { + node_index: AtomicNodeIndex(..), + range: 559..560, + value: Int( + 1, + ), + }, + ), + ], + }, + ), + attr: Identifier { + id: Name("pop"), + range: 562..565, + node_index: AtomicNodeIndex(..), + }, + ctx: Load, + }, + ), + arguments: Arguments { + range: 565..567, + node_index: AtomicNodeIndex(..), + args: [], + keywords: [], + }, + }, + ), + debug_text: None, + conversion: None, + format_spec: None, + }, + ), + ], + }, + ), + }, + ), + ], + flags: TStringFlags { + quote_style: Double, + prefix: Regular, + triple_quoted: false, + }, + }, + ), + }, + }, + ), + }, + ), + Expr( + StmtExpr { + node_index: AtomicNodeIndex(..), + range: 571..590, + value: TString( + ExprTString { + node_index: AtomicNodeIndex(..), + range: 571..590, + value: TStringValue { + inner: Single( + TString { + range: 571..590, + node_index: AtomicNodeIndex(..), + elements: [ + Interpolation( + InterpolatedElement { + range: 573..589, + node_index: AtomicNodeIndex(..), + expression: Lambda( + ExprLambda { + node_index: AtomicNodeIndex(..), + range: 575..587, + parameters: Some( + Parameters { + range: 582..583, + node_index: AtomicNodeIndex( + 0, ), - ], - }, - ), - }, - ), - ], - flags: TStringFlags { - quote_style: Double, - prefix: Regular, - triple_quoted: false, - }, + posonlyargs: [], + args: [ + ParameterWithDefault { + range: 582..583, + node_index: AtomicNodeIndex(..), + parameter: Parameter { + range: 582..583, + node_index: AtomicNodeIndex(..), + name: Identifier { + id: Name("x"), + range: 582..583, + node_index: AtomicNodeIndex(..), + }, + annotation: None, + }, + default: None, + }, + ], + vararg: None, + kwonlyargs: [], + kwarg: None, + }, + ), + body: Set( + ExprSet { + node_index: AtomicNodeIndex(..), + range: 584..587, + elts: [ + Name( + ExprName { + node_index: AtomicNodeIndex(..), + range: 585..586, + id: Name("x"), + ctx: Load, + }, + ), + ], + }, + ), + }, + ), + debug_text: None, + conversion: None, + format_spec: None, + }, + ), + ], + flags: TStringFlags { + quote_style: Double, + prefix: Regular, + triple_quoted: false, }, - ), + }, ), }, }, @@ -2091,62 +1836,46 @@ Module( Expr( StmtExpr { node_index: AtomicNodeIndex(..), - range: 637..653, + range: 591..599, value: TString( ExprTString { node_index: AtomicNodeIndex(..), - range: 637..653, + range: 591..599, value: TStringValue { inner: Single( - TString( - TString { - range: 637..653, - node_index: AtomicNodeIndex(..), - elements: [ - Interpolation( - InterpolatedElement { - range: 639..652, - node_index: AtomicNodeIndex(..), - expression: Name( - ExprName { - node_index: AtomicNodeIndex(..), - range: 640..641, - id: Name("x"), - ctx: Load, - }, - ), - debug_text: Some( - DebugText { - leading: "", - trailing: " = ", - }, - ), - conversion: Repr, - format_spec: Some( - InterpolatedStringFormatSpec { - range: 648..651, - node_index: AtomicNodeIndex(..), - elements: [ - Literal( - InterpolatedStringLiteralElement { - range: 648..651, - node_index: AtomicNodeIndex(..), - value: ".3f", - }, - ), - ], - }, - ), - }, - ), - ], - flags: TStringFlags { - quote_style: Double, - prefix: Regular, - triple_quoted: false, - }, + TString { + range: 591..599, + node_index: AtomicNodeIndex(..), + elements: [ + Interpolation( + InterpolatedElement { + range: 593..598, + node_index: AtomicNodeIndex(..), + expression: Name( + ExprName { + node_index: AtomicNodeIndex(..), + range: 594..595, + 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, }, - ), + }, ), }, }, @@ -2156,57 +1885,46 @@ Module( Expr( StmtExpr { node_index: AtomicNodeIndex(..), - range: 654..667, + range: 600..613, value: TString( ExprTString { node_index: AtomicNodeIndex(..), - range: 654..667, + range: 600..613, value: TStringValue { inner: Single( - TString( - TString { - range: 654..667, - node_index: AtomicNodeIndex(..), - elements: [ - Interpolation( - InterpolatedElement { - range: 656..666, - node_index: AtomicNodeIndex(..), - expression: Name( - ExprName { - node_index: AtomicNodeIndex(..), - range: 657..658, - id: Name("x"), - ctx: Load, - }, - ), - debug_text: None, - conversion: None, - format_spec: Some( - InterpolatedStringFormatSpec { - range: 659..665, - node_index: AtomicNodeIndex(..), - elements: [ - Literal( - InterpolatedStringLiteralElement { - range: 659..665, - node_index: AtomicNodeIndex(..), - value: ".3f=!r", - }, - ), - ], - }, - ), - }, - ), - ], - flags: TStringFlags { - quote_style: Double, - prefix: Regular, - triple_quoted: false, - }, + TString { + range: 600..613, + node_index: AtomicNodeIndex(..), + elements: [ + Interpolation( + InterpolatedElement { + range: 602..612, + node_index: AtomicNodeIndex(..), + expression: Name( + ExprName { + node_index: AtomicNodeIndex(..), + range: 607..608, + 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, }, - ), + }, ), }, }, @@ -2216,258 +1934,274 @@ Module( Expr( StmtExpr { node_index: AtomicNodeIndex(..), - range: 668..682, + range: 614..623, value: TString( ExprTString { node_index: AtomicNodeIndex(..), - range: 668..682, + range: 614..623, + value: TStringValue { + inner: Single( + TString { + range: 614..623, + node_index: AtomicNodeIndex(..), + elements: [ + Interpolation( + InterpolatedElement { + range: 616..622, + node_index: AtomicNodeIndex(..), + expression: Name( + ExprName { + node_index: AtomicNodeIndex(..), + range: 617..618, + id: Name("x"), + ctx: Load, + }, + ), + debug_text: Some( + DebugText { + leading: "", + trailing: "=", + }, + ), + conversion: Ascii, + format_spec: None, + }, + ), + ], + flags: TStringFlags { + quote_style: Double, + prefix: Regular, + triple_quoted: false, + }, + }, + ), + }, + }, + ), + }, + ), + Expr( + StmtExpr { + node_index: AtomicNodeIndex(..), + range: 624..638, + value: TString( + ExprTString { + node_index: AtomicNodeIndex(..), + range: 624..638, + value: TStringValue { + inner: Single( + TString { + range: 624..638, + node_index: AtomicNodeIndex(..), + elements: [ + Interpolation( + InterpolatedElement { + range: 626..637, + node_index: AtomicNodeIndex(..), + expression: Name( + ExprName { + node_index: AtomicNodeIndex(..), + range: 627..628, + id: Name("x"), + ctx: Load, + }, + ), + debug_text: None, + conversion: None, + format_spec: Some( + InterpolatedStringFormatSpec { + range: 629..636, + node_index: AtomicNodeIndex(..), + elements: [ + Literal( + InterpolatedStringLiteralElement { + range: 629..636, + node_index: AtomicNodeIndex(..), + value: ".3f!r =", + }, + ), + ], + }, + ), + }, + ), + ], + flags: TStringFlags { + quote_style: Double, + prefix: Regular, + triple_quoted: false, + }, + }, + ), + }, + }, + ), + }, + ), + Expr( + StmtExpr { + node_index: AtomicNodeIndex(..), + range: 639..655, + value: TString( + ExprTString { + node_index: AtomicNodeIndex(..), + range: 639..655, + value: TStringValue { + inner: Single( + TString { + range: 639..655, + node_index: AtomicNodeIndex(..), + elements: [ + Interpolation( + InterpolatedElement { + range: 641..654, + node_index: AtomicNodeIndex(..), + expression: Name( + ExprName { + node_index: AtomicNodeIndex(..), + range: 642..643, + id: Name("x"), + ctx: Load, + }, + ), + debug_text: Some( + DebugText { + leading: "", + trailing: " = ", + }, + ), + conversion: Repr, + format_spec: Some( + InterpolatedStringFormatSpec { + range: 650..653, + node_index: AtomicNodeIndex(..), + elements: [ + Literal( + InterpolatedStringLiteralElement { + range: 650..653, + node_index: AtomicNodeIndex(..), + value: ".3f", + }, + ), + ], + }, + ), + }, + ), + ], + flags: TStringFlags { + quote_style: Double, + prefix: Regular, + triple_quoted: false, + }, + }, + ), + }, + }, + ), + }, + ), + Expr( + StmtExpr { + node_index: AtomicNodeIndex(..), + range: 656..669, + value: TString( + ExprTString { + node_index: AtomicNodeIndex(..), + range: 656..669, + value: TStringValue { + inner: Single( + TString { + range: 656..669, + node_index: AtomicNodeIndex(..), + elements: [ + Interpolation( + InterpolatedElement { + range: 658..668, + node_index: AtomicNodeIndex(..), + expression: Name( + ExprName { + node_index: AtomicNodeIndex(..), + range: 659..660, + id: Name("x"), + ctx: Load, + }, + ), + debug_text: None, + conversion: None, + format_spec: Some( + InterpolatedStringFormatSpec { + range: 661..667, + node_index: AtomicNodeIndex(..), + elements: [ + Literal( + InterpolatedStringLiteralElement { + range: 661..667, + node_index: AtomicNodeIndex(..), + value: ".3f=!r", + }, + ), + ], + }, + ), + }, + ), + ], + flags: TStringFlags { + quote_style: Double, + prefix: Regular, + triple_quoted: false, + }, + }, + ), + }, + }, + ), + }, + ), + Expr( + StmtExpr { + node_index: AtomicNodeIndex(..), + range: 670..685, + value: TString( + ExprTString { + node_index: AtomicNodeIndex(..), + range: 670..685, value: TStringValue { inner: Concatenated( [ - Literal( - StringLiteral { - range: 668..675, - node_index: AtomicNodeIndex(..), - value: "hello", - flags: StringLiteralFlags { - quote_style: Double, - prefix: Empty, - triple_quoted: false, - }, - }, - ), - TString( - TString { - range: 676..682, - node_index: AtomicNodeIndex(..), - elements: [ - Interpolation( - InterpolatedElement { - range: 678..681, - node_index: AtomicNodeIndex(..), - expression: Name( - ExprName { - node_index: AtomicNodeIndex(..), - range: 679..680, - id: Name("x"), - ctx: Load, - }, - ), - debug_text: None, - conversion: None, - format_spec: None, - }, - ), - ], - flags: TStringFlags { - quote_style: Double, - prefix: Regular, - triple_quoted: false, - }, - }, - ), - ], - ), - }, - }, - ), - }, - ), - Expr( - StmtExpr { - node_index: AtomicNodeIndex(..), - range: 683..696, - value: TString( - ExprTString { - node_index: AtomicNodeIndex(..), - range: 683..696, - value: TStringValue { - inner: Concatenated( - [ - TString( - TString { - range: 683..689, - node_index: AtomicNodeIndex(..), - elements: [ - Interpolation( - InterpolatedElement { - range: 685..688, - node_index: AtomicNodeIndex(..), - expression: Name( - ExprName { - node_index: AtomicNodeIndex(..), - range: 686..687, - id: Name("x"), - ctx: Load, - }, - ), - debug_text: None, - conversion: None, - format_spec: None, - }, - ), - ], - flags: TStringFlags { - quote_style: Double, - prefix: Regular, - triple_quoted: false, - }, - }, - ), - TString( - TString { - range: 690..696, - node_index: AtomicNodeIndex(..), - elements: [ - Interpolation( - InterpolatedElement { - range: 692..695, - node_index: AtomicNodeIndex(..), - expression: Name( - ExprName { - node_index: AtomicNodeIndex(..), - range: 693..694, - id: Name("y"), - ctx: Load, - }, - ), - debug_text: None, - conversion: None, - format_spec: None, - }, - ), - ], - flags: TStringFlags { - quote_style: Double, - prefix: Regular, - triple_quoted: false, - }, - }, - ), - ], - ), - }, - }, - ), - }, - ), - Expr( - StmtExpr { - node_index: AtomicNodeIndex(..), - range: 697..711, - value: TString( - ExprTString { - node_index: AtomicNodeIndex(..), - range: 697..711, - value: TStringValue { - inner: Concatenated( - [ - TString( - TString { - range: 697..703, - node_index: AtomicNodeIndex(..), - elements: [ - Interpolation( - InterpolatedElement { - range: 699..702, - node_index: AtomicNodeIndex(..), - expression: Name( - ExprName { - node_index: AtomicNodeIndex(..), - range: 700..701, - id: Name("x"), - ctx: Load, - }, - ), - debug_text: None, - conversion: None, - format_spec: None, - }, - ), - ], - flags: TStringFlags { - quote_style: Double, - prefix: Regular, - triple_quoted: false, - }, - }, - ), - Literal( - StringLiteral { - range: 704..711, - node_index: AtomicNodeIndex(..), - value: "world", - flags: StringLiteralFlags { - quote_style: Double, - prefix: Empty, - triple_quoted: false, - }, - }, - ), - ], - ), - }, - }, - ), - }, - ), - Expr( - StmtExpr { - node_index: AtomicNodeIndex(..), - range: 712..756, - value: TString( - ExprTString { - node_index: AtomicNodeIndex(..), - range: 712..756, - value: TStringValue { - inner: Single( - TString( TString { - range: 712..756, + range: 670..678, node_index: AtomicNodeIndex(..), elements: [ Literal( InterpolatedStringLiteralElement { - range: 714..739, + range: 672..677, node_index: AtomicNodeIndex(..), - value: "Invalid args in command: ", + value: "hello", }, ), + ], + flags: TStringFlags { + quote_style: Double, + prefix: Regular, + triple_quoted: false, + }, + }, + TString { + range: 679..685, + node_index: AtomicNodeIndex(..), + elements: [ Interpolation( InterpolatedElement { - range: 739..755, + range: 681..684, node_index: AtomicNodeIndex(..), - expression: Tuple( - ExprTuple { + expression: Name( + ExprName { node_index: AtomicNodeIndex(..), - range: 740..754, - elts: [ - Name( - ExprName { - node_index: AtomicNodeIndex(..), - range: 740..747, - id: Name("command"), - ctx: Load, - }, - ), - Starred( - ExprStarred { - node_index: AtomicNodeIndex(..), - range: 749..754, - value: Name( - ExprName { - node_index: AtomicNodeIndex(..), - range: 750..754, - id: Name("args"), - ctx: Load, - }, - ), - ctx: Load, - }, - ), - ], + range: 682..683, + id: Name("x"), ctx: Load, - parenthesized: false, }, ), debug_text: None, @@ -2482,78 +2216,6 @@ Module( triple_quoted: false, }, }, - ), - ), - }, - }, - ), - }, - ), - Expr( - StmtExpr { - node_index: AtomicNodeIndex(..), - range: 757..775, - value: TString( - ExprTString { - node_index: AtomicNodeIndex(..), - range: 757..775, - value: TStringValue { - inner: Concatenated( - [ - Literal( - StringLiteral { - range: 757..762, - node_index: AtomicNodeIndex(..), - value: "foo", - flags: StringLiteralFlags { - quote_style: Double, - prefix: Empty, - triple_quoted: false, - }, - }, - ), - TString( - TString { - range: 763..769, - node_index: AtomicNodeIndex(..), - elements: [ - Interpolation( - InterpolatedElement { - range: 765..768, - node_index: AtomicNodeIndex(..), - expression: Name( - ExprName { - node_index: AtomicNodeIndex(..), - range: 766..767, - id: Name("x"), - ctx: Load, - }, - ), - debug_text: None, - conversion: None, - format_spec: None, - }, - ), - ], - flags: TStringFlags { - quote_style: Double, - prefix: Regular, - triple_quoted: false, - }, - }, - ), - Literal( - StringLiteral { - range: 770..775, - node_index: AtomicNodeIndex(..), - value: "bar", - flags: StringLiteralFlags { - quote_style: Double, - prefix: Empty, - triple_quoted: false, - }, - }, - ), ], ), }, @@ -2564,935 +2226,511 @@ Module( Expr( StmtExpr { node_index: AtomicNodeIndex(..), - range: 776..825, + range: 686..699, value: TString( ExprTString { node_index: AtomicNodeIndex(..), - range: 782..823, + range: 686..699, value: TStringValue { inner: Concatenated( [ - TString( - TString { - range: 782..786, - node_index: AtomicNodeIndex(..), - elements: [ - Literal( - InterpolatedStringLiteralElement { - range: 784..785, - node_index: AtomicNodeIndex(..), - value: "a", - }, - ), - ], - flags: TStringFlags { - quote_style: Double, - prefix: Regular, - triple_quoted: false, - }, - }, - ), - TString( - TString { - range: 791..795, - node_index: AtomicNodeIndex(..), - elements: [ - Literal( - InterpolatedStringLiteralElement { - range: 793..794, - node_index: AtomicNodeIndex(..), - value: "b", - }, - ), - ], - flags: TStringFlags { - quote_style: Double, - prefix: Regular, - triple_quoted: false, - }, - }, - ), - Literal( - StringLiteral { - range: 800..803, - node_index: AtomicNodeIndex(..), - value: "c", - flags: StringLiteralFlags { - quote_style: Double, - prefix: Empty, - triple_quoted: false, - }, - }, - ), - TString( - TString { - range: 808..813, - node_index: AtomicNodeIndex(..), - elements: [ - Literal( - InterpolatedStringLiteralElement { - range: 811..812, - node_index: AtomicNodeIndex(..), - value: "d", - }, - ), - ], - flags: TStringFlags { - quote_style: Double, - prefix: Raw { - uppercase_r: false, - }, - triple_quoted: false, - }, - }, - ), - FString( - FString { - range: 818..823, - node_index: AtomicNodeIndex(..), - elements: [ - Literal( - InterpolatedStringLiteralElement { - range: 821..822, - node_index: AtomicNodeIndex(..), - value: "e", - }, - ), - ], - flags: FStringFlags { - quote_style: Double, - prefix: Raw { - uppercase_r: false, - }, - triple_quoted: false, - }, - }, - ), - ], - ), - }, - }, - ), - }, - ), - Expr( - StmtExpr { - node_index: AtomicNodeIndex(..), - range: 850..879, - value: TString( - ExprTString { - node_index: AtomicNodeIndex(..), - range: 850..879, - value: TStringValue { - inner: Concatenated( - [ - Literal( - StringLiteral { - range: 850..856, - node_index: AtomicNodeIndex(..), - value: "foo", - flags: StringLiteralFlags { - quote_style: Double, - prefix: Unicode, - triple_quoted: false, - }, - }, - ), - TString( - TString { - range: 857..865, - node_index: AtomicNodeIndex(..), - elements: [ - Interpolation( - InterpolatedElement { - range: 859..864, - node_index: AtomicNodeIndex(..), - expression: Name( - ExprName { - node_index: AtomicNodeIndex(..), - range: 860..863, - id: Name("bar"), - ctx: Load, - }, - ), - debug_text: None, - conversion: None, - format_spec: None, - }, - ), - ], - flags: TStringFlags { - quote_style: Double, - prefix: Regular, - triple_quoted: false, - }, - }, - ), - Literal( - StringLiteral { - range: 866..871, - node_index: AtomicNodeIndex(..), - value: "baz", - flags: StringLiteralFlags { - quote_style: Double, - prefix: Empty, - triple_quoted: false, - }, - }, - ), - Literal( - StringLiteral { - range: 872..879, - node_index: AtomicNodeIndex(..), - value: " some", - flags: StringLiteralFlags { - quote_style: Double, - prefix: Empty, - triple_quoted: false, - }, - }, - ), - ], - ), - }, - }, - ), - }, - ), - Expr( - StmtExpr { - node_index: AtomicNodeIndex(..), - range: 880..909, - value: TString( - ExprTString { - node_index: AtomicNodeIndex(..), - range: 880..909, - value: TStringValue { - inner: Concatenated( - [ - Literal( - StringLiteral { - range: 880..885, - node_index: AtomicNodeIndex(..), - value: "foo", - flags: StringLiteralFlags { - quote_style: Double, - prefix: Empty, - triple_quoted: false, - }, - }, - ), - TString( - TString { - range: 886..894, - node_index: AtomicNodeIndex(..), - elements: [ - Interpolation( - InterpolatedElement { - range: 888..893, - node_index: AtomicNodeIndex(..), - expression: Name( - ExprName { - node_index: AtomicNodeIndex(..), - range: 889..892, - id: Name("bar"), - ctx: Load, - }, - ), - debug_text: None, - conversion: None, - format_spec: None, - }, - ), - ], - flags: TStringFlags { - quote_style: Double, - prefix: Regular, - triple_quoted: false, - }, - }, - ), - Literal( - StringLiteral { - range: 895..901, - node_index: AtomicNodeIndex(..), - value: "baz", - flags: StringLiteralFlags { - quote_style: Double, - prefix: Unicode, - triple_quoted: false, - }, - }, - ), - Literal( - StringLiteral { - range: 902..909, - node_index: AtomicNodeIndex(..), - value: " some", - flags: StringLiteralFlags { - quote_style: Double, - prefix: Empty, - triple_quoted: false, - }, - }, - ), - ], - ), - }, - }, - ), - }, - ), - Expr( - StmtExpr { - node_index: AtomicNodeIndex(..), - range: 910..939, - value: TString( - ExprTString { - node_index: AtomicNodeIndex(..), - range: 910..939, - value: TStringValue { - inner: Concatenated( - [ - Literal( - StringLiteral { - range: 910..915, - node_index: AtomicNodeIndex(..), - value: "foo", - flags: StringLiteralFlags { - quote_style: Double, - prefix: Empty, - triple_quoted: false, - }, - }, - ), - TString( - TString { - range: 916..924, - node_index: AtomicNodeIndex(..), - elements: [ - Interpolation( - InterpolatedElement { - range: 918..923, - node_index: AtomicNodeIndex(..), - expression: Name( - ExprName { - node_index: AtomicNodeIndex(..), - range: 919..922, - id: Name("bar"), - ctx: Load, - }, - ), - debug_text: None, - conversion: None, - format_spec: None, - }, - ), - ], - flags: TStringFlags { - quote_style: Double, - prefix: Regular, - triple_quoted: false, - }, - }, - ), - Literal( - StringLiteral { - range: 925..930, - node_index: AtomicNodeIndex(..), - value: "baz", - flags: StringLiteralFlags { - quote_style: Double, - prefix: Empty, - triple_quoted: false, - }, - }, - ), - Literal( - StringLiteral { - range: 931..939, - node_index: AtomicNodeIndex(..), - value: " some", - flags: StringLiteralFlags { - quote_style: Double, - prefix: Unicode, - triple_quoted: false, - }, - }, - ), - ], - ), - }, - }, - ), - }, - ), - Expr( - StmtExpr { - node_index: AtomicNodeIndex(..), - range: 940..978, - value: TString( - ExprTString { - node_index: AtomicNodeIndex(..), - range: 940..978, - value: TStringValue { - inner: Concatenated( - [ - Literal( - StringLiteral { - range: 940..946, - node_index: AtomicNodeIndex(..), - value: "foo", - flags: StringLiteralFlags { - quote_style: Double, - prefix: Unicode, - triple_quoted: false, - }, - }, - ), - TString( - TString { - range: 947..966, - node_index: AtomicNodeIndex(..), - elements: [ - Literal( - InterpolatedStringLiteralElement { - range: 949..953, - node_index: AtomicNodeIndex(..), - value: "bar ", - }, - ), - Interpolation( - InterpolatedElement { - range: 953..958, - node_index: AtomicNodeIndex(..), - expression: Name( - ExprName { - node_index: AtomicNodeIndex(..), - range: 954..957, - id: Name("baz"), - ctx: Load, - }, - ), - debug_text: None, - conversion: None, - format_spec: None, - }, - ), - Literal( - InterpolatedStringLiteralElement { - range: 958..965, - node_index: AtomicNodeIndex(..), - value: " really", - }, - ), - ], - flags: TStringFlags { - quote_style: Double, - prefix: Regular, - triple_quoted: false, - }, - }, - ), - Literal( - StringLiteral { - range: 967..973, - node_index: AtomicNodeIndex(..), - value: "bar", - flags: StringLiteralFlags { - quote_style: Double, - prefix: Unicode, - triple_quoted: false, - }, - }, - ), - Literal( - StringLiteral { - range: 974..978, - node_index: AtomicNodeIndex(..), - value: "no", - flags: StringLiteralFlags { - quote_style: Double, - prefix: Empty, - triple_quoted: false, - }, - }, - ), - ], - ), - }, - }, - ), - }, - ), - Expr( - StmtExpr { - node_index: AtomicNodeIndex(..), - range: 998..1017, - value: TString( - ExprTString { - node_index: AtomicNodeIndex(..), - range: 998..1017, - value: TStringValue { - inner: Concatenated( - [ - FString( - FString { - range: 998..1007, - node_index: AtomicNodeIndex(..), - elements: [ - Interpolation( - InterpolatedElement { - range: 1000..1006, - node_index: AtomicNodeIndex(..), - expression: Name( - ExprName { - node_index: AtomicNodeIndex(..), - range: 1001..1005, - id: Name("this"), - ctx: Load, - }, - ), - debug_text: None, - conversion: None, - format_spec: None, - }, - ), - ], - flags: FStringFlags { - quote_style: Double, - prefix: Regular, - triple_quoted: false, - }, - }, - ), - TString( - TString { - range: 1008..1017, - node_index: AtomicNodeIndex(..), - elements: [ - Interpolation( - InterpolatedElement { - range: 1010..1016, - node_index: AtomicNodeIndex(..), - expression: Name( - ExprName { - node_index: AtomicNodeIndex(..), - range: 1011..1015, - id: Name("that"), - ctx: Load, - }, - ), - debug_text: None, - conversion: None, - format_spec: None, - }, - ), - ], - flags: TStringFlags { - quote_style: Double, - prefix: Regular, - triple_quoted: false, - }, - }, - ), - ], - ), - }, - }, - ), - }, - ), - Expr( - StmtExpr { - node_index: AtomicNodeIndex(..), - range: 1018..1036, - value: TString( - ExprTString { - node_index: AtomicNodeIndex(..), - range: 1018..1036, - value: TStringValue { - inner: Concatenated( - [ - TString( - TString { - range: 1018..1027, - node_index: AtomicNodeIndex(..), - elements: [ - Interpolation( - InterpolatedElement { - range: 1020..1026, - node_index: AtomicNodeIndex(..), - expression: Name( - ExprName { - node_index: AtomicNodeIndex(..), - range: 1021..1025, - id: Name("this"), - ctx: Load, - }, - ), - debug_text: None, - conversion: None, - format_spec: None, - }, - ), - ], - flags: TStringFlags { - quote_style: Double, - prefix: Regular, - triple_quoted: false, - }, - }, - ), - FString( - FString { - range: 1027..1036, - node_index: AtomicNodeIndex(..), - elements: [ - Interpolation( - InterpolatedElement { - range: 1029..1035, - node_index: AtomicNodeIndex(..), - expression: Name( - ExprName { - node_index: AtomicNodeIndex(..), - range: 1030..1034, - id: Name("that"), - ctx: Load, - }, - ), - debug_text: None, - conversion: None, - format_spec: None, - }, - ), - ], - flags: FStringFlags { - quote_style: Double, - prefix: Regular, - triple_quoted: false, - }, - }, - ), - ], - ), - }, - }, - ), - }, - ), - Expr( - StmtExpr { - node_index: AtomicNodeIndex(..), - range: 1037..1064, - value: TString( - ExprTString { - node_index: AtomicNodeIndex(..), - range: 1037..1064, - value: TStringValue { - inner: Concatenated( - [ - TString( - TString { - range: 1037..1046, - node_index: AtomicNodeIndex(..), - elements: [ - Interpolation( - InterpolatedElement { - range: 1039..1045, - node_index: AtomicNodeIndex(..), - expression: Name( - ExprName { - node_index: AtomicNodeIndex(..), - range: 1040..1044, - id: Name("this"), - ctx: Load, - }, - ), - debug_text: None, - conversion: None, - format_spec: None, - }, - ), - ], - flags: TStringFlags { - quote_style: Double, - prefix: Regular, - triple_quoted: false, - }, - }, - ), - Literal( - StringLiteral { - range: 1047..1053, - node_index: AtomicNodeIndex(..), - value: "that", - flags: StringLiteralFlags { - quote_style: Double, - prefix: Empty, - triple_quoted: false, - }, - }, - ), - FString( - FString { - range: 1054..1064, - node_index: AtomicNodeIndex(..), - elements: [ - Interpolation( - InterpolatedElement { - range: 1056..1063, - node_index: AtomicNodeIndex(..), - expression: Name( - ExprName { - node_index: AtomicNodeIndex(..), - range: 1057..1062, - id: Name("other"), - ctx: Load, - }, - ), - debug_text: None, - conversion: None, - format_spec: None, - }, - ), - ], - flags: FStringFlags { - quote_style: Double, - prefix: Regular, - triple_quoted: false, - }, - }, - ), - ], - ), - }, - }, - ), - }, - ), - Expr( - StmtExpr { - node_index: AtomicNodeIndex(..), - range: 1065..1111, - value: TString( - ExprTString { - node_index: AtomicNodeIndex(..), - range: 1065..1111, - value: TStringValue { - inner: Concatenated( - [ - FString( - FString { - range: 1065..1082, - node_index: AtomicNodeIndex(..), - elements: [ - Literal( - InterpolatedStringLiteralElement { - range: 1067..1071, - node_index: AtomicNodeIndex(..), - value: "one ", - }, - ), - Interpolation( - InterpolatedElement { - range: 1071..1077, - node_index: AtomicNodeIndex(..), - expression: Name( - ExprName { - node_index: AtomicNodeIndex(..), - range: 1072..1076, - id: Name("this"), - ctx: Load, - }, - ), - debug_text: None, - conversion: None, - format_spec: None, - }, - ), - Literal( - InterpolatedStringLiteralElement { - range: 1077..1081, - node_index: AtomicNodeIndex(..), - value: " two", - }, - ), - ], - flags: FStringFlags { - quote_style: Double, - prefix: Regular, - triple_quoted: false, - }, - }, - ), - Literal( - StringLiteral { - range: 1083..1089, - node_index: AtomicNodeIndex(..), - value: "that", - flags: StringLiteralFlags { - quote_style: Double, - prefix: Empty, - triple_quoted: false, - }, - }, - ), - TString( - TString { - range: 1090..1111, - node_index: AtomicNodeIndex(..), - elements: [ - Literal( - InterpolatedStringLiteralElement { - range: 1092..1098, - node_index: AtomicNodeIndex(..), - value: "three ", - }, - ), - Interpolation( - InterpolatedElement { - range: 1098..1105, - node_index: AtomicNodeIndex(..), - expression: Name( - ExprName { - node_index: AtomicNodeIndex(..), - range: 1099..1104, - id: Name("other"), - ctx: Load, - }, - ), - debug_text: None, - conversion: None, - format_spec: None, - }, - ), - Literal( - InterpolatedStringLiteralElement { - range: 1105..1110, - node_index: AtomicNodeIndex(..), - value: " four", - }, - ), - ], - flags: TStringFlags { - quote_style: Double, - prefix: Regular, - triple_quoted: false, - }, - }, - ), - ], - ), - }, - }, - ), - }, - ), - Expr( - StmtExpr { - node_index: AtomicNodeIndex(..), - range: 1123..1142, - value: TString( - ExprTString { - node_index: AtomicNodeIndex(..), - range: 1123..1142, - value: TStringValue { - inner: Single( - TString( TString { - range: 1123..1142, + range: 686..692, node_index: AtomicNodeIndex(..), elements: [ Interpolation( InterpolatedElement { - range: 1125..1141, + range: 688..691, node_index: AtomicNodeIndex(..), - expression: FString( - ExprFString { + expression: Name( + ExprName { node_index: AtomicNodeIndex(..), - range: 1126..1140, - value: FStringValue { - inner: Single( - FString( - FString { - range: 1126..1140, + range: 689..690, + 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: 693..699, + node_index: AtomicNodeIndex(..), + elements: [ + Interpolation( + InterpolatedElement { + range: 695..698, + node_index: AtomicNodeIndex(..), + expression: Name( + ExprName { + node_index: AtomicNodeIndex(..), + range: 696..697, + id: Name("y"), + ctx: Load, + }, + ), + debug_text: None, + conversion: None, + format_spec: None, + }, + ), + ], + flags: TStringFlags { + quote_style: Double, + prefix: Regular, + triple_quoted: false, + }, + }, + ], + ), + }, + }, + ), + }, + ), + Expr( + StmtExpr { + node_index: AtomicNodeIndex(..), + range: 700..715, + value: TString( + ExprTString { + node_index: AtomicNodeIndex(..), + range: 700..715, + value: TStringValue { + inner: Concatenated( + [ + TString { + range: 700..706, + node_index: AtomicNodeIndex(..), + elements: [ + Interpolation( + InterpolatedElement { + range: 702..705, + node_index: AtomicNodeIndex(..), + expression: Name( + ExprName { + node_index: AtomicNodeIndex(..), + range: 703..704, + 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: 707..715, + node_index: AtomicNodeIndex(..), + elements: [ + Literal( + InterpolatedStringLiteralElement { + range: 709..714, + node_index: AtomicNodeIndex(..), + value: "world", + }, + ), + ], + flags: TStringFlags { + quote_style: Double, + prefix: Regular, + triple_quoted: false, + }, + }, + ], + ), + }, + }, + ), + }, + ), + Expr( + StmtExpr { + node_index: AtomicNodeIndex(..), + range: 716..760, + value: TString( + ExprTString { + node_index: AtomicNodeIndex(..), + range: 716..760, + value: TStringValue { + inner: Single( + TString { + range: 716..760, + node_index: AtomicNodeIndex(..), + elements: [ + Literal( + InterpolatedStringLiteralElement { + range: 718..743, + node_index: AtomicNodeIndex(..), + value: "Invalid args in command: ", + }, + ), + Interpolation( + InterpolatedElement { + range: 743..759, + node_index: AtomicNodeIndex(..), + expression: Tuple( + ExprTuple { + node_index: AtomicNodeIndex(..), + range: 744..758, + elts: [ + Name( + ExprName { + node_index: AtomicNodeIndex(..), + range: 744..751, + id: Name("command"), + ctx: Load, + }, + ), + Starred( + ExprStarred { + node_index: AtomicNodeIndex(..), + range: 753..758, + value: Name( + ExprName { node_index: AtomicNodeIndex(..), - elements: [ - Interpolation( - InterpolatedElement { - range: 1128..1139, - node_index: AtomicNodeIndex(..), - expression: TString( - ExprTString { - node_index: AtomicNodeIndex(..), - range: 1129..1138, - value: TStringValue { - inner: Single( - TString( - TString { - range: 1129..1138, - node_index: AtomicNodeIndex(..), - elements: [ - Interpolation( - InterpolatedElement { - range: 1131..1137, + range: 754..758, + id: Name("args"), + ctx: Load, + }, + ), + ctx: Load, + }, + ), + ], + ctx: Load, + parenthesized: false, + }, + ), + debug_text: None, + conversion: None, + format_spec: None, + }, + ), + ], + flags: TStringFlags { + quote_style: Double, + prefix: Regular, + triple_quoted: false, + }, + }, + ), + }, + }, + ), + }, + ), + Expr( + StmtExpr { + node_index: AtomicNodeIndex(..), + range: 761..781, + value: TString( + ExprTString { + node_index: AtomicNodeIndex(..), + range: 761..781, + value: TStringValue { + inner: Concatenated( + [ + TString { + range: 761..767, + node_index: AtomicNodeIndex(..), + elements: [ + Literal( + InterpolatedStringLiteralElement { + range: 763..766, + node_index: AtomicNodeIndex(..), + value: "foo", + }, + ), + ], + flags: TStringFlags { + quote_style: Double, + prefix: Regular, + triple_quoted: false, + }, + }, + TString { + range: 768..774, + node_index: AtomicNodeIndex(..), + elements: [ + Interpolation( + InterpolatedElement { + range: 770..773, + node_index: AtomicNodeIndex(..), + expression: Name( + ExprName { + node_index: AtomicNodeIndex(..), + range: 771..772, + 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: 775..781, + node_index: AtomicNodeIndex(..), + elements: [ + Literal( + InterpolatedStringLiteralElement { + range: 777..780, + node_index: AtomicNodeIndex(..), + value: "bar", + }, + ), + ], + flags: TStringFlags { + quote_style: Double, + prefix: Regular, + triple_quoted: false, + }, + }, + ], + ), + }, + }, + ), + }, + ), + Expr( + StmtExpr { + node_index: AtomicNodeIndex(..), + range: 782..832, + value: TString( + ExprTString { + node_index: AtomicNodeIndex(..), + range: 788..830, + value: TStringValue { + inner: Concatenated( + [ + TString { + range: 788..792, + node_index: AtomicNodeIndex(..), + elements: [ + Literal( + InterpolatedStringLiteralElement { + range: 790..791, + node_index: AtomicNodeIndex(..), + value: "a", + }, + ), + ], + flags: TStringFlags { + quote_style: Double, + prefix: Regular, + triple_quoted: false, + }, + }, + TString { + range: 797..801, + node_index: AtomicNodeIndex(..), + elements: [ + Literal( + InterpolatedStringLiteralElement { + range: 799..800, + node_index: AtomicNodeIndex(..), + value: "b", + }, + ), + ], + flags: TStringFlags { + quote_style: Double, + prefix: Regular, + triple_quoted: false, + }, + }, + TString { + range: 806..810, + node_index: AtomicNodeIndex(..), + elements: [ + Literal( + InterpolatedStringLiteralElement { + range: 808..809, + node_index: AtomicNodeIndex(..), + value: "c", + }, + ), + ], + flags: TStringFlags { + quote_style: Double, + prefix: Regular, + triple_quoted: false, + }, + }, + TString { + range: 815..820, + node_index: AtomicNodeIndex(..), + elements: [ + Literal( + InterpolatedStringLiteralElement { + range: 818..819, + node_index: AtomicNodeIndex(..), + value: "d", + }, + ), + ], + flags: TStringFlags { + quote_style: Double, + prefix: Raw { + uppercase_r: false, + }, + triple_quoted: false, + }, + }, + TString { + range: 825..830, + node_index: AtomicNodeIndex(..), + elements: [ + Literal( + InterpolatedStringLiteralElement { + range: 828..829, + node_index: AtomicNodeIndex(..), + value: "e", + }, + ), + ], + flags: TStringFlags { + quote_style: Double, + prefix: Raw { + uppercase_r: false, + }, + triple_quoted: false, + }, + }, + ], + ), + }, + }, + ), + }, + ), + Expr( + StmtExpr { + node_index: AtomicNodeIndex(..), + range: 844..863, + value: TString( + ExprTString { + node_index: AtomicNodeIndex(..), + range: 844..863, + value: TStringValue { + inner: Single( + TString { + range: 844..863, + node_index: AtomicNodeIndex(..), + elements: [ + Interpolation( + InterpolatedElement { + range: 846..862, + node_index: AtomicNodeIndex(..), + expression: FString( + ExprFString { + node_index: AtomicNodeIndex(..), + range: 847..861, + value: FStringValue { + inner: Single( + FString( + FString { + range: 847..861, + node_index: AtomicNodeIndex(..), + elements: [ + Interpolation( + InterpolatedElement { + range: 849..860, + node_index: AtomicNodeIndex(..), + expression: TString( + ExprTString { + node_index: AtomicNodeIndex(..), + range: 850..859, + value: TStringValue { + inner: Single( + TString { + range: 850..859, + node_index: AtomicNodeIndex(..), + elements: [ + Interpolation( + InterpolatedElement { + range: 852..858, + node_index: AtomicNodeIndex(..), + expression: Name( + ExprName { node_index: AtomicNodeIndex(..), - expression: Name( - ExprName { - node_index: AtomicNodeIndex(..), - range: 1132..1136, - id: Name("this"), - ctx: Load, - }, - ), - debug_text: None, - conversion: None, - format_spec: None, + range: 853..857, + id: Name("this"), + ctx: Load, }, ), - ], - 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, + }, + }, + ), }, - ), - debug_text: None, - conversion: None, - format_spec: None, - }, - ), - ], - flags: FStringFlags { - quote_style: Double, - prefix: Regular, - triple_quoted: false, - }, + }, + ), + debug_text: None, + conversion: None, + format_spec: None, + }, + ), + ], + flags: FStringFlags { + 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, - }, + }, + ), + debug_text: None, + conversion: None, + format_spec: None, + }, + ), + ], + flags: TStringFlags { + quote_style: Double, + prefix: Regular, + triple_quoted: false, }, - ), + }, ), }, }, diff --git a/crates/ruff_python_parser/tests/snapshots/valid_syntax@pep750_t_string_py314.py.snap b/crates/ruff_python_parser/tests/snapshots/valid_syntax@pep750_t_string_py314.py.snap index 6ad4b1584c..217b66b09c 100644 --- a/crates/ruff_python_parser/tests/snapshots/valid_syntax@pep750_t_string_py314.py.snap +++ b/crates/ruff_python_parser/tests/snapshots/valid_syntax@pep750_t_string_py314.py.snap @@ -20,70 +20,68 @@ Module( range: 44..74, value: TStringValue { inner: Single( - TString( - TString { - range: 44..74, - node_index: AtomicNodeIndex(..), - elements: [ - Literal( - InterpolatedStringLiteralElement { - range: 46..58, - node_index: AtomicNodeIndex(..), - value: "Magic wand: ", - }, - ), - Interpolation( - InterpolatedElement { - range: 58..73, - node_index: AtomicNodeIndex(..), - expression: Subscript( - ExprSubscript { - node_index: AtomicNodeIndex(..), - range: 60..71, - value: Name( - ExprName { - node_index: AtomicNodeIndex(..), - range: 60..63, - id: Name("bag"), - ctx: Load, - }, - ), - slice: StringLiteral( - ExprStringLiteral { - node_index: AtomicNodeIndex(..), - range: 64..70, - value: StringLiteralValue { - inner: Single( - StringLiteral { - range: 64..70, - node_index: AtomicNodeIndex(..), - value: "wand", - flags: StringLiteralFlags { - quote_style: Single, - prefix: Empty, - triple_quoted: false, - }, + TString { + range: 44..74, + node_index: AtomicNodeIndex(..), + elements: [ + Literal( + InterpolatedStringLiteralElement { + range: 46..58, + node_index: AtomicNodeIndex(..), + value: "Magic wand: ", + }, + ), + Interpolation( + InterpolatedElement { + range: 58..73, + node_index: AtomicNodeIndex(..), + expression: Subscript( + ExprSubscript { + node_index: AtomicNodeIndex(..), + range: 60..71, + value: Name( + ExprName { + node_index: AtomicNodeIndex(..), + range: 60..63, + id: Name("bag"), + ctx: Load, + }, + ), + slice: StringLiteral( + ExprStringLiteral { + node_index: AtomicNodeIndex(..), + range: 64..70, + value: StringLiteralValue { + inner: Single( + StringLiteral { + range: 64..70, + node_index: AtomicNodeIndex(..), + value: "wand", + flags: StringLiteralFlags { + quote_style: Single, + prefix: Empty, + triple_quoted: false, }, - ), - }, + }, + ), }, - ), - ctx: Load, - }, - ), - debug_text: None, - conversion: None, - format_spec: None, - }, - ), - ], - flags: TStringFlags { - quote_style: Single, - prefix: Regular, - triple_quoted: false, - }, + }, + ), + ctx: Load, + }, + ), + debug_text: None, + conversion: None, + format_spec: None, + }, + ), + ], + flags: TStringFlags { + quote_style: Single, + prefix: Regular, + triple_quoted: false, }, - ), + }, ), }, }, @@ -100,81 +98,79 @@ Module( range: 95..112, value: TStringValue { inner: Single( - TString( - TString { - range: 95..112, - node_index: AtomicNodeIndex(..), - elements: [ - Interpolation( - InterpolatedElement { - range: 97..111, - node_index: AtomicNodeIndex(..), - expression: Call( - ExprCall { - node_index: AtomicNodeIndex(..), - range: 98..110, - func: Attribute( - ExprAttribute { - node_index: AtomicNodeIndex(..), - range: 98..107, - value: StringLiteral( - ExprStringLiteral { - node_index: AtomicNodeIndex(..), - range: 98..102, - value: StringLiteralValue { - inner: Single( - StringLiteral { - range: 98..102, - node_index: AtomicNodeIndex(..), - value: "\n", - flags: StringLiteralFlags { - quote_style: Single, - prefix: Empty, - triple_quoted: false, - }, - }, - ), - }, - }, - ), - attr: Identifier { - id: Name("join"), - range: 103..107, - node_index: AtomicNodeIndex(..), - }, - ctx: Load, - }, - ), - arguments: Arguments { - range: 107..110, + TString { + range: 95..112, + node_index: AtomicNodeIndex(..), + elements: [ + Interpolation( + InterpolatedElement { + range: 97..111, + node_index: AtomicNodeIndex(..), + expression: Call( + ExprCall { + node_index: AtomicNodeIndex(..), + range: 98..110, + func: Attribute( + ExprAttribute { node_index: AtomicNodeIndex(..), - args: [ - Name( - ExprName { - node_index: AtomicNodeIndex(..), - range: 108..109, - id: Name("a"), - ctx: Load, + range: 98..107, + value: StringLiteral( + ExprStringLiteral { + node_index: AtomicNodeIndex(..), + range: 98..102, + value: StringLiteralValue { + inner: Single( + StringLiteral { + range: 98..102, + node_index: AtomicNodeIndex(..), + value: "\n", + flags: StringLiteralFlags { + quote_style: Single, + prefix: Empty, + triple_quoted: false, + }, + }, + ), }, - ), - ], - keywords: [], + }, + ), + attr: Identifier { + id: Name("join"), + range: 103..107, + node_index: AtomicNodeIndex(..), + }, + ctx: Load, }, + ), + arguments: Arguments { + range: 107..110, + node_index: AtomicNodeIndex(..), + args: [ + Name( + ExprName { + node_index: AtomicNodeIndex(..), + range: 108..109, + id: Name("a"), + ctx: Load, + }, + ), + ], + keywords: [], }, - ), - 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, }, - ), + }, ), }, }, @@ -191,70 +187,68 @@ Module( range: 148..220, value: TStringValue { inner: Single( - TString( - TString { - range: 148..220, - node_index: AtomicNodeIndex(..), - elements: [ - Literal( - InterpolatedStringLiteralElement { - range: 152..169, - node_index: AtomicNodeIndex(..), - value: "A complex trick: ", - }, - ), - Interpolation( - InterpolatedElement { - range: 169..217, - node_index: AtomicNodeIndex(..), - expression: Subscript( - ExprSubscript { - node_index: AtomicNodeIndex(..), - range: 175..185, - value: Name( - ExprName { - node_index: AtomicNodeIndex(..), - range: 175..178, - id: Name("bag"), - ctx: Load, - }, - ), - slice: StringLiteral( - ExprStringLiteral { - node_index: AtomicNodeIndex(..), - range: 179..184, - value: StringLiteralValue { - inner: Single( - StringLiteral { - range: 179..184, - node_index: AtomicNodeIndex(..), - value: "bag", - flags: StringLiteralFlags { - quote_style: Single, - prefix: Empty, - triple_quoted: false, - }, + TString { + range: 148..220, + node_index: AtomicNodeIndex(..), + elements: [ + Literal( + InterpolatedStringLiteralElement { + range: 152..169, + node_index: AtomicNodeIndex(..), + value: "A complex trick: ", + }, + ), + Interpolation( + InterpolatedElement { + range: 169..217, + node_index: AtomicNodeIndex(..), + expression: Subscript( + ExprSubscript { + node_index: AtomicNodeIndex(..), + range: 175..185, + value: Name( + ExprName { + node_index: AtomicNodeIndex(..), + range: 175..178, + id: Name("bag"), + ctx: Load, + }, + ), + slice: StringLiteral( + ExprStringLiteral { + node_index: AtomicNodeIndex(..), + range: 179..184, + value: StringLiteralValue { + inner: Single( + StringLiteral { + range: 179..184, + node_index: AtomicNodeIndex(..), + value: "bag", + flags: StringLiteralFlags { + quote_style: Single, + prefix: Empty, + triple_quoted: false, }, - ), - }, + }, + ), }, - ), - ctx: Load, - }, - ), - debug_text: None, - conversion: None, - format_spec: None, - }, - ), - ], - flags: TStringFlags { - quote_style: Single, - prefix: Regular, - triple_quoted: true, - }, + }, + ), + ctx: Load, + }, + ), + debug_text: None, + conversion: None, + format_spec: None, + }, + ), + ], + flags: TStringFlags { + quote_style: Single, + prefix: Regular, + triple_quoted: true, }, - ), + }, ), }, }, @@ -271,213 +265,201 @@ Module( range: 221..254, value: TStringValue { inner: Single( - TString( - TString { - range: 221..254, - node_index: AtomicNodeIndex(..), - elements: [ - Interpolation( - InterpolatedElement { - range: 223..253, - node_index: AtomicNodeIndex(..), - expression: TString( - ExprTString { - node_index: AtomicNodeIndex(..), - range: 224..252, - value: TStringValue { - inner: Single( - TString( - TString { - range: 224..252, - node_index: AtomicNodeIndex(..), - elements: [ - Interpolation( - InterpolatedElement { - range: 226..251, + TString { + range: 221..254, + node_index: AtomicNodeIndex(..), + elements: [ + Interpolation( + InterpolatedElement { + range: 223..253, + node_index: AtomicNodeIndex(..), + expression: TString( + ExprTString { + node_index: AtomicNodeIndex(..), + range: 224..252, + value: TStringValue { + inner: Single( + TString { + range: 224..252, + node_index: AtomicNodeIndex(..), + elements: [ + Interpolation( + InterpolatedElement { + range: 226..251, + node_index: AtomicNodeIndex(..), + expression: TString( + ExprTString { node_index: AtomicNodeIndex(..), - expression: TString( - ExprTString { - node_index: AtomicNodeIndex(..), - range: 227..250, - value: TStringValue { - inner: Single( - TString( - TString { - range: 227..250, + range: 227..250, + value: TStringValue { + inner: Single( + TString { + range: 227..250, + node_index: AtomicNodeIndex(..), + elements: [ + Interpolation( + InterpolatedElement { + range: 229..249, node_index: AtomicNodeIndex(..), - elements: [ - Interpolation( - InterpolatedElement { - range: 229..249, - node_index: AtomicNodeIndex(..), - expression: TString( - ExprTString { - node_index: AtomicNodeIndex(..), + expression: TString( + ExprTString { + node_index: AtomicNodeIndex(..), + range: 230..248, + value: TStringValue { + inner: Single( + TString { range: 230..248, - value: TStringValue { - inner: Single( - TString( - TString { - range: 230..248, - node_index: AtomicNodeIndex(..), - elements: [ - Interpolation( - InterpolatedElement { - range: 232..247, - node_index: AtomicNodeIndex(..), - expression: TString( - ExprTString { - node_index: AtomicNodeIndex(..), - range: 233..246, - value: TStringValue { - inner: Single( - TString( - TString { - range: 233..246, + node_index: AtomicNodeIndex(..), + elements: [ + Interpolation( + InterpolatedElement { + range: 232..247, + node_index: AtomicNodeIndex(..), + expression: TString( + ExprTString { + node_index: AtomicNodeIndex(..), + range: 233..246, + value: TStringValue { + inner: Single( + TString { + range: 233..246, + node_index: AtomicNodeIndex(..), + elements: [ + Interpolation( + InterpolatedElement { + range: 235..245, + node_index: AtomicNodeIndex(..), + expression: TString( + ExprTString { node_index: AtomicNodeIndex(..), - elements: [ - Interpolation( - InterpolatedElement { - range: 235..245, + range: 236..244, + value: TStringValue { + inner: Single( + TString { + range: 236..244, node_index: AtomicNodeIndex(..), - expression: TString( - ExprTString { - node_index: AtomicNodeIndex(..), - range: 236..244, - value: TStringValue { - inner: Single( - TString( - TString { - range: 236..244, - node_index: AtomicNodeIndex(..), - elements: [ - Interpolation( - InterpolatedElement { - range: 238..243, - node_index: AtomicNodeIndex(..), - expression: BinOp( - ExprBinOp { - node_index: AtomicNodeIndex(..), - range: 239..242, - left: NumberLiteral( - ExprNumberLiteral { - node_index: AtomicNodeIndex(..), - range: 239..240, - value: Int( - 1, - ), - }, - ), - op: Add, - right: NumberLiteral( - ExprNumberLiteral { - node_index: AtomicNodeIndex(..), - range: 241..242, - value: Int( - 1, - ), - }, - ), - }, - ), - debug_text: None, - conversion: None, - format_spec: None, - }, + elements: [ + Interpolation( + InterpolatedElement { + range: 238..243, + node_index: AtomicNodeIndex(..), + expression: BinOp( + ExprBinOp { + node_index: AtomicNodeIndex(..), + range: 239..242, + left: NumberLiteral( + ExprNumberLiteral { + node_index: AtomicNodeIndex(..), + range: 239..240, + value: Int( + 1, ), - ], - flags: TStringFlags { - quote_style: Double, - prefix: Regular, - triple_quoted: false, }, - }, - ), + ), + op: Add, + right: NumberLiteral( + ExprNumberLiteral { + node_index: AtomicNodeIndex(..), + range: 241..242, + value: Int( + 1, + ), + }, + ), + }, ), + debug_text: None, + conversion: None, + format_spec: None, }, - }, - ), - debug_text: None, - conversion: None, - format_spec: None, + ), + ], + flags: TStringFlags { + quote_style: Double, + prefix: Regular, + triple_quoted: false, + }, }, ), - ], - 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, }, - ), - 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, }, }, ), - 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, + }, }, - }, - ), - 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, + }, + }, + ), }, - ), - 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, }, - ), + }, ), }, }, @@ -494,94 +476,90 @@ Module( range: 276..310, value: TStringValue { inner: Single( - TString( - TString { - range: 276..310, - node_index: AtomicNodeIndex(..), - elements: [ - Interpolation( - InterpolatedElement { - range: 278..303, - node_index: AtomicNodeIndex(..), - expression: TString( - ExprTString { - node_index: AtomicNodeIndex(..), - range: 279..302, - value: TStringValue { - inner: Single( - TString( - TString { - range: 279..302, - node_index: AtomicNodeIndex(..), - elements: [ - Interpolation( - InterpolatedElement { - range: 283..293, + TString { + range: 276..310, + node_index: AtomicNodeIndex(..), + elements: [ + Interpolation( + InterpolatedElement { + range: 278..303, + node_index: AtomicNodeIndex(..), + expression: TString( + ExprTString { + node_index: AtomicNodeIndex(..), + range: 279..302, + value: TStringValue { + inner: Single( + TString { + range: 279..302, + node_index: AtomicNodeIndex(..), + elements: [ + Interpolation( + InterpolatedElement { + range: 283..293, + node_index: AtomicNodeIndex(..), + expression: StringLiteral( + ExprStringLiteral { node_index: AtomicNodeIndex(..), - expression: StringLiteral( - ExprStringLiteral { - node_index: AtomicNodeIndex(..), - range: 284..292, - value: StringLiteralValue { - inner: Single( - StringLiteral { - range: 284..292, - node_index: AtomicNodeIndex(..), - value: "nested", - flags: StringLiteralFlags { - quote_style: Double, - prefix: Empty, - triple_quoted: false, - }, - }, - ), + range: 284..292, + value: StringLiteralValue { + inner: Single( + StringLiteral { + range: 284..292, + node_index: AtomicNodeIndex(..), + value: "nested", + flags: StringLiteralFlags { + quote_style: Double, + prefix: Empty, + triple_quoted: false, + }, }, - }, - ), - debug_text: None, - conversion: None, - format_spec: None, + ), + }, }, ), - Literal( - InterpolatedStringLiteralElement { - range: 293..299, - node_index: AtomicNodeIndex(..), - value: " inner", - }, - ), - ], - flags: TStringFlags { - quote_style: Single, - prefix: Regular, - triple_quoted: true, + debug_text: None, + conversion: None, + format_spec: None, }, - }, - ), - ), - }, + ), + Literal( + InterpolatedStringLiteralElement { + range: 293..299, + node_index: AtomicNodeIndex(..), + value: " inner", + }, + ), + ], + flags: TStringFlags { + quote_style: Single, + prefix: Regular, + triple_quoted: true, + }, + }, + ), }, - ), - debug_text: None, - conversion: None, - format_spec: None, - }, - ), - Literal( - InterpolatedStringLiteralElement { - range: 303..309, - node_index: AtomicNodeIndex(..), - value: " outer", - }, - ), - ], - flags: TStringFlags { - quote_style: Double, - prefix: Regular, - triple_quoted: false, - }, + }, + ), + debug_text: None, + conversion: None, + format_spec: None, + }, + ), + Literal( + InterpolatedStringLiteralElement { + range: 303..309, + node_index: AtomicNodeIndex(..), + value: " outer", + }, + ), + ], + flags: TStringFlags { + quote_style: Double, + prefix: Regular, + triple_quoted: false, }, - ), + }, ), }, }, @@ -598,50 +576,48 @@ Module( range: 336..359, value: TStringValue { inner: Single( - TString( - TString { - range: 336..359, - node_index: AtomicNodeIndex(..), - elements: [ - Literal( - InterpolatedStringLiteralElement { - range: 338..343, - node_index: AtomicNodeIndex(..), - value: "test ", - }, - ), - Interpolation( - InterpolatedElement { - range: 343..353, - node_index: AtomicNodeIndex(..), - expression: Name( - ExprName { - node_index: AtomicNodeIndex(..), - range: 344..345, - id: Name("a"), - ctx: Load, - }, - ), - debug_text: None, - conversion: None, - format_spec: None, - }, - ), - Literal( - InterpolatedStringLiteralElement { - range: 353..358, - node_index: AtomicNodeIndex(..), - value: " more", - }, - ), - ], - flags: TStringFlags { - quote_style: Double, - prefix: Regular, - triple_quoted: false, - }, + TString { + range: 336..359, + node_index: AtomicNodeIndex(..), + elements: [ + Literal( + InterpolatedStringLiteralElement { + range: 338..343, + node_index: AtomicNodeIndex(..), + value: "test ", + }, + ), + Interpolation( + InterpolatedElement { + range: 343..353, + node_index: AtomicNodeIndex(..), + expression: Name( + ExprName { + node_index: AtomicNodeIndex(..), + range: 344..345, + id: Name("a"), + ctx: Load, + }, + ), + debug_text: None, + conversion: None, + format_spec: None, + }, + ), + Literal( + InterpolatedStringLiteralElement { + range: 353..358, + node_index: AtomicNodeIndex(..), + value: " more", + }, + ), + ], + flags: TStringFlags { + quote_style: Double, + prefix: Regular, + triple_quoted: false, }, - ), + }, ), }, }, diff --git a/crates/ruff_python_parser/tests/snapshots/valid_syntax@template_strings_py314.py.snap b/crates/ruff_python_parser/tests/snapshots/valid_syntax@template_strings_py314.py.snap index f314487ff6..ba9ecb9c20 100644 --- a/crates/ruff_python_parser/tests/snapshots/valid_syntax@template_strings_py314.py.snap +++ b/crates/ruff_python_parser/tests/snapshots/valid_syntax@template_strings_py314.py.snap @@ -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, - }, - }, - ), - ], + }, ), }, }, diff --git a/crates/ty_python_semantic/src/types/infer.rs b/crates/ty_python_semantic/src/types/infer.rs index 1ec6902d25..0c45e07804 100644 --- a/crates/ty_python_semantic/src/types/infer.rs +++ b/crates/ty_python_semantic/src/types/infer.rs @@ -5424,51 +5424,25 @@ impl<'db, 'ast> TypeInferenceBuilder<'db, 'ast> { fn infer_tstring_expression(&mut self, tstring: &ast::ExprTString) -> Type<'db> { let ast::ExprTString { value, .. } = tstring; - for part in value { - match part { - ast::TStringPart::Literal(_) => {} - ast::TStringPart::FString(fstring) => { - for element in &fstring.elements { - match element { - ast::InterpolatedStringElement::Interpolation(expression) => { - let ast::InterpolatedElement { - expression, - format_spec, - .. - } = expression; - self.infer_expression(expression); - - if let Some(format_spec) = format_spec { - for element in format_spec.elements.interpolations() { - self.infer_expression(&element.expression); - } - } + for tstring in value { + for element in &tstring.elements { + match element { + ast::InterpolatedStringElement::Interpolation( + tstring_interpolation_element, + ) => { + let ast::InterpolatedElement { + expression, + format_spec, + .. + } = tstring_interpolation_element; + self.infer_expression(expression); + if let Some(format_spec) = format_spec { + for element in format_spec.elements.interpolations() { + self.infer_expression(&element.expression); } - ast::InterpolatedStringElement::Literal(_) => {} - } - } - } - ast::TStringPart::TString(tstring) => { - for element in &tstring.elements { - match element { - ast::InterpolatedStringElement::Interpolation( - tstring_interpolation_element, - ) => { - let ast::InterpolatedElement { - expression, - format_spec, - .. - } = tstring_interpolation_element; - self.infer_expression(expression); - if let Some(format_spec) = format_spec { - for element in format_spec.elements.interpolations() { - self.infer_expression(&element.expression); - } - } - } - ast::InterpolatedStringElement::Literal(_) => {} } } + ast::InterpolatedStringElement::Literal(_) => {} } } }