pub mod ast;
pub mod diag;
pub mod fmt;
pub mod lexer;
pub mod parser;
pub mod span;
pub use diag::{Diagnostic, Severity};
pub use span::{SourceFile, Span};
pub struct Parsed {
pub file: ast::File,
pub diagnostics: Vec<Diagnostic>,
}
impl Parsed {
pub fn has_errors(&self) -> bool {
self.diagnostics
.iter()
.any(|d| d.severity == Severity::Error)
}
}
pub fn parse_source(src: &str) -> Parsed {
let lexed = lexer::lex(src);
let parsed = parser::parse(src, lexed.tokens);
let mut diagnostics = lexed.diagnostics;
diagnostics.extend(parsed.diagnostics);
diagnostics.sort_by_key(|d| {
(
d.primary_span().map(|s| s.start).unwrap_or(usize::MAX),
d.code,
)
});
Parsed {
file: parsed.file,
diagnostics,
}
}