Cleanup incremental tests
diff --git a/crates/hir-def/src/nameres/tests/incremental.rs b/crates/hir-def/src/nameres/tests/incremental.rs
index 7a4ea62..858aa05 100644
--- a/crates/hir-def/src/nameres/tests/incremental.rs
+++ b/crates/hir-def/src/nameres/tests/incremental.rs
@@ -2,13 +2,13 @@
CrateDisplayName, CrateGraphBuilder, CrateName, CrateOrigin, CrateWorkspaceData,
DependencyBuilder, Env, RootQueryDb, SourceDatabase,
};
+use expect_test::{Expect, expect};
use intern::Symbol;
use span::Edition;
use test_fixture::WithFixture;
use triomphe::Arc;
use crate::{
- AdtId, ModuleDefId,
db::DefDatabase,
nameres::{crate_def_map, tests::TestDB},
};
@@ -16,29 +16,29 @@
fn check_def_map_is_not_recomputed(
#[rust_analyzer::rust_fixture] ra_fixture_initial: &str,
#[rust_analyzer::rust_fixture] ra_fixture_change: &str,
+ expecta: Expect,
+ expectb: Expect,
) {
let (mut db, pos) = TestDB::with_position(ra_fixture_initial);
let krate = db.fetch_test_crate();
- {
- let events = db.log_executed(|| {
+ execute_assert_events(
+ &db,
+ || {
crate_def_map(&db, krate);
- });
- assert!(
- format!("{events:?}").contains("crate_local_def_map"),
- "no crate def map computed:\n{events:#?}",
- )
- }
+ },
+ &[],
+ expecta,
+ );
db.set_file_text(pos.file_id.file_id(&db), ra_fixture_change);
- {
- let events = db.log_executed(|| {
+ execute_assert_events(
+ &db,
+ || {
crate_def_map(&db, krate);
- });
- assert!(
- !format!("{events:?}").contains("crate_local_def_map"),
- "crate def map invalidated:\n{events:#?}",
- )
- }
+ },
+ &[("crate_local_def_map", 0)],
+ expectb,
+ );
}
#[test]
@@ -104,15 +104,20 @@
Arc::ptr_eq(&all_crates_before, &all_crates_after),
"the all_crates list should not have been invalidated"
);
-
- let events = db.log_executed(|| {
- for &krate in db.all_crates().iter() {
- crate_def_map(&db, krate);
- }
- });
- let invalidated_def_maps =
- events.iter().filter(|event| event.contains("crate_local_def_map")).count();
- assert_eq!(invalidated_def_maps, 1, "{events:#?}")
+ execute_assert_events(
+ &db,
+ || {
+ for &krate in db.all_crates().iter() {
+ crate_def_map(&db, krate);
+ }
+ },
+ &[("crate_local_def_map", 1)],
+ expect![[r#"
+ [
+ "crate_local_def_map",
+ ]
+ "#]],
+ );
}
#[test]
@@ -152,6 +157,34 @@
#[cfg(never)]
fn no() {}
",
+ expect![[r#"
+ [
+ "crate_local_def_map",
+ "file_item_tree_query",
+ "ast_id_map_shim",
+ "parse_shim",
+ "real_span_map_shim",
+ "file_item_tree_query",
+ "ast_id_map_shim",
+ "parse_shim",
+ "real_span_map_shim",
+ "file_item_tree_query",
+ "ast_id_map_shim",
+ "parse_shim",
+ "real_span_map_shim",
+ "enum_variants_shim",
+ "enum_variants_with_diagnostics_shim",
+ ]
+ "#]],
+ expect![[r#"
+ [
+ "parse_shim",
+ "ast_id_map_shim",
+ "file_item_tree_query",
+ "real_span_map_shim",
+ "enum_variants_with_diagnostics_shim",
+ ]
+ "#]],
);
}
@@ -183,6 +216,41 @@
pub struct S {}
",
+ expect![[r#"
+ [
+ "crate_local_def_map",
+ "file_item_tree_query",
+ "ast_id_map_shim",
+ "parse_shim",
+ "real_span_map_shim",
+ "file_item_tree_query",
+ "ast_id_map_shim",
+ "parse_shim",
+ "real_span_map_shim",
+ "file_item_tree_query",
+ "ast_id_map_shim",
+ "parse_shim",
+ "real_span_map_shim",
+ "macro_def_shim",
+ "file_item_tree_query",
+ "ast_id_map_shim",
+ "parse_macro_expansion_shim",
+ "macro_arg_shim",
+ "decl_macro_expander_shim",
+ ]
+ "#]],
+ expect![[r#"
+ [
+ "parse_shim",
+ "ast_id_map_shim",
+ "file_item_tree_query",
+ "real_span_map_shim",
+ "macro_arg_shim",
+ "parse_macro_expansion_shim",
+ "ast_id_map_shim",
+ "file_item_tree_query",
+ ]
+ "#]],
);
}
@@ -206,6 +274,49 @@
#[proc_macros::identity]
fn f() { foo }
",
+ expect![[r#"
+ [
+ "crate_local_def_map",
+ "file_item_tree_query",
+ "ast_id_map_shim",
+ "parse_shim",
+ "real_span_map_shim",
+ "file_item_tree_query",
+ "ast_id_map_shim",
+ "parse_shim",
+ "real_span_map_shim",
+ "file_item_tree_query",
+ "ast_id_map_shim",
+ "parse_shim",
+ "real_span_map_shim",
+ "crate_local_def_map",
+ "proc_macros_for_crate_shim",
+ "file_item_tree_query",
+ "ast_id_map_shim",
+ "parse_shim",
+ "real_span_map_shim",
+ "macro_def_shim",
+ "file_item_tree_query",
+ "ast_id_map_shim",
+ "parse_macro_expansion_shim",
+ "expand_proc_macro_shim",
+ "macro_arg_shim",
+ "proc_macro_span_shim",
+ ]
+ "#]],
+ expect![[r#"
+ [
+ "parse_shim",
+ "ast_id_map_shim",
+ "file_item_tree_query",
+ "real_span_map_shim",
+ "macro_arg_shim",
+ "expand_proc_macro_shim",
+ "parse_macro_expansion_shim",
+ "ast_id_map_shim",
+ "file_item_tree_query",
+ ]
+ "#]],
);
}
@@ -287,6 +398,61 @@
#[derive(proc_macros::DeriveIdentity)]
pub struct S {}
",
+ expect![[r#"
+ [
+ "crate_local_def_map",
+ "file_item_tree_query",
+ "ast_id_map_shim",
+ "parse_shim",
+ "real_span_map_shim",
+ "file_item_tree_query",
+ "ast_id_map_shim",
+ "parse_shim",
+ "real_span_map_shim",
+ "file_item_tree_query",
+ "ast_id_map_shim",
+ "parse_shim",
+ "real_span_map_shim",
+ "macro_def_shim",
+ "file_item_tree_query",
+ "ast_id_map_shim",
+ "parse_macro_expansion_shim",
+ "macro_arg_shim",
+ "decl_macro_expander_shim",
+ "macro_def_shim",
+ "file_item_tree_query",
+ "ast_id_map_shim",
+ "parse_macro_expansion_shim",
+ "macro_arg_shim",
+ "decl_macro_expander_shim",
+ "crate_local_def_map",
+ "proc_macros_for_crate_shim",
+ "file_item_tree_query",
+ "ast_id_map_shim",
+ "parse_shim",
+ "real_span_map_shim",
+ "macro_def_shim",
+ "macro_def_shim",
+ "file_item_tree_query",
+ "ast_id_map_shim",
+ "parse_macro_expansion_shim",
+ "expand_proc_macro_shim",
+ "macro_arg_shim",
+ "proc_macro_span_shim",
+ ]
+ "#]],
+ expect![[r#"
+ [
+ "parse_shim",
+ "ast_id_map_shim",
+ "file_item_tree_query",
+ "real_span_map_shim",
+ "macro_arg_shim",
+ "macro_arg_shim",
+ "decl_macro_expander_shim",
+ "macro_arg_shim",
+ ]
+ "#]],
);
}
@@ -341,19 +507,46 @@
"#,
);
let krate = db.test_crate();
- {
- let events = db.log_executed(|| {
+ execute_assert_events(
+ &db,
+ || {
let crate_def_map = crate_def_map(&db, krate);
let (_, module_data) = crate_def_map.modules.iter().last().unwrap();
assert_eq!(module_data.scope.resolutions().count(), 4);
- });
- let n_recalculated_item_trees =
- events.iter().filter(|it| it.contains("file_item_tree_query")).count();
- assert_eq!(n_recalculated_item_trees, 6);
- let n_reparsed_macros =
- events.iter().filter(|it| it.contains("parse_macro_expansion_shim")).count();
- assert_eq!(n_reparsed_macros, 3);
- }
+ },
+ &[("file_item_tree_query", 6), ("parse_macro_expansion_shim", 3)],
+ expect![[r#"
+ [
+ "crate_local_def_map",
+ "file_item_tree_query",
+ "ast_id_map_shim",
+ "parse_shim",
+ "real_span_map_shim",
+ "file_item_tree_query",
+ "ast_id_map_shim",
+ "parse_shim",
+ "real_span_map_shim",
+ "file_item_tree_query",
+ "ast_id_map_shim",
+ "parse_shim",
+ "real_span_map_shim",
+ "macro_def_shim",
+ "file_item_tree_query",
+ "ast_id_map_shim",
+ "parse_macro_expansion_shim",
+ "macro_arg_shim",
+ "decl_macro_expander_shim",
+ "file_item_tree_query",
+ "ast_id_map_shim",
+ "parse_macro_expansion_shim",
+ "macro_arg_shim",
+ "file_item_tree_query",
+ "ast_id_map_shim",
+ "parse_macro_expansion_shim",
+ "macro_arg_shim",
+ ]
+ "#]],
+ );
let new_text = r#"
m!(X);
@@ -363,28 +556,31 @@
"#;
db.set_file_text(pos.file_id.file_id(&db), new_text);
- {
- let events = db.log_executed(|| {
+ execute_assert_events(
+ &db,
+ || {
let crate_def_map = crate_def_map(&db, krate);
let (_, module_data) = crate_def_map.modules.iter().last().unwrap();
assert_eq!(module_data.scope.resolutions().count(), 4);
- });
- let n_recalculated_item_trees =
- events.iter().filter(|it| it.contains("file_item_tree_query")).count();
- assert_eq!(n_recalculated_item_trees, 1, "{events:#?}");
- let n_reparsed_macros =
- events.iter().filter(|it| it.contains("parse_macro_expansion_shim")).count();
- assert_eq!(n_reparsed_macros, 0);
- }
+ },
+ &[("file_item_tree_query", 1), ("parse_macro_expansion_shim", 0)],
+ expect![[r#"
+ [
+ "parse_shim",
+ "ast_id_map_shim",
+ "file_item_tree_query",
+ "real_span_map_shim",
+ "macro_arg_shim",
+ "macro_arg_shim",
+ "macro_arg_shim",
+ ]
+ "#]],
+ );
}
#[test]
fn item_tree_prevents_reparsing() {
- // The `ItemTree` is used by both name resolution and the various queries in `adt.rs` and
- // `data.rs`. After computing the `ItemTree` and deleting the parse tree, we should be able to
- // run those other queries without triggering a reparse.
-
- let (db, pos) = TestDB::with_position(
+ let (mut db, pos) = TestDB::with_position(
r#"
pub struct S;
pub union U {}
@@ -399,53 +595,54 @@
pub type Ty = ();
"#,
);
- let krate = db.test_crate();
- {
- let events = db.log_executed(|| {
+
+ execute_assert_events(
+ &db,
+ || {
db.file_item_tree(pos.file_id.into());
- });
- let n_calculated_item_trees =
- events.iter().filter(|it| it.contains("file_item_tree_query")).count();
- assert_eq!(n_calculated_item_trees, 1, "{events:#?}");
- let n_parsed_files = events.iter().filter(|it| it.contains("parse")).count();
- assert_eq!(n_parsed_files, 1, "{events:#?}");
+ },
+ &[("file_item_tree_query", 1), ("parse", 1)],
+ expect![[r#"
+ [
+ "file_item_tree_query",
+ "ast_id_map_shim",
+ "parse_shim",
+ "real_span_map_shim",
+ ]
+ "#]],
+ );
+
+ let file_id = pos.file_id.file_id(&db);
+ let file_text = db.file_text(file_id).text(&db);
+ db.set_file_text(file_id, &format!("{file_text}\n"));
+
+ execute_assert_events(
+ &db,
+ || {
+ db.file_item_tree(pos.file_id.into());
+ },
+ &[("file_item_tree_query", 1), ("parse", 1)],
+ expect![[r#"
+ [
+ "parse_shim",
+ "ast_id_map_shim",
+ "file_item_tree_query",
+ "real_span_map_shim",
+ ]
+ "#]],
+ );
+}
+
+fn execute_assert_events(
+ db: &TestDB,
+ f: impl FnOnce(),
+ required: &[(&str, usize)],
+ expect: Expect,
+) {
+ let events = db.log_executed(f);
+ for (event, count) in required {
+ let n = events.iter().filter(|it| it.contains(event)).count();
+ assert_eq!(n, *count, "Expected {event} to be executed {count} times, but only got {n}");
}
-
- // FIXME(salsa-transition): bring this back
- // base_db::ParseQuery.in_db(&db).purge();
-
- {
- let events = db.log_executed(|| {
- let crate_def_map = crate_def_map(&db, krate);
- let (_, module_data) = crate_def_map.modules.iter().last().unwrap();
- assert_eq!(module_data.scope.resolutions().count(), 8);
- assert_eq!(module_data.scope.impls().count(), 1);
-
- for imp in module_data.scope.impls() {
- db.impl_signature(imp);
- }
-
- for (_, res) in module_data.scope.resolutions() {
- match res.values.map(|it| it.def).or(res.types.map(|it| it.def)).unwrap() {
- ModuleDefId::FunctionId(f) => _ = db.function_signature(f),
- ModuleDefId::AdtId(adt) => match adt {
- AdtId::StructId(it) => _ = db.struct_signature(it),
- AdtId::UnionId(it) => _ = db.union_signature(it),
- AdtId::EnumId(it) => _ = db.enum_signature(it),
- },
- ModuleDefId::ConstId(it) => _ = db.const_signature(it),
- ModuleDefId::StaticId(it) => _ = db.static_signature(it),
- ModuleDefId::TraitId(it) => _ = db.trait_signature(it),
- ModuleDefId::TraitAliasId(it) => _ = db.trait_alias_signature(it),
- ModuleDefId::TypeAliasId(it) => _ = db.type_alias_signature(it),
- ModuleDefId::EnumVariantId(_)
- | ModuleDefId::ModuleId(_)
- | ModuleDefId::MacroId(_)
- | ModuleDefId::BuiltinType(_) => unreachable!(),
- }
- }
- });
- let n_reparsed_files = events.iter().filter(|it| it.contains("parse(")).count();
- assert_eq!(n_reparsed_files, 0, "{events:?}");
- }
+ expect.assert_debug_eq(&events);
}
diff --git a/crates/hir-ty/src/tests/incremental.rs b/crates/hir-ty/src/tests/incremental.rs
index 74f6bbb..b45d8ba 100644
--- a/crates/hir-ty/src/tests/incremental.rs
+++ b/crates/hir-ty/src/tests/incremental.rs
@@ -1,4 +1,5 @@
use base_db::SourceDatabase;
+use expect_test::Expect;
use hir_def::{DefWithBodyId, ModuleDefId};
use test_fixture::WithFixture;
@@ -15,8 +16,9 @@
$01 + 1
}",
);
- {
- let events = db.log_executed(|| {
+ execute_assert_events(
+ &db,
+ || {
let module = db.module_for_file(pos.file_id.file_id(&db));
let crate_def_map = module.def_map(&db);
visit_module(&db, crate_def_map, module.local_id, &mut |def| {
@@ -24,9 +26,31 @@
db.infer(it.into());
}
});
- });
- assert!(format!("{events:?}").contains("infer_shim"))
- }
+ },
+ &[("infer_shim", 1)],
+ expect_test::expect![[r#"
+ [
+ "source_root_crates_shim",
+ "crate_local_def_map",
+ "file_item_tree_query",
+ "ast_id_map_shim",
+ "parse_shim",
+ "real_span_map_shim",
+ "infer_shim",
+ "function_signature_shim",
+ "function_signature_with_source_map_shim",
+ "attrs_shim",
+ "body_shim",
+ "body_with_source_map_shim",
+ "trait_environment_shim",
+ "return_type_impl_traits_shim",
+ "expr_scopes_shim",
+ "lang_item",
+ "crate_lang_items",
+ "lang_item",
+ ]
+ "#]],
+ );
let new_text = "
fn foo() -> i32 {
@@ -37,8 +61,9 @@
db.set_file_text(pos.file_id.file_id(&db), new_text);
- {
- let events = db.log_executed(|| {
+ execute_assert_events(
+ &db,
+ || {
let module = db.module_for_file(pos.file_id.file_id(&db));
let crate_def_map = module.def_map(&db);
visit_module(&db, crate_def_map, module.local_id, &mut |def| {
@@ -46,9 +71,22 @@
db.infer(it.into());
}
});
- });
- assert!(!format!("{events:?}").contains("infer_shim"), "{events:#?}")
- }
+ },
+ &[("infer_shim", 0)],
+ expect_test::expect![[r#"
+ [
+ "parse_shim",
+ "ast_id_map_shim",
+ "file_item_tree_query",
+ "real_span_map_shim",
+ "attrs_shim",
+ "function_signature_with_source_map_shim",
+ "function_signature_shim",
+ "body_with_source_map_shim",
+ "body_shim",
+ ]
+ "#]],
+ );
}
#[test]
@@ -66,8 +104,9 @@
1 + 1
}",
);
- {
- let events = db.log_executed(|| {
+ execute_assert_events(
+ &db,
+ || {
let module = db.module_for_file(pos.file_id.file_id(&db));
let crate_def_map = module.def_map(&db);
visit_module(&db, crate_def_map, module.local_id, &mut |def| {
@@ -75,9 +114,49 @@
db.infer(it.into());
}
});
- });
- assert!(format!("{events:?}").contains("infer_shim"))
- }
+ },
+ &[("infer_shim", 3)],
+ expect_test::expect![[r#"
+ [
+ "source_root_crates_shim",
+ "crate_local_def_map",
+ "file_item_tree_query",
+ "ast_id_map_shim",
+ "parse_shim",
+ "real_span_map_shim",
+ "infer_shim",
+ "function_signature_shim",
+ "function_signature_with_source_map_shim",
+ "attrs_shim",
+ "body_shim",
+ "body_with_source_map_shim",
+ "trait_environment_shim",
+ "return_type_impl_traits_shim",
+ "expr_scopes_shim",
+ "lang_item",
+ "crate_lang_items",
+ "attrs_shim",
+ "attrs_shim",
+ "lang_item",
+ "infer_shim",
+ "function_signature_shim",
+ "function_signature_with_source_map_shim",
+ "body_shim",
+ "body_with_source_map_shim",
+ "trait_environment_shim",
+ "return_type_impl_traits_shim",
+ "expr_scopes_shim",
+ "infer_shim",
+ "function_signature_shim",
+ "function_signature_with_source_map_shim",
+ "body_shim",
+ "body_with_source_map_shim",
+ "trait_environment_shim",
+ "return_type_impl_traits_shim",
+ "expr_scopes_shim",
+ ]
+ "#]],
+ );
let new_text = "
fn foo() -> f32 {
@@ -93,8 +172,9 @@
db.set_file_text(pos.file_id.file_id(&db), new_text);
- {
- let events = db.log_executed(|| {
+ execute_assert_events(
+ &db,
+ || {
let module = db.module_for_file(pos.file_id.file_id(&db));
let crate_def_map = module.def_map(&db);
visit_module(&db, crate_def_map, module.local_id, &mut |def| {
@@ -102,9 +182,34 @@
db.infer(it.into());
}
});
- });
- assert_eq!(format!("{events:?}").matches("infer_shim").count(), 1, "{events:#?}")
- }
+ },
+ &[("infer_shim", 1)],
+ expect_test::expect![[r#"
+ [
+ "parse_shim",
+ "ast_id_map_shim",
+ "file_item_tree_query",
+ "real_span_map_shim",
+ "attrs_shim",
+ "function_signature_with_source_map_shim",
+ "function_signature_shim",
+ "body_with_source_map_shim",
+ "body_shim",
+ "attrs_shim",
+ "attrs_shim",
+ "function_signature_with_source_map_shim",
+ "function_signature_shim",
+ "body_with_source_map_shim",
+ "body_shim",
+ "infer_shim",
+ "expr_scopes_shim",
+ "function_signature_with_source_map_shim",
+ "function_signature_shim",
+ "body_with_source_map_shim",
+ "body_shim",
+ ]
+ "#]],
+ );
}
#[test]
@@ -121,14 +226,26 @@
}
$0",
);
- {
- let events = db.log_executed(|| {
+ execute_assert_events(
+ &db,
+ || {
let module = db.module_for_file(pos.file_id.file_id(&db));
let _crate_def_map = module.def_map(&db);
db.trait_impls_in_crate(module.krate());
- });
- assert!(format!("{events:?}").contains("trait_impls_in_crate_shim"))
- }
+ },
+ &[("trait_impls_in_crate_shim", 1)],
+ expect_test::expect![[r#"
+ [
+ "source_root_crates_shim",
+ "crate_local_def_map",
+ "file_item_tree_query",
+ "ast_id_map_shim",
+ "parse_shim",
+ "real_span_map_shim",
+ "trait_impls_in_crate_shim",
+ ]
+ "#]],
+ );
let new_text = "
fn foo() -> i32 {
@@ -146,24 +263,25 @@
db.set_file_text(pos.file_id.file_id(&db), new_text);
- {
- let actual = db.log_executed(|| {
+ execute_assert_events(
+ &db,
+ || {
let module = db.module_for_file(pos.file_id.file_id(&db));
let _crate_def_map = module.def_map(&db);
db.trait_impls_in_crate(module.krate());
- });
-
- let expected = vec![
- "parse_shim".to_owned(),
- "ast_id_map_shim".to_owned(),
- "file_item_tree_query".to_owned(),
- "real_span_map_shim".to_owned(),
- "crate_local_def_map".to_owned(),
- "trait_impls_in_crate_shim".to_owned(),
- ];
-
- assert_eq!(expected, actual);
- }
+ },
+ &[("trait_impls_in_crate_shim", 1)],
+ expect_test::expect![[r#"
+ [
+ "parse_shim",
+ "ast_id_map_shim",
+ "file_item_tree_query",
+ "real_span_map_shim",
+ "crate_local_def_map",
+ "trait_impls_in_crate_shim",
+ ]
+ "#]],
+ );
}
#[test]
@@ -180,14 +298,26 @@
}
$0",
);
- {
- let events = db.log_executed(|| {
+ execute_assert_events(
+ &db,
+ || {
let module = db.module_for_file(pos.file_id.file_id(&db));
let _crate_def_map = module.def_map(&db);
db.trait_impls_in_crate(module.krate());
- });
- assert!(format!("{events:?}").contains("trait_impls_in_crate_shim"))
- }
+ },
+ &[("trait_impls_in_crate_shim", 1)],
+ expect_test::expect![[r#"
+ [
+ "source_root_crates_shim",
+ "crate_local_def_map",
+ "file_item_tree_query",
+ "ast_id_map_shim",
+ "parse_shim",
+ "real_span_map_shim",
+ "trait_impls_in_crate_shim",
+ ]
+ "#]],
+ );
let new_text = "
fn foo() -> i32 {
@@ -206,24 +336,25 @@
db.set_file_text(pos.file_id.file_id(&db), new_text);
- {
- let actual = db.log_executed(|| {
+ execute_assert_events(
+ &db,
+ || {
let module = db.module_for_file(pos.file_id.file_id(&db));
let _crate_def_map = module.def_map(&db);
db.trait_impls_in_crate(module.krate());
- });
-
- let expected = vec![
- "parse_shim".to_owned(),
- "ast_id_map_shim".to_owned(),
- "file_item_tree_query".to_owned(),
- "real_span_map_shim".to_owned(),
- "crate_local_def_map".to_owned(),
- "trait_impls_in_crate_shim".to_owned(),
- ];
-
- assert_eq!(expected, actual);
- }
+ },
+ &[("trait_impls_in_crate_shim", 1)],
+ expect_test::expect![[r#"
+ [
+ "parse_shim",
+ "ast_id_map_shim",
+ "file_item_tree_query",
+ "real_span_map_shim",
+ "crate_local_def_map",
+ "trait_impls_in_crate_shim",
+ ]
+ "#]],
+ );
}
#[test]
@@ -240,14 +371,26 @@
}
$0",
);
- {
- let events = db.log_executed(|| {
+ execute_assert_events(
+ &db,
+ || {
let module = db.module_for_file(pos.file_id.file_id(&db));
let _crate_def_map = module.def_map(&db);
db.trait_impls_in_crate(module.krate());
- });
- assert!(format!("{events:?}").contains("trait_impls_in_crate_shim"))
- }
+ },
+ &[("trait_impls_in_crate_shim", 1)],
+ expect_test::expect![[r#"
+ [
+ "source_root_crates_shim",
+ "crate_local_def_map",
+ "file_item_tree_query",
+ "ast_id_map_shim",
+ "parse_shim",
+ "real_span_map_shim",
+ "trait_impls_in_crate_shim",
+ ]
+ "#]],
+ );
let new_text = "
use std::collections::HashMap;
@@ -263,24 +406,25 @@
db.set_file_text(pos.file_id.file_id(&db), new_text);
- {
- let actual = db.log_executed(|| {
+ execute_assert_events(
+ &db,
+ || {
let module = db.module_for_file(pos.file_id.file_id(&db));
let _crate_def_map = module.def_map(&db);
db.trait_impls_in_crate(module.krate());
- });
-
- let expected = vec![
- "parse_shim".to_owned(),
- "ast_id_map_shim".to_owned(),
- "file_item_tree_query".to_owned(),
- "real_span_map_shim".to_owned(),
- "crate_local_def_map".to_owned(),
- "trait_impls_in_crate_shim".to_owned(),
- ];
-
- assert_eq!(expected, actual);
- }
+ },
+ &[("trait_impls_in_crate_shim", 1)],
+ expect_test::expect![[r#"
+ [
+ "parse_shim",
+ "ast_id_map_shim",
+ "file_item_tree_query",
+ "real_span_map_shim",
+ "crate_local_def_map",
+ "trait_impls_in_crate_shim",
+ ]
+ "#]],
+ );
}
#[test]
@@ -301,14 +445,26 @@
}
$0",
);
- {
- let events = db.log_executed(|| {
+ execute_assert_events(
+ &db,
+ || {
let module = db.module_for_file(pos.file_id.file_id(&db));
let _crate_def_map = module.def_map(&db);
db.trait_impls_in_crate(module.krate());
- });
- assert!(format!("{events:?}").contains("trait_impls_in_crate_shim"))
- }
+ },
+ &[("trait_impls_in_crate_shim", 1)],
+ expect_test::expect![[r#"
+ [
+ "source_root_crates_shim",
+ "crate_local_def_map",
+ "file_item_tree_query",
+ "ast_id_map_shim",
+ "parse_shim",
+ "real_span_map_shim",
+ "trait_impls_in_crate_shim",
+ ]
+ "#]],
+ );
let new_text = "
fn foo() -> i32 {
@@ -332,33 +488,34 @@
db.set_file_text(pos.file_id.file_id(&db), new_text);
- {
- let actual = db.log_executed(|| {
+ execute_assert_events(
+ &db,
+ || {
let module = db.module_for_file(pos.file_id.file_id(&db));
let _crate_def_map = module.def_map(&db);
db.trait_impls_in_crate(module.krate());
- });
-
- let expected = vec![
- "parse_shim".to_owned(),
- "ast_id_map_shim".to_owned(),
- "file_item_tree_query".to_owned(),
- "real_span_map_shim".to_owned(),
- "crate_local_def_map".to_owned(),
- "trait_impls_in_crate_shim".to_owned(),
- "attrs_shim".to_owned(),
- "impl_trait_with_diagnostics_shim".to_owned(),
- "impl_signature_shim".to_owned(),
- "impl_signature_with_source_map_shim".to_owned(),
- "impl_self_ty_with_diagnostics_shim".to_owned(),
- "struct_signature_shim".to_owned(),
- "struct_signature_with_source_map_shim".to_owned(),
- "attrs_shim".to_owned(),
- "type_for_adt_tracked".to_owned(),
- ];
-
- assert_eq!(expected, actual);
- }
+ },
+ &[("trait_impls_in_crate_shim", 1)],
+ expect_test::expect![[r#"
+ [
+ "parse_shim",
+ "ast_id_map_shim",
+ "file_item_tree_query",
+ "real_span_map_shim",
+ "crate_local_def_map",
+ "trait_impls_in_crate_shim",
+ "attrs_shim",
+ "impl_trait_with_diagnostics_shim",
+ "impl_signature_shim",
+ "impl_signature_with_source_map_shim",
+ "impl_self_ty_with_diagnostics_shim",
+ "struct_signature_shim",
+ "struct_signature_with_source_map_shim",
+ "attrs_shim",
+ "type_for_adt_tracked",
+ ]
+ "#]],
+ );
}
#[test]
@@ -380,8 +537,9 @@
}",
);
- {
- let events = db.log_executed(|| {
+ execute_assert_events(
+ &db,
+ || {
let module = db.module_for_file(file_id.file_id(&db));
let crate_def_map = module.def_map(&db);
let mut defs: Vec<DefWithBodyId> = vec![];
@@ -399,9 +557,73 @@
for def in defs {
let _inference_result = db.infer(def);
}
- });
- assert!(format!("{events:?}").contains("trait_solve_shim"))
- }
+ },
+ &[("trait_solve_shim", 2)],
+ expect_test::expect![[r#"
+ [
+ "source_root_crates_shim",
+ "crate_local_def_map",
+ "file_item_tree_query",
+ "ast_id_map_shim",
+ "parse_shim",
+ "real_span_map_shim",
+ "trait_items_with_diagnostics_shim",
+ "body_shim",
+ "body_with_source_map_shim",
+ "attrs_shim",
+ "impl_items_with_diagnostics_shim",
+ "infer_shim",
+ "trait_signature_shim",
+ "trait_signature_with_source_map_shim",
+ "attrs_shim",
+ "function_signature_shim",
+ "function_signature_with_source_map_shim",
+ "attrs_shim",
+ "body_shim",
+ "body_with_source_map_shim",
+ "trait_environment_shim",
+ "lang_item",
+ "crate_lang_items",
+ "attrs_shim",
+ "attrs_shim",
+ "return_type_impl_traits_shim",
+ "infer_shim",
+ "function_signature_shim",
+ "function_signature_with_source_map_shim",
+ "trait_environment_shim",
+ "expr_scopes_shim",
+ "struct_signature_shim",
+ "struct_signature_with_source_map_shim",
+ "generic_predicates_shim",
+ "value_ty_shim",
+ "variant_fields_shim",
+ "variant_fields_with_source_map_shim",
+ "lang_item",
+ "inherent_impls_in_crate_shim",
+ "impl_signature_shim",
+ "impl_signature_with_source_map_shim",
+ "callable_item_signature_shim",
+ "adt_variance_shim",
+ "variances_of_shim",
+ "trait_solve_shim",
+ "trait_datum_shim",
+ "generic_predicates_shim",
+ "adt_datum_shim",
+ "trait_impls_in_deps_shim",
+ "trait_impls_in_crate_shim",
+ "impl_trait_with_diagnostics_shim",
+ "impl_self_ty_with_diagnostics_shim",
+ "type_for_adt_tracked",
+ "impl_datum_shim",
+ "generic_predicates_shim",
+ "program_clauses_for_chalk_env_shim",
+ "value_ty_shim",
+ "generic_predicates_shim",
+ "trait_solve_shim",
+ "lang_item",
+ ]
+ "#]],
+ );
let new_text = "
//- /main.rs crate:main
@@ -422,8 +644,9 @@
db.set_file_text(file_id.file_id(&db), new_text);
- {
- let events = db.log_executed(|| {
+ execute_assert_events(
+ &db,
+ || {
let module = db.module_for_file(file_id.file_id(&db));
let crate_def_map = module.def_map(&db);
let mut defs: Vec<DefWithBodyId> = vec![];
@@ -442,7 +665,66 @@
for def in defs {
let _inference_result = db.infer(def);
}
- });
- assert!(!format!("{events:?}").contains("trait_solve_shim"))
+ },
+ &[("trait_solve_shim", 0)],
+ expect_test::expect![[r#"
+ [
+ "parse_shim",
+ "ast_id_map_shim",
+ "file_item_tree_query",
+ "real_span_map_shim",
+ "crate_local_def_map",
+ "trait_items_with_diagnostics_shim",
+ "body_with_source_map_shim",
+ "attrs_shim",
+ "body_shim",
+ "impl_items_with_diagnostics_shim",
+ "infer_shim",
+ "attrs_shim",
+ "trait_signature_with_source_map_shim",
+ "attrs_shim",
+ "function_signature_with_source_map_shim",
+ "function_signature_shim",
+ "body_with_source_map_shim",
+ "body_shim",
+ "trait_environment_shim",
+ "crate_lang_items",
+ "attrs_shim",
+ "attrs_shim",
+ "attrs_shim",
+ "return_type_impl_traits_shim",
+ "infer_shim",
+ "function_signature_with_source_map_shim",
+ "trait_environment_shim",
+ "expr_scopes_shim",
+ "struct_signature_with_source_map_shim",
+ "generic_predicates_shim",
+ "variant_fields_with_source_map_shim",
+ "inherent_impls_in_crate_shim",
+ "impl_signature_with_source_map_shim",
+ "impl_signature_shim",
+ "callable_item_signature_shim",
+ "generic_predicates_shim",
+ "trait_impls_in_crate_shim",
+ "impl_trait_with_diagnostics_shim",
+ "impl_self_ty_with_diagnostics_shim",
+ "generic_predicates_shim",
+ "generic_predicates_shim",
+ ]
+ "#]],
+ );
+}
+
+fn execute_assert_events(
+ db: &TestDB,
+ f: impl FnOnce(),
+ required: &[(&str, usize)],
+ expect: Expect,
+) {
+ let events = db.log_executed(f);
+ for (event, count) in required {
+ let n = events.iter().filter(|it| it.contains(event)).count();
+ assert_eq!(n, *count, "Expected {event} to be executed {count} times, but only got {n}");
}
+ expect.assert_debug_eq(&events);
}