Skip to content

Commit b1114b4

Browse files
committed
simplify ast/string.rs
1 parent c7d2fda commit b1114b4

File tree

1 file changed

+58
-80
lines changed

1 file changed

+58
-80
lines changed

crates/vm/src/stdlib/ast/string.rs

Lines changed: 58 additions & 80 deletions
Original file line numberDiff line numberDiff line change
@@ -1,21 +1,6 @@
11
use super::constant::{Constant, ConstantLiteral};
22
use 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-
194
fn 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-
6020
fn 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

403366
fn 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

Comments
 (0)