1mod code;
2pub mod config;
3mod format;
4pub(crate) mod post_format_hooks;
5pub(crate) mod pre_format_hooks;
6
7use crate::code::Code;
8use crate::format::DocBuffer;
9use crate::format::Mode;
10use log::debug;
11use log::trace;
12use parser::ast::Expression;
13use post_format_hooks::trim_line_endings;
14use post_format_hooks::trim_trailing_line;
15use std::collections::VecDeque;
16
17pub fn format_code<T: config::FormattingConfig>(
18 mut expression: Expression,
19 formatting_config: &T,
20) -> String {
21 debug!("Starting formatting");
22 let mut pre_format: Vec<fn(&mut Expression<'_>)> = vec![];
24 if formatting_config.strip_suffix_whitespace_in_function_defs() {
25 pre_format.push(pre_format_hooks::remove_trailing_whitespace_from_function_defs);
26 }
27
28 for hook in pre_format {
29 hook(&mut expression);
30 }
31
32 debug!("Transforming to docs");
34 let mut doc_ref = 0usize;
35 let mut docs: VecDeque<_> = VecDeque::from([(
36 0i32,
37 Mode::Flat,
38 expression.to_docs(formatting_config, &mut doc_ref),
39 )]);
40 trace!("Config: {}", formatting_config);
41 trace!("Docs: {}", DocBuffer(&docs));
42
43 debug!("Transforming to simple docs");
45 use std::collections::HashSet;
46 let mut broken_docs = HashSet::default();
47 let simple_docs = format::it_format_to_sdoc(0, &mut docs, formatting_config, &mut broken_docs);
48 trace!("Simple docs: {:?}", simple_docs);
49
50 debug!("Formatting to string");
52 let mut formatted = format::it_simple_doc_to_string(&simple_docs);
53
54 debug!("Post-format hooks");
56 let post_format_hooks = vec![trim_line_endings, trim_trailing_line];
57 for hook in post_format_hooks {
58 formatted = hook(formatted);
59 }
60
61 debug!("Finished formatting");
62 formatted
63}