lisette-semantics 0.4.0

Little language inspired by Rust that compiles to Go
Documentation
use diagnostics::LocalSink;
use syntax::program::UnusedInfo;

use crate::context::AnalysisContext;
use crate::facts::Facts;

pub(crate) mod checks;
mod deferred;
mod fact_producers;
mod lints;
pub(crate) mod walk;

pub use lints::Lint;

pub(crate) const PARALLEL_THRESHOLD: usize = 4;

pub fn run(
    analysis: &AnalysisContext,
    facts: &mut Facts,
    sink: &LocalSink,
    unused: &mut UnusedInfo,
    run_lints: bool,
) {
    let facts_ref: &Facts = facts;
    let (((checks_diagnostics, pattern_issues), producer_facts), lint_outputs) = rayon::join(
        || {
            rayon::join(
                || checks::run_all(analysis, facts_ref),
                || fact_producers::run_all(analysis),
            )
        },
        || {
            run_lints.then(|| {
                rayon::join(
                    || lints::ast_walk::run(analysis, facts_ref),
                    || lints::ref_graph::run(analysis, facts_ref),
                )
            })
        },
    );

    facts.pattern_issues = pattern_issues;
    facts.absorb_local_facts(producer_facts);

    sink.extend(checks_diagnostics);
    deferred::run(facts, sink);
    if run_lints {
        lints::from_facts::run(facts, unused, sink);
    }
    if let Some((ast_walk_diagnostics, (ref_graph_diagnostics, ref_graph_unused))) = lint_outputs {
        sink.extend(ast_walk_diagnostics);
        sink.extend(ref_graph_diagnostics);
        unused.merge(ref_graph_unused);
    }
}