use pine_ast::Program;
use crate::passes;
use pine_ast::visitor::Visitor;
use pine_diagnostics::Diagnostic;
pub trait LintPass: Visitor {
fn name(&self) -> &'static str;
fn finish(&mut self) -> Vec<Diagnostic>;
}
fn all_passes() -> Vec<Box<dyn LintPass>> {
vec![
Box::new(passes::EqNa::default()),
Box::new(passes::ConstantCondition::default()),
]
}
pub fn lint(program: &Program) -> Vec<Diagnostic> {
lint_with(program, all_passes())
}
pub fn lint_with(program: &Program, mut passes: Vec<Box<dyn LintPass>>) -> Vec<Diagnostic> {
let mut diagnostics = Vec::new();
for pass in &mut passes {
pass.visit_program(program);
diagnostics.extend(pass.finish());
}
diagnostics.sort_by_key(|d| d.pos.unwrap_or((u32::MAX, u32::MAX)));
diagnostics
}