mirror of
https://github.com/rust-lang/rust.git
synced 2025-05-14 02:49:40 +00:00
resolve/expand: Rename some things for clarity and add comments
This commit is contained in:
parent
a83c35692f
commit
93d369bc2b
@ -140,11 +140,23 @@ impl<'a> base::Resolver for Resolver<'a> {
|
|||||||
ImportResolver { r: self }.resolve_imports()
|
ImportResolver { r: self }.resolve_imports()
|
||||||
}
|
}
|
||||||
|
|
||||||
fn resolve_macro_invocation(&mut self, invoc: &Invocation, invoc_id: ExpnId, force: bool)
|
fn resolve_macro_invocation(
|
||||||
-> Result<Option<Lrc<SyntaxExtension>>, Indeterminate> {
|
&mut self, invoc: &Invocation, eager_expansion_root: ExpnId, force: bool
|
||||||
let inherited_parent_scope = self.invocation_parent_scopes[&invoc_id];
|
) -> Result<Option<Lrc<SyntaxExtension>>, Indeterminate> {
|
||||||
let parent_scope = *self.invocation_parent_scopes.entry(invoc.expansion_data.id)
|
let invoc_id = invoc.expansion_data.id;
|
||||||
.or_insert(inherited_parent_scope);
|
let parent_scope = match self.invocation_parent_scopes.get(&invoc_id) {
|
||||||
|
Some(parent_scope) => *parent_scope,
|
||||||
|
None => {
|
||||||
|
// If there's no entry in the table, then we are resolving an eagerly expanded
|
||||||
|
// macro, which should inherit its parent scope from its eager expansion root -
|
||||||
|
// the macro that requested this eager expansion.
|
||||||
|
let parent_scope = *self.invocation_parent_scopes.get(&eager_expansion_root)
|
||||||
|
.expect("non-eager expansion without a parent scope");
|
||||||
|
self.invocation_parent_scopes.insert(invoc_id, parent_scope);
|
||||||
|
parent_scope
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
let (path, kind, derives, after_derive) = match invoc.kind {
|
let (path, kind, derives, after_derive) = match invoc.kind {
|
||||||
InvocationKind::Attr { ref attr, ref derives, after_derive, .. } =>
|
InvocationKind::Attr { ref attr, ref derives, after_derive, .. } =>
|
||||||
(&attr.path, MacroKind::Attr, self.arenas.alloc_ast_paths(derives), after_derive),
|
(&attr.path, MacroKind::Attr, self.arenas.alloc_ast_paths(derives), after_derive),
|
||||||
@ -163,7 +175,7 @@ impl<'a> base::Resolver for Resolver<'a> {
|
|||||||
match self.resolve_macro_path(path, Some(MacroKind::Derive),
|
match self.resolve_macro_path(path, Some(MacroKind::Derive),
|
||||||
&parent_scope, true, force) {
|
&parent_scope, true, force) {
|
||||||
Ok((Some(ref ext), _)) if ext.is_derive_copy => {
|
Ok((Some(ref ext), _)) if ext.is_derive_copy => {
|
||||||
self.add_derives(invoc.expansion_data.id, SpecialDerives::COPY);
|
self.add_derives(invoc_id, SpecialDerives::COPY);
|
||||||
return Ok(None);
|
return Ok(None);
|
||||||
}
|
}
|
||||||
Err(Determinacy::Undetermined) => result = Err(Indeterminate),
|
Err(Determinacy::Undetermined) => result = Err(Indeterminate),
|
||||||
@ -180,19 +192,15 @@ impl<'a> base::Resolver for Resolver<'a> {
|
|||||||
let (ext, res) = self.smart_resolve_macro_path(path, kind, parent_scope, force)?;
|
let (ext, res) = self.smart_resolve_macro_path(path, kind, parent_scope, force)?;
|
||||||
|
|
||||||
let span = invoc.span();
|
let span = invoc.span();
|
||||||
invoc.expansion_data.id.set_expn_data(
|
invoc_id.set_expn_data(ext.expn_data(parent_scope.expansion, span, fast_print_path(path)));
|
||||||
ext.expn_data(parent_scope.expansion, span, fast_print_path(path))
|
|
||||||
);
|
|
||||||
|
|
||||||
if let Res::Def(_, def_id) = res {
|
if let Res::Def(_, def_id) = res {
|
||||||
if after_derive {
|
if after_derive {
|
||||||
self.session.span_err(span, "macro attributes must be placed before `#[derive]`");
|
self.session.span_err(span, "macro attributes must be placed before `#[derive]`");
|
||||||
}
|
}
|
||||||
self.macro_defs.insert(invoc.expansion_data.id, def_id);
|
self.macro_defs.insert(invoc_id, def_id);
|
||||||
let normal_module_def_id =
|
let normal_module_def_id = self.macro_def_scope(invoc_id).normal_ancestor_id;
|
||||||
self.macro_def_scope(invoc.expansion_data.id).normal_ancestor_id;
|
self.definitions.add_parent_module_of_macro_def(invoc_id, normal_module_def_id);
|
||||||
self.definitions.add_parent_module_of_macro_def(invoc.expansion_data.id,
|
|
||||||
normal_module_def_id);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
Ok(Some(ext))
|
Ok(Some(ext))
|
||||||
|
@ -682,8 +682,9 @@ pub trait Resolver {
|
|||||||
|
|
||||||
fn resolve_imports(&mut self);
|
fn resolve_imports(&mut self);
|
||||||
|
|
||||||
fn resolve_macro_invocation(&mut self, invoc: &Invocation, invoc_id: ExpnId, force: bool)
|
fn resolve_macro_invocation(
|
||||||
-> Result<Option<Lrc<SyntaxExtension>>, Indeterminate>;
|
&mut self, invoc: &Invocation, eager_expansion_root: ExpnId, force: bool
|
||||||
|
) -> Result<Option<Lrc<SyntaxExtension>>, Indeterminate>;
|
||||||
|
|
||||||
fn check_unused_macros(&self);
|
fn check_unused_macros(&self);
|
||||||
|
|
||||||
|
@ -305,9 +305,11 @@ impl<'a, 'b> MacroExpander<'a, 'b> {
|
|||||||
continue
|
continue
|
||||||
};
|
};
|
||||||
|
|
||||||
let scope =
|
let eager_expansion_root =
|
||||||
if self.monotonic { invoc.expansion_data.id } else { orig_expansion_data.id };
|
if self.monotonic { invoc.expansion_data.id } else { orig_expansion_data.id };
|
||||||
let ext = match self.cx.resolver.resolve_macro_invocation(&invoc, scope, force) {
|
let ext = match self.cx.resolver.resolve_macro_invocation(
|
||||||
|
&invoc, eager_expansion_root, force
|
||||||
|
) {
|
||||||
Ok(ext) => ext,
|
Ok(ext) => ext,
|
||||||
Err(Indeterminate) => {
|
Err(Indeterminate) => {
|
||||||
undetermined_invocations.push(invoc);
|
undetermined_invocations.push(invoc);
|
||||||
|
Loading…
Reference in New Issue
Block a user