From 19115e9fabf1364fe94c21b44546aa01f380f04c Mon Sep 17 00:00:00 2001 From: Aleksey Kladov Date: Wed, 4 Mar 2020 11:38:55 +0100 Subject: Support cross-crate marks --- 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 +++++++++ 4 files changed, 17 insertions(+) create mode 100644 crates/ra_ide_db/src/marks.rs (limited to 'crates/ra_ide_db') diff --git a/crates/ra_ide_db/Cargo.toml b/crates/ra_ide_db/Cargo.toml index 7b285d280..7ff1a536e 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 f057435bf..97961bb6d 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 877ac3c38..aa312c140 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 000000000..d088fa257 --- /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 +]; -- cgit v1.2.3