diff --git a/parser/src/fstring.rs b/parser/src/fstring.rs index 0d5e260..2463e7b 100644 --- a/parser/src/fstring.rs +++ b/parser/src/fstring.rs @@ -4,6 +4,7 @@ use crate::{ error::{FStringError, FStringErrorType, ParseError}, parser::parse_expression, }; +use itertools::Itertools; use std::{iter, mem, str}; struct FStringParser<'a> { @@ -105,13 +106,16 @@ impl<'a> FStringParser<'a> { nested -= 1; if nested == 0 { formatted_value_piece.push(next); - spec_constructor.extend( - FStringParser::new( - &format!("{{{}}}", formatted_value_piece), - Location::default(), - &self.recurse_lvl + 1, - ) - .parse()?, + let values = FStringParser::new( + &formatted_value_piece, + Location::default(), + &self.recurse_lvl + 1, + ) + .parse()?; + spec_constructor.push(values + .into_iter() + .exactly_one() + .expect("Expected formatted value to produce exactly one expression.") ); formatted_value_piece.clear(); } else { diff --git a/parser/src/snapshots/rustpython_parser__fstring__tests__fstring_parse_selfdocumenting_base.snap b/parser/src/snapshots/rustpython_parser__fstring__tests__fstring_parse_selfdocumenting_base.snap index ac99159..14e7003 100644 --- a/parser/src/snapshots/rustpython_parser__fstring__tests__fstring_parse_selfdocumenting_base.snap +++ b/parser/src/snapshots/rustpython_parser__fstring__tests__fstring_parse_selfdocumenting_base.snap @@ -1,5 +1,5 @@ --- -source: parser/src/fstring.rs +source: compiler/parser/src/fstring.rs expression: parse_ast --- [ diff --git a/parser/src/snapshots/rustpython_parser__fstring__tests__fstring_parse_selfdocumenting_base_more.snap b/parser/src/snapshots/rustpython_parser__fstring__tests__fstring_parse_selfdocumenting_base_more.snap index 6ebbcca..0df5ab2 100644 --- a/parser/src/snapshots/rustpython_parser__fstring__tests__fstring_parse_selfdocumenting_base_more.snap +++ b/parser/src/snapshots/rustpython_parser__fstring__tests__fstring_parse_selfdocumenting_base_more.snap @@ -1,5 +1,5 @@ --- -source: parser/src/fstring.rs +source: compiler/parser/src/fstring.rs expression: parse_ast --- [ diff --git a/parser/src/snapshots/rustpython_parser__fstring__tests__fstring_parse_selfdocumenting_format.snap b/parser/src/snapshots/rustpython_parser__fstring__tests__fstring_parse_selfdocumenting_format.snap index 71b86cb..f5a518d 100644 --- a/parser/src/snapshots/rustpython_parser__fstring__tests__fstring_parse_selfdocumenting_format.snap +++ b/parser/src/snapshots/rustpython_parser__fstring__tests__fstring_parse_selfdocumenting_format.snap @@ -1,5 +1,5 @@ --- -source: parser/src/fstring.rs +source: compiler/parser/src/fstring.rs expression: parse_ast --- [ diff --git a/parser/src/snapshots/rustpython_parser__fstring__tests__parse_empty_fstring.snap b/parser/src/snapshots/rustpython_parser__fstring__tests__parse_empty_fstring.snap index 4156710..e561a7f 100644 --- a/parser/src/snapshots/rustpython_parser__fstring__tests__parse_empty_fstring.snap +++ b/parser/src/snapshots/rustpython_parser__fstring__tests__parse_empty_fstring.snap @@ -1,5 +1,5 @@ --- -source: parser/src/fstring.rs +source: compiler/parser/src/fstring.rs expression: "parse_fstring(\"\").unwrap()" --- [] diff --git a/parser/src/snapshots/rustpython_parser__fstring__tests__parse_fstring.snap b/parser/src/snapshots/rustpython_parser__fstring__tests__parse_fstring.snap index 3a05c32..7210ed3 100644 --- a/parser/src/snapshots/rustpython_parser__fstring__tests__parse_fstring.snap +++ b/parser/src/snapshots/rustpython_parser__fstring__tests__parse_fstring.snap @@ -1,5 +1,5 @@ --- -source: parser/src/fstring.rs +source: compiler/parser/src/fstring.rs expression: parse_ast --- [ diff --git a/parser/src/snapshots/rustpython_parser__fstring__tests__parse_fstring_equals.snap b/parser/src/snapshots/rustpython_parser__fstring__tests__parse_fstring_equals.snap index c7a6ddb..f9d6c4d 100644 --- a/parser/src/snapshots/rustpython_parser__fstring__tests__parse_fstring_equals.snap +++ b/parser/src/snapshots/rustpython_parser__fstring__tests__parse_fstring_equals.snap @@ -1,5 +1,5 @@ --- -source: parser/src/fstring.rs +source: compiler/parser/src/fstring.rs expression: parse_ast --- [ diff --git a/parser/src/snapshots/rustpython_parser__fstring__tests__parse_fstring_nested_spec.snap b/parser/src/snapshots/rustpython_parser__fstring__tests__parse_fstring_nested_spec.snap index e71cb7c..a0262f1 100644 --- a/parser/src/snapshots/rustpython_parser__fstring__tests__parse_fstring_nested_spec.snap +++ b/parser/src/snapshots/rustpython_parser__fstring__tests__parse_fstring_nested_spec.snap @@ -1,5 +1,5 @@ --- -source: parser/src/fstring.rs +source: compiler/parser/src/fstring.rs expression: parse_ast --- [ @@ -37,11 +37,20 @@ expression: parse_ast column: 0, }, custom: (), - node: Constant { - value: Str( - "{ spec}", - ), - kind: None, + node: FormattedValue { + value: Located { + location: Location { + row: 1, + column: 3, + }, + custom: (), + node: Name { + id: "spec", + ctx: Load, + }, + }, + conversion: 0, + format_spec: None, }, }, ], diff --git a/parser/src/snapshots/rustpython_parser__fstring__tests__parse_fstring_not_equals.snap b/parser/src/snapshots/rustpython_parser__fstring__tests__parse_fstring_not_equals.snap index d3ca5d3..f9223a5 100644 --- a/parser/src/snapshots/rustpython_parser__fstring__tests__parse_fstring_not_equals.snap +++ b/parser/src/snapshots/rustpython_parser__fstring__tests__parse_fstring_not_equals.snap @@ -1,5 +1,5 @@ --- -source: parser/src/fstring.rs +source: compiler/parser/src/fstring.rs expression: parse_ast --- [ diff --git a/parser/src/snapshots/rustpython_parser__fstring__tests__parse_fstring_not_nested_spec.snap b/parser/src/snapshots/rustpython_parser__fstring__tests__parse_fstring_not_nested_spec.snap index a5760e2..e15ac25 100644 --- a/parser/src/snapshots/rustpython_parser__fstring__tests__parse_fstring_not_nested_spec.snap +++ b/parser/src/snapshots/rustpython_parser__fstring__tests__parse_fstring_not_nested_spec.snap @@ -1,5 +1,5 @@ --- -source: parser/src/fstring.rs +source: compiler/parser/src/fstring.rs expression: parse_ast --- [ diff --git a/parser/src/snapshots/rustpython_parser__fstring__tests__parse_fstring_selfdoc_prec_space.snap b/parser/src/snapshots/rustpython_parser__fstring__tests__parse_fstring_selfdoc_prec_space.snap index 0e92a12..ae998f0 100644 --- a/parser/src/snapshots/rustpython_parser__fstring__tests__parse_fstring_selfdoc_prec_space.snap +++ b/parser/src/snapshots/rustpython_parser__fstring__tests__parse_fstring_selfdoc_prec_space.snap @@ -1,5 +1,5 @@ --- -source: parser/src/fstring.rs +source: compiler/parser/src/fstring.rs expression: parse_ast --- [ diff --git a/parser/src/snapshots/rustpython_parser__fstring__tests__parse_fstring_selfdoc_trailing_space.snap b/parser/src/snapshots/rustpython_parser__fstring__tests__parse_fstring_selfdoc_trailing_space.snap index 22bb47f..317bded 100644 --- a/parser/src/snapshots/rustpython_parser__fstring__tests__parse_fstring_selfdoc_trailing_space.snap +++ b/parser/src/snapshots/rustpython_parser__fstring__tests__parse_fstring_selfdoc_trailing_space.snap @@ -1,5 +1,5 @@ --- -source: parser/src/fstring.rs +source: compiler/parser/src/fstring.rs expression: parse_ast --- [ diff --git a/parser/src/snapshots/rustpython_parser__fstring__tests__parse_fstring_yield_expr.snap b/parser/src/snapshots/rustpython_parser__fstring__tests__parse_fstring_yield_expr.snap index a963739..cb7d720 100644 --- a/parser/src/snapshots/rustpython_parser__fstring__tests__parse_fstring_yield_expr.snap +++ b/parser/src/snapshots/rustpython_parser__fstring__tests__parse_fstring_yield_expr.snap @@ -1,5 +1,5 @@ --- -source: parser/src/fstring.rs +source: compiler/parser/src/fstring.rs expression: parse_ast --- [