veryl-analyzer 0.20.0

A modern hardware description language
Documentation
use crate::analyzer_error::AnalyzerError;
use crate::unsafe_table;
use veryl_parser::ParolError;
use veryl_parser::veryl_grammar_trait::*;
use veryl_parser::veryl_walker::{Handler, HandlerPoint};

#[derive(Default)]
pub struct CheckUnsafe {
    pub errors: Vec<AnalyzerError>,
    point: HandlerPoint,
}

impl CheckUnsafe {
    pub fn new() -> Self {
        Self::default()
    }
}

impl Handler for CheckUnsafe {
    fn set_point(&mut self, p: HandlerPoint) {
        self.point = p;
    }
}

impl VerylGrammarTrait for CheckUnsafe {
    fn unsafe_block(&mut self, arg: &UnsafeBlock) -> Result<(), ParolError> {
        match self.point {
            HandlerPoint::Before => {
                let value: Result<crate::r#unsafe::Unsafe, crate::r#unsafe::UnsafeError> =
                    arg.try_into();

                match value {
                    Ok(value) => {
                        unsafe_table::begin(arg.r#unsafe.unsafe_token.token, Some(value));
                    }
                    Err(err) => {
                        unsafe_table::begin(arg.r#unsafe.unsafe_token.token, None);
                        match err {
                            crate::r#unsafe::UnsafeError::UnknownUnsafe => {
                                self.errors.push(AnalyzerError::unknown_unsafe(
                                    &arg.identifier.identifier_token.to_string(),
                                    &arg.identifier.as_ref().into(),
                                ));
                            }
                        }
                    }
                }
            }
            HandlerPoint::After => {
                unsafe_table::end(arg.r_brace.r_brace_token.token);
            }
        }
        Ok(())
    }
}