genemichaels_lib/
sg_root.rs1use {
2 crate::{
3 new_sg,
4 sg_general::{
5 append_statement_list_raw,
6 new_sg_outer_attrs,
7 },
8 Alignment,
9 Formattable,
10 MakeSegsState,
11 SplitGroupIdx,
12 },
13 quote::ToTokens,
14 syn::{
15 spanned::Spanned,
16 AttrStyle,
17 File,
18 },
19};
20
21impl Formattable for File {
22 fn make_segs(&self, out: &mut MakeSegsState, base_indent: &Alignment) -> SplitGroupIdx {
23 fn build_inner(out: &mut MakeSegsState, base_indent: &Alignment, ast: &File) -> SplitGroupIdx {
24 new_sg_outer_attrs(
25 out,
26 base_indent,
27 &ast.attrs,
28 ast.span(),
29 |out: &mut MakeSegsState, base_indent: &Alignment| {
30 let mut sg = new_sg(out);
31 append_statement_list_raw(out, base_indent, &mut sg, Some(&ast.attrs), &ast.items);
32 sg.build(out)
33 },
34 )
35 }
36
37 if let Some(shebang) = &self.shebang {
38 let mut sg = new_sg(out);
39 sg.seg(out, shebang);
40 sg.split_always(out, base_indent.clone(), true);
41 sg.split_always(out, base_indent.clone(), true);
42 sg.child(build_inner(out, base_indent, self));
43 sg.build(out)
44 } else if let Some(text) = 'res_rustfmt_skip: {
45 for attr in &self.attrs {
46 if matches!(&attr.style, AttrStyle::Outer) {
47 continue;
48 }
49 if attr.meta.to_token_stream().to_string().contains("rustfmt :: skip") {
50 break 'res_rustfmt_skip self.span().source_text();
51 }
52 }
53 break 'res_rustfmt_skip None;
54 } {
55 out.whitespaces.clear();
56 let mut sg = new_sg(out);
57 sg.seg(out, text);
58 sg.build(out)
59 } else {
60 build_inner(out, base_indent, self)
61 }
62 }
63
64 fn has_attrs(&self) -> bool {
65 !self.attrs.is_empty()
66 }
67}