#![warn(missing_docs)]
#![forbid(unsafe_code)]
mod doc;
mod error;
#[cfg(any(test, feature = "debug-dump"))]
mod colored_writer;
#[cfg(any(test, feature = "debug-dump"))]
mod dump;
mod ast;
mod format;
mod lexer;
mod normalize;
mod parser;
pub use error::ParseError;
pub const VERSION: &str = env!("CARGO_PKG_VERSION");
use doc::{Emit, RenderConfig};
pub(crate) use ast::File;
pub(crate) use error::Result;
#[derive(Debug, Clone)]
#[non_exhaustive]
pub struct Options {
pub width: usize,
pub indent: usize,
}
impl Default for Options {
fn default() -> Self {
Self {
width: 100,
indent: 2,
}
}
}
#[doc(hidden)] pub fn parse(source: &str) -> Result<File> {
let mut parser = parser::Parser::new(source)?;
parser.parse_file()
}
#[doc(hidden)]
pub fn parse_normalized(source: &str) -> Result<File> {
let mut ast = parse(source)?;
normalize::normalize_file(&mut ast);
Ok(ast)
}
pub fn format(source: &str) -> Result<String> {
format_with(source, &Options::default())
}
pub fn format_with(source: &str, opts: &Options) -> Result<String> {
let ast = parse(source)?;
let mut doc = doc::Doc::new();
ast.emit(&mut doc);
let config = RenderConfig {
width: opts.width,
indent_width: opts.indent,
};
let output = doc.render(&config);
Ok(output)
}
#[cfg(any(test, feature = "debug-dump"))]
pub(crate) fn ast_to_ir(ast: &File) -> doc::IR {
let mut doc = doc::Doc::new();
ast.emit(&mut doc);
doc::IR(doc.fixup())
}
#[cfg(any(test, feature = "debug-dump"))]
#[doc(hidden)]
pub fn format_ast(source: &str) -> Result<String> {
use dump::Dump;
let ast = parse(source)?;
let mut writer = colored_writer::ColoredWriter::new(source);
ast.dump(&mut writer);
Ok(writer.finish())
}
#[cfg(any(test, feature = "debug-dump"))]
#[doc(hidden)]
pub fn format_ir(source: &str) -> Result<String> {
use dump::Dump;
let ast = parse(source)?;
let ir = ast_to_ir(&ast);
let mut writer = colored_writer::ColoredWriter::new(source);
ir.dump(&mut writer);
Ok(writer.finish())
}
#[must_use]
pub fn format_error(source: &str, filename: Option<&str>, error: &ParseError) -> String {
let context = error::ErrorContext::new(source, filename);
format!("{}", error::render(&context, error))
}
#[cfg(test)]
mod ast_format_tests;
#[cfg(test)]
mod ir_format_tests;
#[cfg(test)]
mod regression_tests;
#[cfg(test)]
mod tests_common;