提交 ffedcec4 编写于 作者: V Vadim Petrochenkov

resolve: Pass full `Finalize` in nearly all cases

上级 900607f4
......@@ -279,7 +279,7 @@ fn hygienic_lexical_parent(
mut ident: Ident,
ns: Namespace,
parent_scope: &ParentScope<'a>,
finalize_full: Option<Finalize>,
finalize: Option<Finalize>,
ribs: &[Rib<'a>],
unusable_binding: Option<&'a NameBinding<'a>>,
) -> Option<LexicalScopeBinding<'a>> {
......@@ -302,7 +302,6 @@ fn hygienic_lexical_parent(
let normalized_ident = Ident { span: normalized_span, ..ident };
// Walk backwards up the ribs in scope.
let finalize = finalize_full.map(|finalize| finalize.path_span);
let mut module = self.graph_root;
for i in (0..ribs.len()).rev() {
debug!("walk rib\n{:?}", ribs[i].bindings);
......@@ -316,7 +315,7 @@ fn hygienic_lexical_parent(
i,
rib_ident,
*res,
finalize,
finalize.map(|finalize| finalize.path_span),
*original_rib_ident_def,
ribs,
)));
......@@ -354,7 +353,7 @@ fn hygienic_lexical_parent(
}
self.early_resolve_ident_in_lexical_scope(
orig_ident,
ScopeSet::Late(ns, module, finalize_full.map(|finalize| finalize.node_id)),
ScopeSet::Late(ns, module, finalize.map(|finalize| finalize.node_id)),
parent_scope,
finalize,
finalize.is_some(),
......@@ -376,7 +375,7 @@ fn hygienic_lexical_parent(
orig_ident: Ident,
scope_set: ScopeSet<'a>,
parent_scope: &ParentScope<'a>,
finalize: Option<Span>,
finalize: Option<Finalize>,
force: bool,
last_import_segment: bool,
unusable_binding: Option<&'a NameBinding<'a>>,
......@@ -742,7 +741,7 @@ struct Flags: u8 {
ident: Ident,
ns: Namespace,
parent_scope: &ParentScope<'a>,
finalize: Option<Span>,
finalize: Option<Finalize>,
// We are resolving a last import segment during import validation.
last_import_segment: bool,
// This binding should be ignored during in-module resolution, so that we don't get
......@@ -768,7 +767,7 @@ fn resolve_ident_in_module_ext(
mut ident: Ident,
ns: Namespace,
parent_scope: &ParentScope<'a>,
finalize: Option<Span>,
finalize: Option<Finalize>,
last_import_segment: bool,
unusable_binding: Option<&'a NameBinding<'a>>,
) -> Result<&'a NameBinding<'a>, (Determinacy, Weak)> {
......@@ -808,7 +807,7 @@ fn resolve_ident_in_module_unadjusted(
ident: Ident,
ns: Namespace,
parent_scope: &ParentScope<'a>,
finalize: Option<Span>,
finalize: Option<Finalize>,
last_import_segment: bool,
unusable_binding: Option<&'a NameBinding<'a>>,
) -> Result<&'a NameBinding<'a>, Determinacy> {
......@@ -835,7 +834,7 @@ fn resolve_ident_in_module_unadjusted_ext(
ns: Namespace,
parent_scope: &ParentScope<'a>,
restricted_shadowing: bool,
finalize: Option<Span>,
finalize: Option<Finalize>,
last_import_segment: bool,
unusable_binding: Option<&'a NameBinding<'a>>,
) -> Result<&'a NameBinding<'a>, (Determinacy, Weak)> {
......@@ -901,7 +900,7 @@ fn resolve_ident_in_module_unadjusted_ext(
let resolution =
self.resolution(module, key).try_borrow_mut().map_err(|_| (Determined, Weak::No))?; // This happens when there is a cycle of imports.
if let Some(path_span) = finalize {
if let Some(Finalize { path_span, .. }) = finalize {
// If the primary binding is unusable, search further and return the shadowed glob
// binding if it exists. What we really want here is having two separate scopes in
// a module - one for non-globs and one for globs, but until that's done use this
......@@ -1391,13 +1390,12 @@ fn validate_res_from_ribs(
path: &[Segment],
opt_ns: Option<Namespace>, // `None` indicates a module path in import
parent_scope: &ParentScope<'a>,
finalize_full: Option<Finalize>,
finalize: Option<Finalize>,
ribs: Option<&PerNS<Vec<Rib<'a>>>>,
unusable_binding: Option<&'a NameBinding<'a>>,
) -> PathResult<'a> {
debug!("resolve_path(path={:?}, opt_ns={:?}, finalize={:?})", path, opt_ns, finalize_full);
debug!("resolve_path(path={:?}, opt_ns={:?}, finalize={:?})", path, opt_ns, finalize);
let finalize = finalize_full.map(|finalize| finalize.path_span);
let mut module = None;
let mut allow_super = true;
let mut second_binding = None;
......@@ -1507,7 +1505,7 @@ enum FindBindingResult<'a> {
ident,
ns,
parent_scope,
finalize_full,
finalize,
&ribs[ns],
unusable_binding,
) {
......@@ -1566,7 +1564,7 @@ enum FindBindingResult<'a> {
} else if res == Res::Err {
return PathResult::NonModule(PartialRes::new(Res::Err));
} else if opt_ns.is_some() && (is_last || maybe_assoc) {
self.lint_if_path_starts_with_module(finalize_full, path, second_binding);
self.lint_if_path_starts_with_module(finalize, path, second_binding);
return PathResult::NonModule(PartialRes::with_unresolved_segments(
res,
path.len() - i - 1,
......@@ -1609,7 +1607,7 @@ enum FindBindingResult<'a> {
}
}
self.lint_if_path_starts_with_module(finalize_full, path, second_binding);
self.lint_if_path_starts_with_module(finalize, path, second_binding);
PathResult::Module(match module {
Some(module) => module,
......
......@@ -717,7 +717,7 @@ fn finalize_import(&mut self, import: &'b Import<'b>) -> Option<UnresolvedImport
ident,
ns,
&import.parent_scope,
Some(import.span),
finalize,
true,
target_bindings[ns].get(),
);
......@@ -778,7 +778,7 @@ fn finalize_import(&mut self, import: &'b Import<'b>) -> Option<UnresolvedImport
ident,
ns,
&import.parent_scope,
Some(import.span),
finalize,
false,
None,
);
......
......@@ -708,7 +708,7 @@ pub fn resolve_macro_path(
ident,
ScopeSet::Macro(kind),
&parent_scope,
Some(ident.span),
Some(Finalize::new(ast::CRATE_NODE_ID, ident.span)),
true,
false,
None,
......@@ -751,7 +751,7 @@ pub fn resolve_macro_path(
ident,
ScopeSet::Macro(MacroKind::Attr),
&parent_scope,
Some(ident.span),
Some(Finalize::new(ast::CRATE_NODE_ID, ident.span)),
true,
false,
None,
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册