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
"#
);