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.rs63
1 files changed, 35 insertions, 28 deletions
diff --git a/crates/hir-expand/src/lib.rs b/crates/hir-expand/src/lib.rs
index 0850d6156d..c98d072784 100644
--- a/crates/hir-expand/src/lib.rs
+++ b/crates/hir-expand/src/lib.rs
@@ -81,7 +81,7 @@ macro_rules! impl_intern_lookup {
impl $crate::Lookup for $id {
type Database = dyn $db;
type Data = $loc;
- fn lookup(&self, db: &Self::Database) -> Self::Data {
+ fn lookup<'db>(&self, db: &'db Self::Database) -> &'db Self::Data {
self.loc(db)
}
}
@@ -98,7 +98,7 @@ pub trait Intern {
pub trait Lookup {
type Database: ?Sized;
type Data;
- fn lookup(&self, db: &Self::Database) -> Self::Data;
+ fn lookup<'db>(&self, db: &'db Self::Database) -> &'db Self::Data;
}
impl_intern_lookup!(ExpandDatabase, MacroCallId, MacroCallLoc);
@@ -714,24 +714,27 @@ impl MacroCallKind {
/// - fn_like! {}, it spans the path and token tree
/// - #\[derive], it spans the `#[derive(...)]` attribute and the annotated item
/// - #\[attr], it spans the `#[attr(...)]` attribute and the annotated item
- pub fn original_call_range_with_input(self, db: &dyn ExpandDatabase) -> FileRange {
- let mut kind = self;
+ pub fn original_call_range_with_input(&self, db: &dyn ExpandDatabase) -> FileRange {
+ let get_range = |kind: &_| match kind {
+ MacroCallKind::FnLike { ast_id, .. } => ast_id.erase(),
+ MacroCallKind::Derive { ast_id, .. } => ast_id.erase(),
+ MacroCallKind::Attr { ast_id, .. } => ast_id.erase(),
+ };
+
+ let mut ast_id = get_range(self);
+ let mut file_id = self.file_id();
let file_id = loop {
- match kind.file_id() {
+ match file_id {
HirFileId::MacroFile(file) => {
- kind = file.loc(db).kind;
+ let kind = &file.loc(db).kind;
+ ast_id = get_range(kind);
+ file_id = kind.file_id();
}
HirFileId::FileId(file_id) => break file_id,
}
};
- let range = match kind {
- MacroCallKind::FnLike { ast_id, .. } => ast_id.to_ptr(db).text_range(),
- MacroCallKind::Derive { ast_id, .. } => ast_id.to_ptr(db).text_range(),
- MacroCallKind::Attr { ast_id, .. } => ast_id.to_ptr(db).text_range(),
- };
-
- FileRange { range, file_id }
+ FileRange { range: ast_id.to_ptr(db).text_range(), file_id }
}
/// Returns the original file range that best describes the location of this macro call.
@@ -739,18 +742,8 @@ impl MacroCallKind {
/// Here we try to roughly match what rustc does to improve diagnostics: fn-like macros
/// get the macro path (rustc shows the whole `ast::MacroCall`), attribute macros get the
/// attribute's range, and derives get only the specific derive that is being referred to.
- pub fn original_call_range(self, db: &dyn ExpandDatabase, krate: Crate) -> FileRange {
- let mut kind = self;
- let file_id = loop {
- match kind.file_id() {
- HirFileId::MacroFile(file) => {
- kind = file.loc(db).kind;
- }
- HirFileId::FileId(file_id) => break file_id,
- }
- };
-
- let range = match kind {
+ pub fn original_call_range(&self, db: &dyn ExpandDatabase, krate: Crate) -> FileRange {
+ let get_range = |kind: &_| match kind {
MacroCallKind::FnLike { ast_id, .. } => {
let node = ast_id.to_node(db);
node.path()
@@ -761,11 +754,24 @@ impl MacroCallKind {
}
MacroCallKind::Derive { ast_id, derive_attr_index, .. } => {
// FIXME: should be the range of the macro name, not the whole derive
- derive_attr_index.find_attr_range(db, krate, ast_id).1.syntax().text_range()
+ derive_attr_index.find_attr_range(db, krate, *ast_id).1.syntax().text_range()
}
// FIXME: handle `cfg_attr`
MacroCallKind::Attr { ast_id, censored_attr_ids: attr_ids, .. } => {
- attr_ids.invoc_attr().find_attr_range(db, krate, ast_id).1.syntax().text_range()
+ attr_ids.invoc_attr().find_attr_range(db, krate, *ast_id).1.syntax().text_range()
+ }
+ };
+
+ let mut range = get_range(self);
+ let mut file_id = self.file_id();
+ let file_id = loop {
+ match file_id {
+ HirFileId::MacroFile(file) => {
+ let kind = &file.loc(db).kind;
+ range = get_range(kind);
+ file_id = kind.file_id();
+ }
+ HirFileId::FileId(file_id) => break file_id,
}
};
@@ -797,7 +803,7 @@ pub struct ExpansionInfo<'db> {
arg: InFile<Option<SyntaxNode>>,
exp_map: &'db ExpansionSpanMap,
arg_map: SpanMap<'db>,
- loc: MacroCallLoc,
+ loc: &'db MacroCallLoc,
}
impl<'db> ExpansionInfo<'db> {
@@ -1056,6 +1062,7 @@ intern::impl_internable!(ModPath);
#[salsa_macros::interned(no_lifetime, debug, revisions = usize::MAX)]
#[doc(alias = "MacroFileId")]
pub struct MacroCallId {
+ #[returns(ref)]
pub loc: MacroCallLoc,
}