veryl-analyzer 0.20.0

A modern hardware description language
Documentation
use crate::analyzer_error::MismatchTypeKind;
use crate::conv::Context;
use crate::conv::checker::generic::check_generic_refereence;
use crate::{AnalyzerError, symbol_table};
use veryl_parser::veryl_grammar_trait::*;

#[derive(Clone, Copy, PartialEq, Eq)]
pub enum AliasType {
    Module,
    ProtoModule,
    Interface,
    ProtoInterface,
    Package,
    ProtoPackage,
}

pub fn check_alias_target(context: &mut Context, value: &ScopedIdentifier, r#type: AliasType) {
    if let Ok(symbol) = symbol_table::resolve(value) {
        let symbol = symbol.found;

        let expected = match r#type {
            AliasType::Module if !symbol.is_module(false) => Some("module"),
            AliasType::ProtoModule if !symbol.is_proto_module(true) => Some("proto module"),
            AliasType::Interface if !symbol.is_interface(false) => Some("interface"),
            AliasType::ProtoInterface if !symbol.is_proto_interface(true, false) => {
                Some("proto interface")
            }
            AliasType::Package if !symbol.is_package(false) => Some("package"),
            AliasType::ProtoPackage if !symbol.is_proto_package(true) => Some("proto package"),
            _ => None,
        };

        if let Some(expected) = expected {
            context.insert_error(AnalyzerError::mismatch_type(
                MismatchTypeKind::SymbolKind {
                    name: symbol.token.to_string(),
                    expected: expected.to_string(),
                    actual: symbol.kind.to_kind_name(),
                },
                &value.identifier().token.into(),
            ));
        }
    }

    check_generic_refereence(context, &value.into());
}