Unnamed repository; edit this file 'description' to name the repository.
Diffstat (limited to 'crates/hir-def/src/body/scope.rs')
-rw-r--r--crates/hir-def/src/body/scope.rs31
1 files changed, 28 insertions, 3 deletions
diff --git a/crates/hir-def/src/body/scope.rs b/crates/hir-def/src/body/scope.rs
index 7802bfe51a..63a7a9af20 100644
--- a/crates/hir-def/src/body/scope.rs
+++ b/crates/hir-def/src/body/scope.rs
@@ -1,12 +1,12 @@
//! Name resolution for expressions.
-use hir_expand::name::Name;
+use hir_expand::{name::Name, MacroDefId};
use la_arena::{Arena, ArenaMap, Idx, IdxRange, RawIdx};
use triomphe::Arc;
use crate::{
body::{Body, HygieneId},
db::DefDatabase,
- hir::{Binding, BindingId, Expr, ExprId, LabelId, Pat, PatId, Statement},
+ hir::{Binding, BindingId, Expr, ExprId, Item, LabelId, Pat, PatId, Statement},
BlockId, ConstBlockId, DefWithBodyId,
};
@@ -45,6 +45,8 @@ pub struct ScopeData {
parent: Option<ScopeId>,
block: Option<BlockId>,
label: Option<(LabelId, Name)>,
+ // FIXME: We can compress this with an enum for this and `label`/`block` if memory usage matters.
+ macro_def: Option<Box<MacroDefId>>,
entries: IdxRange<ScopeEntry>,
}
@@ -67,6 +69,12 @@ impl ExprScopes {
self.scopes[scope].block
}
+ /// If `scope` refers to a macro def scope, returns the corresponding `MacroId`.
+ #[allow(clippy::borrowed_box)] // If we return `&MacroDefId` we need to move it, this way we just clone the `Box`.
+ pub fn macro_def(&self, scope: ScopeId) -> Option<&Box<MacroDefId>> {
+ self.scopes[scope].macro_def.as_ref()
+ }
+
/// If `scope` refers to a labeled expression scope, returns the corresponding `Label`.
pub fn label(&self, scope: ScopeId) -> Option<(LabelId, Name)> {
self.scopes[scope].label.clone()
@@ -119,6 +127,7 @@ impl ExprScopes {
parent: None,
block: None,
label: None,
+ macro_def: None,
entries: empty_entries(self.scope_entries.len()),
})
}
@@ -128,6 +137,7 @@ impl ExprScopes {
parent: Some(parent),
block: None,
label: None,
+ macro_def: None,
entries: empty_entries(self.scope_entries.len()),
})
}
@@ -137,6 +147,7 @@ impl ExprScopes {
parent: Some(parent),
block: None,
label,
+ macro_def: None,
entries: empty_entries(self.scope_entries.len()),
})
}
@@ -151,6 +162,17 @@ impl ExprScopes {
parent: Some(parent),
block,
label,
+ macro_def: None,
+ entries: empty_entries(self.scope_entries.len()),
+ })
+ }
+
+ fn new_macro_def_scope(&mut self, parent: ScopeId, macro_id: Box<MacroDefId>) -> ScopeId {
+ self.scopes.alloc(ScopeData {
+ parent: Some(parent),
+ block: None,
+ label: None,
+ macro_def: Some(macro_id),
entries: empty_entries(self.scope_entries.len()),
})
}
@@ -217,7 +239,10 @@ fn compute_block_scopes(
Statement::Expr { expr, .. } => {
compute_expr_scopes(*expr, body, scopes, scope, resolve_const_block);
}
- Statement::Item => (),
+ Statement::Item(Item::MacroDef(macro_id)) => {
+ *scope = scopes.new_macro_def_scope(*scope, macro_id.clone());
+ }
+ Statement::Item(Item::Other) => (),
}
}
if let Some(expr) = tail {