rust-analyzer/crates/hir_def/src/body/tests.rs

103 lines
2.2 KiB
Rust
Raw Normal View History

mod block;
2021-02-09 16:22:57 +00:00
use base_db::{fixture::WithFixture, SourceDatabase};
use expect_test::Expect;
2020-10-23 17:27:04 +00:00
2021-02-09 16:22:57 +00:00
use crate::{test_db::TestDB, ModuleDefId};
2020-10-23 17:27:04 +00:00
use super::*;
fn lower(ra_fixture: &str) -> Arc<Body> {
2021-01-21 19:35:36 +00:00
let db = crate::test_db::TestDB::with_files(ra_fixture);
2020-10-23 17:27:04 +00:00
let krate = db.crate_graph().iter().next().unwrap();
let def_map = db.crate_def_map(krate);
2021-01-21 19:35:36 +00:00
let mut fn_def = None;
'outer: for (_, module) in def_map.modules() {
for decl in module.scope.declarations() {
match decl {
ModuleDefId::FunctionId(it) => {
fn_def = Some(it);
break 'outer;
}
_ => {}
}
}
}
db.body(fn_def.unwrap().into())
2020-10-23 17:27:04 +00:00
}
fn check_diagnostics(ra_fixture: &str) {
let db: TestDB = TestDB::with_files(ra_fixture);
db.check_diagnostics();
}
fn block_def_map_at(ra_fixture: &str) -> String {
let (db, position) = crate::test_db::TestDB::with_position(ra_fixture);
2021-02-09 16:22:57 +00:00
let module = db.module_at_position(position);
module.def_map(&db).dump(&db)
}
2021-04-21 15:57:45 +00:00
fn check_block_scopes_at(ra_fixture: &str, expect: Expect) {
let (db, position) = crate::test_db::TestDB::with_position(ra_fixture);
let module = db.module_at_position(position);
let actual = module.def_map(&db).dump_block_scopes(&db);
expect.assert_eq(&actual);
}
fn check_at(ra_fixture: &str, expect: Expect) {
let actual = block_def_map_at(ra_fixture);
expect.assert_eq(&actual);
}
2020-10-23 17:27:04 +00:00
#[test]
fn your_stack_belongs_to_me() {
2021-03-08 20:19:44 +00:00
cov_mark::check!(your_stack_belongs_to_me);
2020-10-23 17:27:04 +00:00
lower(
"
macro_rules! n_nuple {
($e:tt) => ();
($($rest:tt)*) => {{
(n_nuple!($($rest)*)None,)
}};
}
fn main() { n_nuple!(1,2,3); }
",
);
}
2021-01-21 19:35:36 +00:00
#[test]
fn macro_resolve() {
// Regression test for a path resolution bug introduced with inner item handling.
lower(
r"
macro_rules! vec {
() => { () };
($elem:expr; $n:expr) => { () };
($($x:expr),+ $(,)?) => { () };
}
mod m {
fn outer() {
let _ = vec![FileSet::default(); self.len()];
}
}
",
);
}
#[test]
fn unresolved_macro_diag() {
check_diagnostics(
r#"
fn f() {
m!();
//^^^^ UnresolvedMacroCall
}
"#,
);
}