Unnamed repository; edit this file 'description' to name the repository.
Diffstat (limited to 'crates/hir_expand/src/lib.rs')
| -rw-r--r-- | crates/hir_expand/src/lib.rs | 55 |
1 files changed, 35 insertions, 20 deletions
diff --git a/crates/hir_expand/src/lib.rs b/crates/hir_expand/src/lib.rs index 736f482924..1452ab08d9 100644 --- a/crates/hir_expand/src/lib.rs +++ b/crates/hir_expand/src/lib.rs @@ -22,8 +22,7 @@ use either::Either; pub use mbe::{ExpandError, ExpandResult}; pub use parser::FragmentKind; -use std::hash::Hash; -use std::sync::Arc; +use std::{hash::Hash, sync::Arc}; use base_db::{impl_intern_key, salsa, CrateId, FileId, FileRange}; use syntax::{ @@ -32,11 +31,13 @@ use syntax::{ Direction, SyntaxNode, SyntaxToken, TextRange, TextSize, }; -use crate::ast_id_map::FileAstId; -use crate::builtin_attr::BuiltinAttrExpander; -use crate::builtin_derive::BuiltinDeriveExpander; -use crate::builtin_macro::{BuiltinFnLikeExpander, EagerExpander}; -use crate::proc_macro::ProcMacroExpander; +use crate::{ + ast_id_map::FileAstId, + builtin_attr::BuiltinAttrExpander, + builtin_derive::BuiltinDeriveExpander, + builtin_macro::{BuiltinFnLikeExpander, EagerExpander}, + proc_macro::ProcMacroExpander, +}; #[cfg(test)] mod test_db; @@ -210,12 +211,12 @@ impl MacroDefId { pub fn ast_id(&self) -> Either<AstId<ast::Macro>, AstId<ast::Fn>> { let id = match &self.kind { - MacroDefKind::Declarative(id) => id, - MacroDefKind::BuiltIn(_, id) => id, - MacroDefKind::BuiltInAttr(_, id) => id, - MacroDefKind::BuiltInDerive(_, id) => id, - MacroDefKind::BuiltInEager(_, id) => id, MacroDefKind::ProcMacro(.., id) => return Either::Right(*id), + MacroDefKind::Declarative(id) + | MacroDefKind::BuiltIn(_, id) + | MacroDefKind::BuiltInAttr(_, id) + | MacroDefKind::BuiltInDerive(_, id) + | MacroDefKind::BuiltInEager(_, id) => id, }; Either::Left(*id) } @@ -464,15 +465,10 @@ impl InFile<SyntaxNode> { } impl<'a> InFile<&'a SyntaxNode> { + /// Falls back to the macro call range if the node cannot be mapped up fully. pub fn original_file_range(self, db: &dyn db::AstDatabase) -> FileRange { - if let Some(range) = original_range_opt(db, self) { - let original_file = range.file_id.original_file(db); - if range.file_id == original_file.into() { - return FileRange { file_id: original_file, range: range.value }; - } - - log::error!("Fail to mapping up more for {:?}", range); - return FileRange { file_id: range.file_id.original_file(db), range: range.value }; + if let Some(res) = self.original_file_range_opt(db) { + return res; } // Fall back to whole macro call. @@ -483,8 +479,27 @@ impl<'a> InFile<&'a SyntaxNode> { 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() } } + + /// Attempts to map the syntax node back up its macro calls. + pub fn original_file_range_opt(self, db: &dyn db::AstDatabase) -> Option<FileRange> { + match original_range_opt(db, self) { + Some(range) => { + let original_file = range.file_id.original_file(db); + if range.file_id != original_file.into() { + log::error!("Failed mapping up more for {:?}", range); + } + Some(FileRange { file_id: original_file, range: range.value }) + } + _ if !self.file_id.is_macro() => Some(FileRange { + file_id: self.file_id.original_file(db), + range: self.value.text_range(), + }), + _ => None, + } + } } fn original_range_opt( |