wat_service 0.10.2

WebAssembly Text Format language service.
Documentation
use super::Diagnostic;
use crate::binder::{SymbolKind, SymbolTable};

const DIAGNOSTIC_CODE: &str = "undef";

pub fn check(db: &dyn salsa::Database, diagnostics: &mut Vec<Diagnostic>, symbol_table: &SymbolTable) {
    diagnostics.extend(
        symbol_table
            .symbols
            .values()
            .filter(|symbol| match symbol.kind {
                SymbolKind::Module
                | SymbolKind::Func
                | SymbolKind::Param
                | SymbolKind::Local
                | SymbolKind::Type
                | SymbolKind::GlobalDef
                | SymbolKind::MemoryDef
                | SymbolKind::TableDef
                | SymbolKind::BlockDef
                | SymbolKind::FieldDef
                | SymbolKind::TagDef
                | SymbolKind::DataDef
                | SymbolKind::ElemDef => false,
                SymbolKind::Call
                | SymbolKind::LocalRef
                | SymbolKind::TypeUse
                | SymbolKind::GlobalRef
                | SymbolKind::MemoryRef
                | SymbolKind::TableRef
                | SymbolKind::FieldRef
                | SymbolKind::BlockRef
                | SymbolKind::TagRef
                | SymbolKind::DataRef
                | SymbolKind::ElemRef => !symbol_table.resolved.contains_key(&symbol.key),
            })
            .map(|symbol| Diagnostic {
                range: symbol.key.text_range(),
                code: DIAGNOSTIC_CODE.into(),
                message: format!("cannot find {} `{}` in this scope", symbol.kind, symbol.idx.render(db)),
                ..Default::default()
            }),
    );
}