Store #[derive] attribute ID along macro invoc

This commit is contained in:
Jonas Schievink 2021-04-09 13:38:01 +02:00
parent 546da15972
commit c0dd36fd42
5 changed files with 22 additions and 12 deletions

View file

@ -62,7 +62,7 @@ use hir_expand::{
ast_id_map::FileAstId,
eager::{expand_eager_macro, ErrorEmitted, ErrorSink},
hygiene::Hygiene,
AstId, HirFileId, InFile, MacroCallId, MacroCallKind, MacroDefId, MacroDefKind,
AstId, AttrId, HirFileId, InFile, MacroCallId, MacroCallKind, MacroDefId, MacroDefKind,
};
use la_arena::Idx;
use nameres::DefMap;
@ -699,6 +699,7 @@ fn macro_call_as_call_id(
fn derive_macro_as_call_id(
item_attr: &AstIdWithPath<ast::Item>,
derive_attr: AttrId,
db: &dyn db::DefDatabase,
krate: CrateId,
resolver: impl Fn(path::ModPath) -> Option<MacroDefId>,
@ -712,6 +713,7 @@ fn derive_macro_as_call_id(
MacroCallKind::Derive {
ast_id: item_attr.ast_id,
derive_name: last_segment.to_string(),
derive_attr,
},
)
.into();

View file

@ -617,7 +617,7 @@ mod diagnostics {
let node = ast_id.to_node(db.upcast());
(ast_id.file_id, SyntaxNodePtr::from(AstPtr::new(&node)), None)
}
MacroCallKind::Derive { ast_id, derive_name } => {
MacroCallKind::Derive { ast_id, derive_name, .. } => {
let node = ast_id.to_node(db.upcast());
// Compute the precise location of the macro name's token in the derive

View file

@ -13,7 +13,7 @@ use hir_expand::{
builtin_macro::find_builtin_macro,
name::{AsName, Name},
proc_macro::ProcMacroExpander,
HirFileId, MacroCallId, MacroCallKind, MacroDefId, MacroDefKind,
AttrId, HirFileId, MacroCallId, MacroCallKind, MacroDefId, MacroDefKind,
};
use hir_expand::{InFile, MacroCallLoc};
use rustc_hash::{FxHashMap, FxHashSet};
@ -216,7 +216,7 @@ struct MacroDirective {
#[derive(Clone, Debug, Eq, PartialEq)]
enum MacroDirectiveKind {
FnLike { ast_id: AstIdWithPath<ast::MacroCall> },
Derive { ast_id: AstIdWithPath<ast::Item> },
Derive { ast_id: AstIdWithPath<ast::Item>, derive_attr: AttrId },
}
struct DefData<'a> {
@ -831,10 +831,14 @@ impl DefCollector<'_> {
Err(UnresolvedMacro) | Ok(Err(_)) => {}
}
}
MacroDirectiveKind::Derive { ast_id } => {
match derive_macro_as_call_id(ast_id, self.db, self.def_map.krate, |path| {
self.resolve_derive_macro(directive.module_id, &path)
}) {
MacroDirectiveKind::Derive { ast_id, derive_attr } => {
match derive_macro_as_call_id(
ast_id,
*derive_attr,
self.db,
self.def_map.krate,
|path| self.resolve_derive_macro(directive.module_id, &path),
) {
Ok(call_id) => {
resolved.push((directive.module_id, call_id, directive.depth));
res = ReachedFixedPoint::No;
@ -1368,7 +1372,7 @@ impl ModCollector<'_, '_> {
self.def_collector.unexpanded_macros.push(MacroDirective {
module_id: self.module_id,
depth: self.macro_depth + 1,
kind: MacroDirectiveKind::Derive { ast_id },
kind: MacroDirectiveKind::Derive { ast_id, derive_attr: derive.id },
});
}
}

View file

@ -269,7 +269,7 @@ mod tests {
use expect_test::{expect, Expect};
use name::AsName;
use crate::{test_db::TestDB, AstId, MacroCallId, MacroCallKind, MacroCallLoc};
use crate::{test_db::TestDB, AstId, AttrId, MacroCallId, MacroCallKind, MacroCallLoc};
use super::*;
@ -317,7 +317,11 @@ $0
local_inner: false,
},
krate: CrateId(0),
kind: MacroCallKind::Derive { ast_id, derive_name: name.to_string() },
kind: MacroCallKind::Derive {
ast_id,
derive_name: name.to_string(),
derive_attr: AttrId(0),
},
};
let id: MacroCallId = db.intern_macro(loc).into();

View file

@ -291,7 +291,7 @@ pub struct MacroCallLoc {
#[derive(Debug, Clone, PartialEq, Eq, Hash)]
pub enum MacroCallKind {
FnLike { ast_id: AstId<ast::MacroCall> },
Derive { ast_id: AstId<ast::Item>, derive_name: String },
Derive { ast_id: AstId<ast::Item>, derive_name: String, derive_attr: AttrId },
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]