mirror of
https://github.com/rust-lang/rust-analyzer
synced 2024-11-10 23:24:29 +00:00
Auto merge of #12670 - Veykril:assoc-attrs, r=Veykril
fix: Fix attribute macros on assoc items being discarded with disabled proc macros Fixes https://github.com/rust-lang/rust-analyzer/issues/12669
This commit is contained in:
commit
8489cd7c7b
1 changed files with 23 additions and 17 deletions
|
@ -458,7 +458,6 @@ impl<'a> AssocItemCollector<'a> {
|
||||||
def_map: module_id.def_map(db),
|
def_map: module_id.def_map(db),
|
||||||
container,
|
container,
|
||||||
expander: Expander::new(db, file_id, module_id),
|
expander: Expander::new(db, file_id, module_id),
|
||||||
|
|
||||||
items: Vec::new(),
|
items: Vec::new(),
|
||||||
attr_calls: Vec::new(),
|
attr_calls: Vec::new(),
|
||||||
}
|
}
|
||||||
|
@ -473,6 +472,7 @@ impl<'a> AssocItemCollector<'a> {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// FIXME: proc-macro diagnostics
|
||||||
fn collect(&mut self, tree_id: TreeId, assoc_items: &[AssocItem]) {
|
fn collect(&mut self, tree_id: TreeId, assoc_items: &[AssocItem]) {
|
||||||
let item_tree = tree_id.item_tree(self.db);
|
let item_tree = tree_id.item_tree(self.db);
|
||||||
|
|
||||||
|
@ -482,7 +482,7 @@ impl<'a> AssocItemCollector<'a> {
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
for attr in &*attrs {
|
'attrs: for attr in &*attrs {
|
||||||
let ast_id =
|
let ast_id =
|
||||||
AstId::new(self.expander.current_file_id(), item.ast_id(&item_tree).upcast());
|
AstId::new(self.expander.current_file_id(), item.ast_id(&item_tree).upcast());
|
||||||
let ast_id_with_path = AstIdWithPath { path: (*attr.path).clone(), ast_id };
|
let ast_id_with_path = AstIdWithPath { path: (*attr.path).clone(), ast_id };
|
||||||
|
@ -494,9 +494,17 @@ impl<'a> AssocItemCollector<'a> {
|
||||||
attr,
|
attr,
|
||||||
) {
|
) {
|
||||||
self.attr_calls.push((ast_id, call_id));
|
self.attr_calls.push((ast_id, call_id));
|
||||||
let res = self.expander.enter_expand_id(self.db, call_id);
|
// If proc attribute macro expansion is disabled, skip expanding it here
|
||||||
self.collect_macro_items(res);
|
if !self.db.enable_proc_attr_macros() {
|
||||||
continue 'items;
|
continue 'attrs;
|
||||||
|
}
|
||||||
|
match self.expander.enter_expand_id(self.db, call_id) {
|
||||||
|
ExpandResult { value: Some((mark, mac)), .. } => {
|
||||||
|
self.collect_macro_items(mark, mac);
|
||||||
|
continue 'items;
|
||||||
|
}
|
||||||
|
ExpandResult { .. } => {}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -537,25 +545,23 @@ impl<'a> AssocItemCollector<'a> {
|
||||||
stdx::panic_context::enter(format!("collect_items MacroCall: {}", call));
|
stdx::panic_context::enter(format!("collect_items MacroCall: {}", call));
|
||||||
let res = self.expander.enter_expand(self.db, call);
|
let res = self.expander.enter_expand(self.db, call);
|
||||||
|
|
||||||
if let Ok(res) = res {
|
if let Ok(ExpandResult { value: Some((mark, mac)), .. }) = res {
|
||||||
self.collect_macro_items(res);
|
self.collect_macro_items(mark, mac);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
fn collect_macro_items(&mut self, res: ExpandResult<Option<(Mark, ast::MacroItems)>>) {
|
fn collect_macro_items(&mut self, mark: Mark, mac: ast::MacroItems) {
|
||||||
if let Some((mark, mac)) = res.value {
|
let src: InFile<ast::MacroItems> = self.expander.to_source(mac);
|
||||||
let src: InFile<ast::MacroItems> = self.expander.to_source(mac);
|
let tree_id = item_tree::TreeId::new(src.file_id, None);
|
||||||
let tree_id = item_tree::TreeId::new(src.file_id, None);
|
let item_tree = tree_id.item_tree(self.db);
|
||||||
let item_tree = tree_id.item_tree(self.db);
|
let iter: Vec<_> =
|
||||||
let iter: Vec<_> =
|
item_tree.top_level_items().iter().filter_map(ModItem::as_assoc_item).collect();
|
||||||
item_tree.top_level_items().iter().filter_map(ModItem::as_assoc_item).collect();
|
|
||||||
|
|
||||||
self.collect(tree_id, &iter);
|
self.collect(tree_id, &iter);
|
||||||
|
|
||||||
self.expander.exit(self.db, mark);
|
self.expander.exit(self.db, mark);
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue