From cba4dd1a8ac8e0dcd8a82efc1a490e4676340388 Mon Sep 17 00:00:00 2001
From: Edwin Cheng <edwin0cheng@gmail.com>
Date: Sun, 22 Mar 2020 19:53:28 +0800
Subject: Improve find_all_ref work inside macro

---
 crates/ra_ide/src/references.rs | 32 +++++++++++++++++++++++---------
 1 file changed, 23 insertions(+), 9 deletions(-)

(limited to 'crates')

diff --git a/crates/ra_ide/src/references.rs b/crates/ra_ide/src/references.rs
index 3ea0ac230..746cc86ba 100644
--- a/crates/ra_ide/src/references.rs
+++ b/crates/ra_ide/src/references.rs
@@ -94,12 +94,16 @@ pub(crate) fn find_all_refs(
     let sema = Semantics::new(db);
     let syntax = sema.parse(position.file_id).syntax().clone();
 
-    let (opt_name, search_kind) =
-        if let Some(name) = get_struct_def_name_for_struct_literal_search(&syntax, position) {
-            (Some(name), ReferenceKind::StructLiteral)
-        } else {
-            (find_node_at_offset::<ast::Name>(&syntax, position.offset), ReferenceKind::Other)
-        };
+    let (opt_name, search_kind) = if let Some(name) =
+        get_struct_def_name_for_struct_literal_search(&sema, &syntax, position)
+    {
+        (Some(name), ReferenceKind::StructLiteral)
+    } else {
+        (
+            sema.find_node_at_offset_with_descend::<ast::Name>(&syntax, position.offset),
+            ReferenceKind::Other,
+        )
+    };
 
     let RangeInfo { range, info: def } = find_name(&sema, &syntax, position, opt_name)?;
 
@@ -131,7 +135,8 @@ fn find_name(
         let range = name.syntax().text_range();
         return Some(RangeInfo::new(range, def));
     }
-    let name_ref = find_node_at_offset::<ast::NameRef>(&syntax, position.offset)?;
+    let name_ref =
+        sema.find_node_at_offset_with_descend::<ast::NameRef>(&syntax, position.offset)?;
     let def = classify_name_ref(sema, &name_ref)?.definition();
     let range = name_ref.syntax().text_range();
     Some(RangeInfo::new(range, def))
@@ -157,6 +162,7 @@ fn decl_access(def: &Definition, syntax: &SyntaxNode, range: TextRange) -> Optio
 }
 
 fn get_struct_def_name_for_struct_literal_search(
+    sema: &Semantics<RootDatabase>,
     syntax: &SyntaxNode,
     position: FilePosition,
 ) -> Option<ast::Name> {
@@ -164,10 +170,18 @@ fn get_struct_def_name_for_struct_literal_search(
         if right.kind() != SyntaxKind::L_CURLY && right.kind() != SyntaxKind::L_PAREN {
             return None;
         }
-        if let Some(name) = find_node_at_offset::<ast::Name>(&syntax, left.text_range().start()) {
+        if let Some(name) =
+            sema.find_node_at_offset_with_descend::<ast::Name>(&syntax, left.text_range().start())
+        {
             return name.syntax().ancestors().find_map(ast::StructDef::cast).and_then(|l| l.name());
         }
-        if find_node_at_offset::<ast::TypeParamList>(&syntax, left.text_range().start()).is_some() {
+        if sema
+            .find_node_at_offset_with_descend::<ast::TypeParamList>(
+                &syntax,
+                left.text_range().start(),
+            )
+            .is_some()
+        {
             return left.ancestors().find_map(ast::StructDef::cast).and_then(|l| l.name());
         }
     }
-- 
cgit v1.2.3