Skip to main content

genemichaels_lib/
sg_root.rs

1use {
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}