From 19115e9fabf1364fe94c21b44546aa01f380f04c Mon Sep 17 00:00:00 2001 From: Aleksey Kladov Date: Wed, 4 Mar 2020 11:38:55 +0100 Subject: [PATCH] Support cross-crate marks --- Cargo.lock | 1 + crates/ra_ide/src/goto_definition.rs | 8 +++++++- crates/ra_ide_db/Cargo.toml | 1 + crates/ra_ide_db/src/defs.rs | 6 ++++++ crates/ra_ide_db/src/lib.rs | 1 + crates/ra_ide_db/src/marks.rs | 9 +++++++++ crates/test_utils/src/marks.rs | 15 ++++++++++++--- 7 files changed, 37 insertions(+), 4 deletions(-) create mode 100644 crates/ra_ide_db/src/marks.rs diff --git a/Cargo.lock b/Cargo.lock index 373e176b0b..87c2883469 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1068,6 +1068,7 @@ dependencies = [ "rayon", "rustc-hash", "superslice", + "test_utils", ] [[package]] diff --git a/crates/ra_ide/src/goto_definition.rs b/crates/ra_ide/src/goto_definition.rs index 4a8107d60e..a55a13ffca 100644 --- a/crates/ra_ide/src/goto_definition.rs +++ b/crates/ra_ide/src/goto_definition.rs @@ -96,7 +96,7 @@ pub(crate) fn reference_definition( #[cfg(test)] mod tests { - use test_utils::assert_eq_text; + use test_utils::{assert_eq_text, covers}; use crate::mock_analysis::analysis_and_position; @@ -208,6 +208,7 @@ mod tests { #[test] fn goto_def_for_macros() { + covers!(ra_ide_db::goto_def_for_macros); check_goto( " //- /lib.rs @@ -224,6 +225,7 @@ mod tests { #[test] fn goto_def_for_macros_from_other_crates() { + covers!(ra_ide_db::goto_def_for_macros); check_goto( " //- /lib.rs @@ -335,6 +337,7 @@ mod tests { #[test] fn goto_def_for_methods() { + covers!(ra_ide_db::goto_def_for_methods); check_goto( " //- /lib.rs @@ -354,6 +357,7 @@ mod tests { #[test] fn goto_def_for_fields() { + covers!(ra_ide_db::goto_def_for_fields); check_goto( " //- /lib.rs @@ -372,6 +376,7 @@ mod tests { #[test] fn goto_def_for_record_fields() { + covers!(ra_ide_db::goto_def_for_record_fields); check_goto( " //- /lib.rs @@ -784,6 +789,7 @@ mod tests { #[test] fn goto_def_for_field_init_shorthand() { + covers!(ra_ide_db::goto_def_for_field_init_shorthand); check_goto( " //- /lib.rs diff --git a/crates/ra_ide_db/Cargo.toml b/crates/ra_ide_db/Cargo.toml index 7b285d2809..7ff1a536e3 100644 --- a/crates/ra_ide_db/Cargo.toml +++ b/crates/ra_ide_db/Cargo.toml @@ -21,6 +21,7 @@ ra_syntax = { path = "../ra_syntax" } ra_text_edit = { path = "../ra_text_edit" } ra_db = { path = "../ra_db" } ra_prof = { path = "../ra_prof" } +test_utils = { path = "../test_utils" } # ra_ide should depend only on the top-level `hir` package. if you need # something from some `hir_xxx` subpackage, reexport the API via `hir`. diff --git a/crates/ra_ide_db/src/defs.rs b/crates/ra_ide_db/src/defs.rs index f057435bf6..97961bb6d3 100644 --- a/crates/ra_ide_db/src/defs.rs +++ b/crates/ra_ide_db/src/defs.rs @@ -14,6 +14,7 @@ use ra_syntax::{ ast::{self, AstNode, VisibilityOwner}, match_ast, }; +use test_utils::tested_by; use crate::RootDatabase; @@ -217,18 +218,22 @@ pub fn classify_name_ref( let parent = name_ref.syntax().parent()?; if let Some(method_call) = ast::MethodCallExpr::cast(parent.clone()) { + tested_by!(goto_def_for_methods; force); if let Some(func) = sema.resolve_method_call(&method_call) { return Some(NameRefClass::Definition(Definition::ModuleDef(func.into()))); } } if let Some(field_expr) = ast::FieldExpr::cast(parent.clone()) { + tested_by!(goto_def_for_fields; force); if let Some(field) = sema.resolve_field(&field_expr) { return Some(NameRefClass::Definition(Definition::StructField(field))); } } if let Some(record_field) = ast::RecordField::cast(parent.clone()) { + tested_by!(goto_def_for_record_fields; force); + tested_by!(goto_def_for_field_init_shorthand; force); if let Some((field, local)) = sema.resolve_record_field(&record_field) { let field = Definition::StructField(field); let res = match local { @@ -240,6 +245,7 @@ pub fn classify_name_ref( } if let Some(macro_call) = parent.ancestors().find_map(ast::MacroCall::cast) { + tested_by!(goto_def_for_macros; force); if let Some(macro_def) = sema.resolve_macro_call(¯o_call) { return Some(NameRefClass::Definition(Definition::Macro(macro_def))); } diff --git a/crates/ra_ide_db/src/lib.rs b/crates/ra_ide_db/src/lib.rs index 877ac3c38e..aa312c1403 100644 --- a/crates/ra_ide_db/src/lib.rs +++ b/crates/ra_ide_db/src/lib.rs @@ -2,6 +2,7 @@ //! //! It is mainly a `HirDatabase` for semantic analysis, plus a `SymbolsDatabase`, for fuzzy search. +pub mod marks; pub mod line_index; pub mod line_index_utils; pub mod feature_flags; diff --git a/crates/ra_ide_db/src/marks.rs b/crates/ra_ide_db/src/marks.rs new file mode 100644 index 0000000000..d088fa2577 --- /dev/null +++ b/crates/ra_ide_db/src/marks.rs @@ -0,0 +1,9 @@ +//! See test_utils/src/marks.rs + +test_utils::marks![ + goto_def_for_macros + goto_def_for_methods + goto_def_for_fields + goto_def_for_record_fields + goto_def_for_field_init_shorthand +]; diff --git a/crates/test_utils/src/marks.rs b/crates/test_utils/src/marks.rs index f8fabfaff9..c3185e860c 100644 --- a/crates/test_utils/src/marks.rs +++ b/crates/test_utils/src/marks.rs @@ -30,6 +30,12 @@ use std::sync::atomic::{AtomicUsize, Ordering}; #[macro_export] macro_rules! tested_by { + ($ident:ident; force) => {{ + { + // sic! use call-site crate + crate::marks::$ident.fetch_add(1, std::sync::atomic::Ordering::SeqCst); + } + }}; ($ident:ident) => {{ #[cfg(test)] { @@ -41,9 +47,12 @@ macro_rules! tested_by { #[macro_export] macro_rules! covers { + // sic! use call-site crate ($ident:ident) => { - // sic! use call-site crate - let _checker = $crate::marks::MarkChecker::new(&crate::marks::$ident); + $crate::covers!(crate::$ident) + }; + ($krate:ident :: $ident:ident) => { + let _checker = $crate::marks::MarkChecker::new(&$krate::marks::$ident); }; } @@ -52,7 +61,7 @@ macro_rules! marks { ($($ident:ident)*) => { $( #[allow(bad_style)] - pub(crate) static $ident: std::sync::atomic::AtomicUsize = + pub static $ident: std::sync::atomic::AtomicUsize = std::sync::atomic::AtomicUsize::new(0); )* };