lisette-semantics 0.2.16

Little language inspired by Rust that compiles to Go
Documentation
use diagnostics::LocalSink;
use rustc_hash::FxHashMap as HashMap;
use syntax::ast::{BindingId, Expression};

use crate::facts::BindingFact;
use crate::passes::lints::ast_walk::visitor::visit_ast;
use crate::store::Store;

use super::{
    const_naming, decimal_file_mode, duplicate_bindings, empty_infinite_loop, empty_range,
    enum_variant_value, index_out_of_bounds, irrefutable_patterns, nan_comparison, newtype,
    oversized_shift, predeclared_shadowing, pub_type_export, receivers, repeated_if_condition,
    stringer_signature, temp_producing, unchanging_loop_condition,
};

type NodeCheck = fn(&Expression, &LocalSink);

const NODE_CHECKS: &[NodeCheck] = &[
    nan_comparison::check,
    empty_range::check,
    empty_infinite_loop::check,
    oversized_shift::check,
    repeated_if_condition::check,
    index_out_of_bounds::check,
    decimal_file_mode::check,
    duplicate_bindings::check,
    irrefutable_patterns::check,
    receivers::check,
    stringer_signature::check,
    predeclared_shadowing::check,
    pub_type_export::check,
    temp_producing::check,
];

pub(crate) fn run(
    items: &[Expression],
    store: &Store,
    bindings: &HashMap<BindingId, BindingFact>,
    is_d_lis: bool,
    sink: &LocalSink,
) {
    visit_ast(
        items,
        &mut |expression| {
            for check in NODE_CHECKS {
                check(expression, sink);
            }
            newtype::check(expression, store, sink);
            enum_variant_value::check(expression, store, sink);
            unchanging_loop_condition::check(expression, bindings, sink);
            if !is_d_lis {
                const_naming::check(expression, sink);
            }
        },
        &mut |_| {},
    );
}