diff --git a/crates/ra_analysis/src/imp.rs b/crates/ra_analysis/src/imp.rs index fe1dfefea1..ab6d111c23 100644 --- a/crates/ra_analysis/src/imp.rs +++ b/crates/ra_analysis/src/imp.rs @@ -214,7 +214,7 @@ impl AnalysisImpl { { let scope = fn_descr.scope(&*self.db); // First try to resolve the symbol locally - return if let Some(entry) = scope.resolve_local_name(name_ref) { + if let Some(entry) = scope.resolve_local_name(name_ref) { let mut vec = vec![]; vec.push(( position.file_id, @@ -224,12 +224,11 @@ impl AnalysisImpl { kind: NAME, }, )); - Ok(vec) - } else { - // If that fails try the index based approach. - self.index_resolve(name_ref) + return Ok(vec); }; } + // If that fails try the index based approach. + return self.index_resolve(name_ref); } if let Some(name) = find_node_at_offset::(syntax, position.offset) { if let Some(module) = name.syntax().parent().and_then(ast::Module::cast) { diff --git a/crates/ra_analysis/tests/tests.rs b/crates/ra_analysis/tests/tests.rs index fbe89f4448..71d20dbe94 100644 --- a/crates/ra_analysis/tests/tests.rs +++ b/crates/ra_analysis/tests/tests.rs @@ -18,6 +18,23 @@ fn get_signature(text: &str) -> (FnSignatureInfo, Option) { analysis.resolve_callable(position).unwrap().unwrap() } +#[test] +fn approximate_resolve_works_in_items() { + let (analysis, pos) = analysis_and_position( + " + //- /lib.rs + struct Foo; + enum E { X(Foo<|>) } + ", + ); + + let symbols = analysis.approximately_resolve_symbol(pos).unwrap(); + assert_eq_dbg( + r#"[(FileId(1), FileSymbol { name: "Foo", node_range: [0; 11), kind: STRUCT_DEF })]"#, + &symbols, + ); +} + #[test] fn test_resolve_module() { let (analysis, pos) = analysis_and_position(