diff --git a/crates/ra_analysis/src/goto_defenition.rs b/crates/ra_analysis/src/goto_defenition.rs
index 91de7ef65e..08d1809ee1 100644
--- a/crates/ra_analysis/src/goto_defenition.rs
+++ b/crates/ra_analysis/src/goto_defenition.rs
@@ -78,3 +78,61 @@ fn name_defenition(
}
Ok(None)
}
+
+#[cfg(test)]
+mod tests {
+ use test_utils::assert_eq_dbg;
+ use crate::mock_analysis::analysis_and_position;
+
+ #[test]
+ fn goto_defenition_works_in_items() {
+ let (analysis, pos) = analysis_and_position(
+ "
+ //- /lib.rs
+ struct Foo;
+ enum E { X(Foo<|>) }
+ ",
+ );
+
+ let symbols = analysis.goto_defenition(pos).unwrap().unwrap();
+ assert_eq_dbg(
+ r#"[NavigationTarget { file_id: FileId(1), name: "Foo",
+ kind: STRUCT_DEF, range: [0; 11),
+ ptr: Some(LocalSyntaxPtr { range: [0; 11), kind: STRUCT_DEF }) }]"#,
+ &symbols,
+ );
+ }
+
+ #[test]
+ fn goto_defenition_works_for_module_declaration() {
+ let (analysis, pos) = analysis_and_position(
+ "
+ //- /lib.rs
+ mod <|>foo;
+ //- /foo.rs
+ // empty
+ ",
+ );
+
+ let symbols = analysis.goto_defenition(pos).unwrap().unwrap();
+ assert_eq_dbg(
+ r#"[NavigationTarget { file_id: FileId(2), name: "foo", kind: MODULE, range: [0; 0), ptr: None }]"#,
+ &symbols,
+ );
+
+ let (analysis, pos) = analysis_and_position(
+ "
+ //- /lib.rs
+ mod <|>foo;
+ //- /foo/mod.rs
+ // empty
+ ",
+ );
+
+ let symbols = analysis.goto_defenition(pos).unwrap().unwrap();
+ assert_eq_dbg(
+ r#"[NavigationTarget { file_id: FileId(2), name: "foo", kind: MODULE, range: [0; 0), ptr: None }]"#,
+ &symbols,
+ );
+ }
+}
diff --git a/crates/ra_analysis/src/lib.rs b/crates/ra_analysis/src/lib.rs
index 0dac9f2680..13527e628f 100644
--- a/crates/ra_analysis/src/lib.rs
+++ b/crates/ra_analysis/src/lib.rs
@@ -399,13 +399,6 @@ impl Analysis {
) -> Cancelable