11use super :: constant:: { Constant , ConstantLiteral } ;
22use super :: * ;
33
4- fn ruff_fstring_value_into_iter (
5- mut fstring_value : ruff:: FStringValue ,
6- ) -> impl Iterator < Item = ruff:: FStringPart > + ' static {
7- let default = ruff:: FStringPart :: FString ( ruff:: FString {
8- node_index : Default :: default ( ) ,
9- range : Default :: default ( ) ,
10- elements : Default :: default ( ) ,
11- flags : ruff:: FStringFlags :: empty ( ) ,
12- } ) ;
13- ( 0 ..fstring_value. as_slice ( ) . len ( ) ) . map ( move |i| {
14- let tmp = fstring_value. iter_mut ( ) . nth ( i) . unwrap ( ) ;
15- core:: mem:: replace ( tmp, default. clone ( ) )
16- } )
17- }
18-
194fn ruff_fstring_element_into_iter (
205 mut fstring_element : ruff:: InterpolatedStringElements ,
216) -> impl Iterator < Item = ruff:: InterpolatedStringElement > + ' static {
@@ -32,31 +17,6 @@ fn ruff_fstring_element_into_iter(
3217 } )
3318}
3419
35- fn fstring_part_to_joined_str_part ( fstring_part : ruff:: FStringPart ) -> Vec < JoinedStrPart > {
36- match fstring_part {
37- ruff:: FStringPart :: Literal ( ruff:: StringLiteral {
38- range,
39- value,
40- flags,
41- node_index : _,
42- } ) => {
43- vec ! [ JoinedStrPart :: Constant ( Constant :: new_str(
44- value,
45- flags. prefix( ) ,
46- range,
47- ) ) ]
48- }
49- ruff:: FStringPart :: FString ( ruff:: FString {
50- range : _,
51- elements,
52- flags : _, // TODO
53- node_index : _,
54- } ) => ruff_fstring_element_into_iter ( elements)
55- . map ( ruff_fstring_element_to_joined_str_part)
56- . collect ( ) ,
57- }
58- }
59-
6020fn ruff_fstring_element_to_joined_str_part (
6121 element : ruff:: InterpolatedStringElement ,
6222) -> JoinedStrPart {
@@ -357,48 +317,51 @@ pub(super) fn fstring_to_object(
357317) -> PyObjectRef {
358318 let ruff:: ExprFString {
359319 range,
360- value,
320+ mut value,
361321 node_index : _,
362322 } = expression;
363- let values: Vec < _ > = ruff_fstring_value_into_iter ( value)
364- . flat_map ( fstring_part_to_joined_str_part)
365- . collect ( ) ;
366- let values = values. into_boxed_slice ( ) ;
367- let c = JoinedStr { range, values } ;
368- c. ast_to_object ( vm, source_file)
369- }
370-
371- // ===== TString (Template String) Support =====
372-
373- fn ruff_tstring_value_into_iter (
374- mut tstring_value : ruff:: TStringValue ,
375- ) -> impl Iterator < Item = ruff:: TString > + ' static {
376- let default = ruff:: TString {
323+ let default_part = ruff:: FStringPart :: FString ( ruff:: FString {
377324 node_index : Default :: default ( ) ,
378325 range : Default :: default ( ) ,
379326 elements : Default :: default ( ) ,
380- flags : ruff:: TStringFlags :: empty ( ) ,
327+ flags : ruff:: FStringFlags :: empty ( ) ,
328+ } ) ;
329+ let mut values = Vec :: new ( ) ;
330+ for i in 0 ..value. as_slice ( ) . len ( ) {
331+ let part = core:: mem:: replace ( value. iter_mut ( ) . nth ( i) . unwrap ( ) , default_part. clone ( ) ) ;
332+ match part {
333+ ruff:: FStringPart :: Literal ( ruff:: StringLiteral {
334+ range,
335+ value,
336+ flags,
337+ node_index : _,
338+ } ) => {
339+ values. push ( JoinedStrPart :: Constant ( Constant :: new_str (
340+ value,
341+ flags. prefix ( ) ,
342+ range,
343+ ) ) ) ;
344+ }
345+ ruff:: FStringPart :: FString ( ruff:: FString {
346+ range : _,
347+ elements,
348+ flags : _,
349+ node_index : _,
350+ } ) => {
351+ for element in ruff_fstring_element_into_iter ( elements) {
352+ values. push ( ruff_fstring_element_to_joined_str_part ( element) ) ;
353+ }
354+ }
355+ }
356+ }
357+ let c = JoinedStr {
358+ range,
359+ values : values. into_boxed_slice ( ) ,
381360 } ;
382- ( 0 ..tstring_value. as_slice ( ) . len ( ) ) . map ( move |i| {
383- let tmp = tstring_value. iter_mut ( ) . nth ( i) . unwrap ( ) ;
384- core:: mem:: replace ( tmp, default. clone ( ) )
385- } )
361+ c. ast_to_object ( vm, source_file)
386362}
387363
388- fn tstring_to_template_str_parts (
389- tstring : ruff:: TString ,
390- source_file : & SourceFile ,
391- ) -> Vec < TemplateStrPart > {
392- let ruff:: TString {
393- range : _,
394- elements,
395- flags : _,
396- node_index : _,
397- } = tstring;
398- ruff_fstring_element_into_iter ( elements)
399- . map ( |e| ruff_tstring_element_to_template_str_part ( e, source_file) )
400- . collect ( )
401- }
364+ // ===== TString (Template String) Support =====
402365
403366fn ruff_tstring_element_to_template_str_part (
404367 element : ruff:: InterpolatedStringElement ,
@@ -606,13 +569,28 @@ pub(super) fn tstring_to_object(
606569) -> PyObjectRef {
607570 let ruff:: ExprTString {
608571 range,
609- value,
572+ mut value,
610573 node_index : _,
611574 } = expression;
612- let values: Vec < _ > = ruff_tstring_value_into_iter ( value)
613- . flat_map ( |p| tstring_to_template_str_parts ( p, source_file) )
614- . collect ( ) ;
615- let values = values. into_boxed_slice ( ) ;
616- let c = TemplateStr { range, values } ;
575+ let default_tstring = ruff:: TString {
576+ node_index : Default :: default ( ) ,
577+ range : Default :: default ( ) ,
578+ elements : Default :: default ( ) ,
579+ flags : ruff:: TStringFlags :: empty ( ) ,
580+ } ;
581+ let mut values = Vec :: new ( ) ;
582+ for i in 0 ..value. as_slice ( ) . len ( ) {
583+ let tstring = core:: mem:: replace ( value. iter_mut ( ) . nth ( i) . unwrap ( ) , default_tstring. clone ( ) ) ;
584+ for element in ruff_fstring_element_into_iter ( tstring. elements ) {
585+ values. push ( ruff_tstring_element_to_template_str_part (
586+ element,
587+ source_file,
588+ ) ) ;
589+ }
590+ }
591+ let c = TemplateStr {
592+ range,
593+ values : values. into_boxed_slice ( ) ,
594+ } ;
617595 c. ast_to_object ( vm, source_file)
618596}
0 commit comments