@@ -91,52 +91,56 @@ impl<'a> FStringParser<'a> {
9191 }
9292
9393 ':' if delims. is_empty ( ) => {
94- let mut nested = false ;
9594 let mut in_nested = false ;
96- let mut spec_expression = String :: new ( ) ;
95+ let mut spec_constructor = Vec :: new ( ) ;
96+ let mut constant_piece = String :: new ( ) ;
97+ let mut formatted_value_piece = String :: new ( ) ;
9798 while let Some ( & next) = self . chars . peek ( ) {
9899 match next {
100+ '{' if in_nested => return Err ( ExpressionNestedTooDeeply ) ,
101+ '}' if in_nested => {
102+ in_nested = false ;
103+ spec_constructor. push ( self . expr ( ExprKind :: FormattedValue {
104+ value :
105+ Box :: new (
106+ parse_fstring_expr ( & formatted_value_piece) . map_err (
107+ |e| InvalidExpression ( Box :: new ( e. error ) ) ,
108+ ) ?,
109+ ) ,
110+ conversion : None ,
111+ format_spec : None ,
112+ } ) ) ;
113+ formatted_value_piece. clear ( ) ;
114+ }
115+ _ if in_nested => {
116+ formatted_value_piece. push ( next) ;
117+ }
99118 '{' => {
100- if in_nested {
101- return Err ( ExpressionNestedTooDeeply ) ;
102- }
103119 in_nested = true ;
104- nested = true ;
105- self . chars . next ( ) ;
106- continue ;
120+ spec_constructor. push ( self . expr ( ExprKind :: Constant {
121+ value : constant_piece. to_owned ( ) . into ( ) ,
122+ kind : None ,
123+ } ) ) ;
124+ constant_piece. clear ( ) ;
107125 }
108- '}' => {
109- if in_nested {
110- in_nested = false ;
111- self . chars . next ( ) ;
112- }
113- break ;
126+ '}' => break ,
127+ _ => {
128+ constant_piece. push ( next) ;
114129 }
115- _ => ( ) ,
116130 }
117- spec_expression. push ( next) ;
118131 self . chars . next ( ) ;
119132 }
133+ spec_constructor. push ( self . expr ( ExprKind :: Constant {
134+ value : constant_piece. to_owned ( ) . into ( ) ,
135+ kind : None ,
136+ } ) ) ;
137+ constant_piece. clear ( ) ;
120138 if in_nested {
121139 return Err ( UnclosedLbrace ) ;
122140 }
123- spec = Some ( if nested {
124- Box :: new (
125- self . expr ( ExprKind :: FormattedValue {
126- value : Box :: new (
127- parse_fstring_expr ( & spec_expression)
128- . map_err ( |e| InvalidExpression ( Box :: new ( e. error ) ) ) ?,
129- ) ,
130- conversion : None ,
131- format_spec : None ,
132- } ) ,
133- )
134- } else {
135- Box :: new ( self . expr ( ExprKind :: Constant {
136- value : spec_expression. to_owned ( ) . into ( ) ,
137- kind : None ,
138- } ) )
139- } )
141+ spec = Some ( Box :: new ( self . expr ( ExprKind :: JoinedStr {
142+ values : spec_constructor,
143+ } ) ) )
140144 }
141145 '(' | '{' | '[' => {
142146 expression. push ( ch) ;
0 commit comments