wat_service 0.3.0

WebAssembly Text Format language service.
Documentation
use crate::uri::InternUri;
use line_index::LineIndex;
use rowan::GreenNode;
use std::sync::Arc;
use wat_parser::{parse_to_green, SyntaxError};

#[salsa::query_group(SyntaxTree)]
pub(crate) trait SyntaxTreeCtx: salsa::Database {
    #[salsa::input]
    fn source(&self, uri: InternUri) -> String;

    #[salsa::memoized]
    #[salsa::invoke(get_line_index)]
    fn line_index(&self, uri: InternUri) -> Arc<LineIndex>;

    #[salsa::memoized]
    fn parse(&self, uri: InternUri) -> (GreenNode, Arc<Vec<SyntaxError>>);

    #[salsa::memoized]
    fn root(&self, uri: InternUri) -> GreenNode;
}

fn get_line_index(db: &dyn SyntaxTreeCtx, uri: InternUri) -> Arc<LineIndex> {
    Arc::new(LineIndex::new(&db.source(uri)))
}

fn parse(db: &dyn SyntaxTreeCtx, uri: InternUri) -> (GreenNode, Arc<Vec<SyntaxError>>) {
    let source = db.source(uri);
    let (green, errors) = parse_to_green(&source);
    (green, Arc::new(errors))
}

fn root(db: &dyn SyntaxTreeCtx, uri: InternUri) -> GreenNode {
    db.parse(uri).0
}