diff --git a/crates/ide/src/display/navigation_target.rs b/crates/ide/src/display/navigation_target.rs index 23d88521851..1982434663e 100644 --- a/crates/ide/src/display/navigation_target.rs +++ b/crates/ide/src/display/navigation_target.rs @@ -85,12 +85,16 @@ impl NavigationTarget { let name = module.name(db).map(|it| it.to_string().into()).unwrap_or_default(); if let Some(src) = module.declaration_source(db) { let node = src.as_ref().map(|it| it.syntax()); - let frange = node.original_file_range(db); + let full_range = node.original_file_range(db); + let focus_range = src + .value + .name() + .map(|name| src.with_value(name.syntax()).original_file_range(db).range); let mut res = NavigationTarget::from_syntax( - frange.file_id, + full_range.file_id, name, - None, - frange.range, + focus_range, + full_range.range, SymbolKind::Module, ); res.docs = module.attrs(db).docs(); diff --git a/crates/ide/src/fixture.rs b/crates/ide/src/fixture.rs index cc82188852d..cc6641ba135 100644 --- a/crates/ide/src/fixture.rs +++ b/crates/ide/src/fixture.rs @@ -1,5 +1,6 @@ //! Utilities for creating `Analysis` instances for tests. use ide_db::base_db::fixture::ChangeFixture; +use syntax::{TextRange, TextSize}; use test_utils::{extract_annotations, RangeOrOffset}; use crate::{Analysis, AnalysisHost, FileId, FilePosition, FileRange}; @@ -68,3 +69,18 @@ pub(crate) fn annotations(ra_fixture: &str) -> (Analysis, FilePosition, Vec<(Fil .collect(); (host.analysis(), FilePosition { file_id, offset }, annotations) } + +pub(crate) fn nav_target_annotation(ra_fixture: &str) -> (Analysis, FilePosition, FileRange) { + let (analysis, position, mut annotations) = annotations(ra_fixture); + let (mut expected, data) = annotations.pop().unwrap(); + assert!(annotations.is_empty()); + match data.as_str() { + "" => (), + "file" => { + expected.range = + TextRange::up_to(TextSize::of(&*analysis.file_text(expected.file_id).unwrap())) + } + data => panic!("bad data: {}", data), + } + (analysis, position, expected) +} diff --git a/crates/ide/src/goto_definition.rs b/crates/ide/src/goto_definition.rs index 1a997fa40dc..e86ae2a1885 100644 --- a/crates/ide/src/goto_definition.rs +++ b/crates/ide/src/goto_definition.rs @@ -131,22 +131,11 @@ pub(crate) fn reference_definition( #[cfg(test)] mod tests { use ide_db::base_db::FileRange; - use syntax::{TextRange, TextSize}; use crate::fixture; fn check(ra_fixture: &str) { - let (analysis, position, mut annotations) = fixture::annotations(ra_fixture); - let (mut expected, data) = annotations.pop().unwrap(); - match data.as_str() { - "" => (), - "file" => { - expected.range = - TextRange::up_to(TextSize::of(&*analysis.file_text(expected.file_id).unwrap())) - } - data => panic!("bad data: {}", data), - } - + let (analysis, position, expected) = fixture::nav_target_annotation(ra_fixture); let mut navs = analysis.goto_definition(position).unwrap().expect("no definition found").info; if navs.len() == 0 { diff --git a/crates/ide/src/parent_module.rs b/crates/ide/src/parent_module.rs index d343638fbd2..ddbaf22b7fc 100644 --- a/crates/ide/src/parent_module.rs +++ b/crates/ide/src/parent_module.rs @@ -63,57 +63,62 @@ pub(crate) fn crate_for(db: &RootDatabase, file_id: FileId) -> Vec { #[cfg(test)] mod tests { + use ide_db::base_db::FileRange; use test_utils::mark; - use crate::fixture::{self}; + use crate::fixture; + + fn check(ra_fixture: &str) { + let (analysis, position, expected) = fixture::nav_target_annotation(ra_fixture); + let mut navs = analysis.parent_module(position).unwrap(); + assert_eq!(navs.len(), 1); + let nav = navs.pop().unwrap(); + assert_eq!(expected, FileRange { file_id: nav.file_id, range: nav.focus_or_full_range() }); + } #[test] fn test_resolve_parent_module() { - let (analysis, pos) = fixture::position( - " - //- /lib.rs - mod foo; - //- /foo.rs - $0// empty - ", + check( + r#" +//- /lib.rs +mod foo; + //^^^ + +//- /foo.rs +$0// empty +"#, ); - let nav = analysis.parent_module(pos).unwrap().pop().unwrap(); - nav.assert_match("foo Module FileId(0) 0..8"); } #[test] fn test_resolve_parent_module_on_module_decl() { mark::check!(test_resolve_parent_module_on_module_decl); - let (analysis, pos) = fixture::position( - " - //- /lib.rs - mod foo; + check( + r#" +//- /lib.rs +mod foo; + //^^^ +//- /foo.rs +mod $0bar; - //- /foo.rs - mod $0bar; - - //- /foo/bar.rs - // empty - ", +//- /foo/bar.rs +// empty +"#, ); - let nav = analysis.parent_module(pos).unwrap().pop().unwrap(); - nav.assert_match("foo Module FileId(0) 0..8"); } #[test] fn test_resolve_parent_module_for_inline() { - let (analysis, pos) = fixture::position( - " - //- /lib.rs - mod foo { - mod bar { - mod baz { $0 } - } - } - ", + check( + r#" +//- /lib.rs +mod foo { + mod bar { + mod baz { $0 } + } //^^^ +} +"#, ); - let nav = analysis.parent_module(pos).unwrap().pop().unwrap(); - nav.assert_match("baz Module FileId(0) 32..44"); } #[test]