use swc_common::{GLOBALS, Globals};
use dprint_core::*;
use dprint_core::configuration::{resolve_new_line_kind};
use std::path::PathBuf;
use super::parsing::parse;
use super::swc::parse_swc_ast;
use super::configuration::Configuration;
pub struct Formatter {
globals: Globals,
config: Configuration,
}
impl Formatter {
pub fn new(config: Configuration) -> Self {
Formatter {
globals: Globals::new(),
config,
}
}
pub fn format_text(&self, file_path: &PathBuf, file_text: &str) -> Result<String, String> {
return self.run(|| {
if has_ignore_comment(file_text) {
return Ok(String::from(file_text));
}
let parsed_source_file = parse_swc_ast(&file_path, &file_text)?;
let print_items = parse(parsed_source_file, &self.config);
Ok(print(print_items, PrintOptions {
indent_width: self.config.indent_width,
max_width: self.config.line_width,
use_tabs: self.config.use_tabs,
new_line_text: resolve_new_line_kind(file_text, self.config.new_line_kind),
}))
});
fn has_ignore_comment(file_text: &str) -> bool {
let mut iterator = super::utils::CharIterator::new(file_text.chars());
iterator.skip_whitespace();
if iterator.move_next() != Some('/') { return false; }
match iterator.move_next() {
Some('/') | Some('*') => {},
_ => return false,
}
iterator.skip_whitespace();
iterator.check_text("dprint-ignore-file")
}
}
fn run<F, TReturn>(&self, action: F) -> TReturn where F: FnOnce() -> TReturn {
GLOBALS.set(&self.globals, action)
}
}