blues-lsp 0.1.0

LSP language server for the Bluespec SystemVerilog language
Documentation
use std::sync::Arc;

use arcstr::ArcStr;

use crate::{
    project::{file::FileContents, PkgHandle},
    syntax::{
        buildctx::BuildCtx, cst::tree::Cst, lexer::bsv::BsvLexer, location::ROOT_ORIGIN, streams::TextCharStream
    },
};

use super::{bsv, parser::Parser};

pub fn parse_output(source: &str, rule: impl Fn(&mut Parser)) -> String {
    let file = Arc::new(FileContents::new(ArcStr::from(source)));

    let mut ctx = BuildCtx::new(PkgHandle::default(), file.clone());

    let mut tokens = Vec::new();
    let mut lexer = BsvLexer::new(&mut ctx);
    lexer.run(
        TextCharStream::new(file.chunks(ROOT_ORIGIN).iter()),
        &mut tokens,
    );

    let mut parser = Parser::new(&mut ctx, tokens.clone());
    rule(&mut parser);
    let nodes = parser.make_tree();
    let cst = Cst::new(nodes);

    format!("{:?}\n{}", ctx.diagnostics, cst)
}

macro_rules! snapshot {
    ($name:ident, $fun:expr, $text:literal) => {
        #[test]
        pub fn $name() {
            insta::assert_snapshot!(parse_output($text, $fun))
        }
    };
}

use bsv::*;

snapshot!(
    package_empty_1,
    package,
    r#"
"#
);

snapshot!(
    package_empty_2,
    package,
    r#"
pacakge Foo; 
endpackage: Foo
"#
);

snapshot!(
    package_helloworld,
    package,
    r#"
pacakge Hello;

(* synthesize *)
module mTb;
    rule hello;
        $display("Hello world! %d", 42);
        $finish;
    endrule
endmodule

endpackage: Hello
"#
);