Skip to main content

tergo_formatter/
lib.rs

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    // Pre formatting hooks
23    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    // Doc stage
33    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    // Simple docs stage
44    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    // Printing to string
51    debug!("Formatting to string");
52    let mut formatted = format::it_simple_doc_to_string(&simple_docs);
53
54    // Post-format hooks
55    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}