mod printer;
pub use printer::Formatter;
use crate::diag::CompileError;
use crate::lexer::{strip_comments, Lexer, TriviaLexer};
use crate::parser::Parser;
pub fn format(source: &str, filename: &str) -> Result<String, CompileError> {
let trivia_tokens: Vec<_> = TriviaLexer::new(source).collect();
let lexer = Lexer::new(source);
let tokens = strip_comments(lexer.collect());
let mut parser = Parser::new(&tokens, source, filename);
let ast = parser.parse_file()?;
let mut formatter = Formatter::new();
if !trivia_tokens.is_empty() {
for comment in &trivia_tokens[0].leading_comments {
formatter.write_comment(&comment.text);
}
}
formatter.format_file(&ast);
Ok(formatter.finish())
}
pub fn check_formatted(source: &str, filename: &str) -> Result<bool, CompileError> {
let formatted = format(source, filename)?;
Ok(source == formatted)
}