]> git.lizzy.rs Git - rust.git/commitdiff
Fix logic for determining macro calls
authorJonas Schievink <jonasschievink@gmail.com>
Tue, 8 Dec 2020 18:11:12 +0000 (19:11 +0100)
committerJonas Schievink <jonasschievink@gmail.com>
Tue, 8 Dec 2020 18:11:12 +0000 (19:11 +0100)
I believe this currently goes back all the way to the initial
user-written call, but that seems better than the current broken
behavior.

crates/hir_expand/src/lib.rs

index 3edcadf0dd5d9e5c9e7f3e8c54c6a6b572cd6c86..1a942851434b750c37bd295d064a3d73eaeed15e 100644 (file)
@@ -457,17 +457,15 @@ pub fn original_file_range(self, db: &dyn db::AstDatabase) -> FileRange {
             return FileRange { file_id: range.file_id.original_file(db), range: range.value };
         }
 
-        // Fall back to whole macro call
-        if let Some(expansion) = self.file_id.expansion_info(db) {
-            if let Some(call_node) = expansion.call_node() {
-                return FileRange {
-                    file_id: call_node.file_id.original_file(db),
-                    range: call_node.value.text_range(),
-                };
-            }
+        // Fall back to whole macro call.
+        let mut node = self.cloned();
+        while let Some(call_node) = node.file_id.call_node(db) {
+            node = call_node;
         }
 
-        FileRange { file_id: self.file_id.original_file(db), range: self.value.text_range() }
+        let orig_file = node.file_id.original_file(db);
+        assert_eq!(node.file_id, orig_file.into());
+        FileRange { file_id: orig_file, range: node.value.text_range() }
     }
 }