mirror of
https://github.com/rust-lang/rust.git
synced 2024-11-25 16:24:46 +00:00
resolve: Move some code around
This commit is contained in:
parent
fe2524cb9c
commit
ab4cc2db56
@ -868,6 +868,7 @@ impl<'a, 'b> BuildReducedGraphVisitor<'a, 'b> {
|
||||
// This is only a guess, two equivalent idents may incorrectly get different gensyms here.
|
||||
let ident = ident.gensym_if_underscore();
|
||||
let expansion = ExpnId::root(); // FIXME(jseyfried) intercrate hygiene
|
||||
// Record primary definitions.
|
||||
match res {
|
||||
Res::Def(kind @ DefKind::Mod, def_id)
|
||||
| Res::Def(kind @ DefKind::Enum, def_id)
|
||||
@ -879,7 +880,9 @@ impl<'a, 'b> BuildReducedGraphVisitor<'a, 'b> {
|
||||
span);
|
||||
self.r.define(parent, ident, TypeNS, (module, vis, DUMMY_SP, expansion));
|
||||
}
|
||||
Res::Def(DefKind::Variant, _)
|
||||
Res::Def(DefKind::Struct, _)
|
||||
| Res::Def(DefKind::Union, _)
|
||||
| Res::Def(DefKind::Variant, _)
|
||||
| Res::Def(DefKind::TyAlias, _)
|
||||
| Res::Def(DefKind::ForeignTy, _)
|
||||
| Res::Def(DefKind::OpaqueTy, _)
|
||||
@ -887,43 +890,40 @@ impl<'a, 'b> BuildReducedGraphVisitor<'a, 'b> {
|
||||
| Res::Def(DefKind::AssocTy, _)
|
||||
| Res::Def(DefKind::AssocOpaqueTy, _)
|
||||
| Res::PrimTy(..)
|
||||
| Res::ToolMod => {
|
||||
self.r.define(parent, ident, TypeNS, (res, vis, DUMMY_SP, expansion));
|
||||
}
|
||||
| Res::ToolMod =>
|
||||
self.r.define(parent, ident, TypeNS, (res, vis, DUMMY_SP, expansion)),
|
||||
Res::Def(DefKind::Fn, _)
|
||||
| Res::Def(DefKind::Method, _)
|
||||
| Res::Def(DefKind::Static, _)
|
||||
| Res::Def(DefKind::Const, _)
|
||||
| Res::Def(DefKind::AssocConst, _)
|
||||
| Res::Def(DefKind::Ctor(CtorOf::Variant, ..), _) => {
|
||||
self.r.define(parent, ident, ValueNS, (res, vis, DUMMY_SP, expansion));
|
||||
}
|
||||
Res::Def(DefKind::Ctor(CtorOf::Struct, ..), def_id) => {
|
||||
self.r.define(parent, ident, ValueNS, (res, vis, DUMMY_SP, expansion));
|
||||
|
||||
if let Some(struct_def_id) =
|
||||
self.r.cstore.def_key(def_id).parent
|
||||
.map(|index| DefId { krate: def_id.krate, index: index }) {
|
||||
self.r.struct_constructors.insert(struct_def_id, (res, vis));
|
||||
}
|
||||
| Res::Def(DefKind::Ctor(..), _) =>
|
||||
self.r.define(parent, ident, ValueNS, (res, vis, DUMMY_SP, expansion)),
|
||||
Res::Def(DefKind::Macro(..), _)
|
||||
| Res::NonMacroAttr(..) =>
|
||||
self.r.define(parent, ident, MacroNS, (res, vis, DUMMY_SP, expansion)),
|
||||
Res::Def(DefKind::TyParam, _) | Res::Def(DefKind::ConstParam, _)
|
||||
| Res::Local(..) | Res::SelfTy(..) | Res::SelfCtor(..) | Res::Err =>
|
||||
bug!("unexpected resolution: {:?}", res)
|
||||
}
|
||||
// Record some extra data for better diagnostics.
|
||||
match res {
|
||||
Res::Def(DefKind::Struct, def_id) | Res::Def(DefKind::Union, def_id) => {
|
||||
let field_names = self.r.cstore.struct_field_names_untracked(def_id);
|
||||
self.insert_field_names(def_id, field_names);
|
||||
}
|
||||
Res::Def(DefKind::Method, def_id) => {
|
||||
self.r.define(parent, ident, ValueNS, (res, vis, DUMMY_SP, expansion));
|
||||
|
||||
if self.r.cstore.associated_item_cloned_untracked(def_id).method_has_self_argument {
|
||||
self.r.has_self.insert(def_id);
|
||||
}
|
||||
}
|
||||
Res::Def(DefKind::Struct, def_id) | Res::Def(DefKind::Union, def_id) => {
|
||||
self.r.define(parent, ident, TypeNS, (res, vis, DUMMY_SP, expansion));
|
||||
|
||||
// Record field names for error reporting.
|
||||
let field_names = self.r.cstore.struct_field_names_untracked(def_id);
|
||||
self.insert_field_names(def_id, field_names);
|
||||
Res::Def(DefKind::Ctor(CtorOf::Struct, ..), def_id) => {
|
||||
let parent = self.r.cstore.def_key(def_id).parent;
|
||||
if let Some(struct_def_id) = parent.map(|index| DefId { index, ..def_id }) {
|
||||
self.r.struct_constructors.insert(struct_def_id, (res, vis));
|
||||
}
|
||||
}
|
||||
Res::Def(DefKind::Macro(..), _) | Res::NonMacroAttr(..) => {
|
||||
self.r.define(parent, ident, MacroNS, (res, vis, DUMMY_SP, expansion));
|
||||
}
|
||||
_ => bug!("unexpected resolution: {:?}", res)
|
||||
_ => {}
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -73,23 +73,23 @@ crate fn add_typo_suggestion(
|
||||
false
|
||||
}
|
||||
|
||||
crate fn add_module_candidates<'a>(
|
||||
resolver: &mut Resolver<'a>,
|
||||
module: Module<'a>,
|
||||
names: &mut Vec<TypoSuggestion>,
|
||||
filter_fn: &impl Fn(Res) -> bool,
|
||||
) {
|
||||
for (&(ident, _), resolution) in resolver.resolutions(module).borrow().iter() {
|
||||
if let Some(binding) = resolution.borrow().binding {
|
||||
let res = binding.res();
|
||||
if filter_fn(res) {
|
||||
names.push(TypoSuggestion::from_res(ident.name, res));
|
||||
impl<'a> Resolver<'a> {
|
||||
crate fn add_module_candidates(
|
||||
&mut self,
|
||||
module: Module<'a>,
|
||||
names: &mut Vec<TypoSuggestion>,
|
||||
filter_fn: &impl Fn(Res) -> bool,
|
||||
) {
|
||||
for (&(ident, _), resolution) in self.resolutions(module).borrow().iter() {
|
||||
if let Some(binding) = resolution.borrow().binding {
|
||||
let res = binding.res();
|
||||
if filter_fn(res) {
|
||||
names.push(TypoSuggestion::from_res(ident.name, res));
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
impl<'a> Resolver<'a> {
|
||||
/// Combines an error with provided span and emits it.
|
||||
///
|
||||
/// This takes the error provided, combines it with the span and any additional spans inside the
|
||||
@ -405,10 +405,10 @@ impl<'a> Resolver<'a> {
|
||||
Scope::CrateRoot => {
|
||||
let root_ident = Ident::new(kw::PathRoot, ident.span);
|
||||
let root_module = this.resolve_crate_root(root_ident);
|
||||
add_module_candidates(this, root_module, &mut suggestions, filter_fn);
|
||||
this.add_module_candidates(root_module, &mut suggestions, filter_fn);
|
||||
}
|
||||
Scope::Module(module) => {
|
||||
add_module_candidates(this, module, &mut suggestions, filter_fn);
|
||||
this.add_module_candidates(module, &mut suggestions, filter_fn);
|
||||
}
|
||||
Scope::MacroUsePrelude => {
|
||||
suggestions.extend(this.macro_use_prelude.iter().filter_map(|(name, binding)| {
|
||||
@ -456,7 +456,7 @@ impl<'a> Resolver<'a> {
|
||||
Scope::StdLibPrelude => {
|
||||
if let Some(prelude) = this.prelude {
|
||||
let mut tmp_suggestions = Vec::new();
|
||||
add_module_candidates(this, prelude, &mut tmp_suggestions, filter_fn);
|
||||
this.add_module_candidates(prelude, &mut tmp_suggestions, filter_fn);
|
||||
suggestions.extend(tmp_suggestions.into_iter().filter(|s| {
|
||||
use_prelude || this.is_builtin_macro(s.res)
|
||||
}));
|
||||
|
@ -1,8 +1,7 @@
|
||||
use crate::{CrateLint, Module, ModuleKind, ModuleOrUniformRoot};
|
||||
use crate::{PathResult, PathSource, Segment};
|
||||
use crate::path_names_to_string;
|
||||
use crate::diagnostics::{add_typo_suggestion, add_module_candidates};
|
||||
use crate::diagnostics::{ImportSuggestion, TypoSuggestion};
|
||||
use crate::diagnostics::{add_typo_suggestion, ImportSuggestion, TypoSuggestion};
|
||||
use crate::late::{LateResolutionVisitor, RibKind};
|
||||
|
||||
use errors::{Applicability, DiagnosticBuilder, DiagnosticId};
|
||||
@ -548,7 +547,7 @@ impl<'a> LateResolutionVisitor<'a, '_> {
|
||||
// Items in scope
|
||||
if let RibKind::ModuleRibKind(module) = rib.kind {
|
||||
// Items from this module
|
||||
add_module_candidates(self.r, module, &mut names, &filter_fn);
|
||||
self.r.add_module_candidates(module, &mut names, &filter_fn);
|
||||
|
||||
if let ModuleKind::Block(..) = module.kind {
|
||||
// We can see through blocks
|
||||
@ -577,7 +576,7 @@ impl<'a> LateResolutionVisitor<'a, '_> {
|
||||
}));
|
||||
|
||||
if let Some(prelude) = self.r.prelude {
|
||||
add_module_candidates(self.r, prelude, &mut names, &filter_fn);
|
||||
self.r.add_module_candidates(prelude, &mut names, &filter_fn);
|
||||
}
|
||||
}
|
||||
break;
|
||||
@ -599,7 +598,7 @@ impl<'a> LateResolutionVisitor<'a, '_> {
|
||||
mod_path, Some(TypeNS), false, span, CrateLint::No
|
||||
) {
|
||||
if let ModuleOrUniformRoot::Module(module) = module {
|
||||
add_module_candidates(self.r, module, &mut names, &filter_fn);
|
||||
self.r.add_module_candidates(module, &mut names, &filter_fn);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -59,6 +59,7 @@ use std::collections::BTreeSet;
|
||||
use rustc_data_structures::ptr_key::PtrKey;
|
||||
use rustc_data_structures::sync::Lrc;
|
||||
|
||||
use build_reduced_graph::BuildReducedGraphVisitor;
|
||||
use diagnostics::{Suggestion, ImportSuggestion};
|
||||
use diagnostics::{find_span_of_binding_until_next_binding, extend_span_to_previous_binding};
|
||||
use late::{PathSource, Rib, RibKind::*};
|
||||
@ -1257,6 +1258,25 @@ impl<'a> Resolver<'a> {
|
||||
self.arenas.alloc_module(module)
|
||||
}
|
||||
|
||||
fn resolutions(&mut self, module: Module<'a>) -> &'a Resolutions<'a> {
|
||||
if module.populate_on_access.get() {
|
||||
module.populate_on_access.set(false);
|
||||
let def_id = module.def_id().expect("unpopulated module without a def-id");
|
||||
for child in self.cstore.item_children_untracked(def_id, self.session) {
|
||||
let child = child.map_id(|_| panic!("unexpected id"));
|
||||
BuildReducedGraphVisitor { parent_scope: self.dummy_parent_scope(), r: self }
|
||||
.build_reduced_graph_for_external_crate_res(module, child);
|
||||
}
|
||||
}
|
||||
&module.lazy_resolutions
|
||||
}
|
||||
|
||||
fn resolution(&mut self, module: Module<'a>, ident: Ident, ns: Namespace)
|
||||
-> &'a RefCell<NameResolution<'a>> {
|
||||
*self.resolutions(module).borrow_mut().entry((ident.modern(), ns))
|
||||
.or_insert_with(|| self.arenas.alloc_name_resolution())
|
||||
}
|
||||
|
||||
fn record_use(&mut self, ident: Ident, ns: Namespace,
|
||||
used_binding: &'a NameBinding<'a>, is_lexical_scope: bool) {
|
||||
if let Some((b2, kind)) = used_binding.ambiguity {
|
||||
|
@ -7,10 +7,8 @@ use crate::{CrateLint, Module, ModuleOrUniformRoot, PerNS, ScopeSet, ParentScope
|
||||
use crate::Determinacy::{self, *};
|
||||
use crate::Namespace::{self, TypeNS, MacroNS};
|
||||
use crate::{NameBinding, NameBindingKind, ToNameBinding, PathResult, PrivacyError};
|
||||
use crate::{Resolutions, Resolver, ResolutionError, Segment};
|
||||
use crate::{Resolver, ResolutionError, Segment, ModuleKind};
|
||||
use crate::{names_to_string, module_to_string};
|
||||
use crate::ModuleKind;
|
||||
use crate::build_reduced_graph::BuildReducedGraphVisitor;
|
||||
use crate::diagnostics::Suggestion;
|
||||
|
||||
use errors::Applicability;
|
||||
@ -38,7 +36,7 @@ use syntax_pos::{MultiSpan, Span};
|
||||
|
||||
use log::*;
|
||||
|
||||
use std::cell::{Cell, RefCell};
|
||||
use std::cell::Cell;
|
||||
use std::{mem, ptr};
|
||||
|
||||
type Res = def::Res<NodeId>;
|
||||
@ -162,25 +160,6 @@ impl<'a> NameResolution<'a> {
|
||||
}
|
||||
|
||||
impl<'a> Resolver<'a> {
|
||||
crate fn resolutions(&mut self, module: Module<'a>) -> &'a Resolutions<'a> {
|
||||
if module.populate_on_access.get() {
|
||||
module.populate_on_access.set(false);
|
||||
let def_id = module.def_id().expect("unpopulated module without a def-id");
|
||||
for child in self.cstore.item_children_untracked(def_id, self.session) {
|
||||
let child = child.map_id(|_| panic!("unexpected id"));
|
||||
BuildReducedGraphVisitor { parent_scope: self.dummy_parent_scope(), r: self }
|
||||
.build_reduced_graph_for_external_crate_res(module, child);
|
||||
}
|
||||
}
|
||||
&module.lazy_resolutions
|
||||
}
|
||||
|
||||
crate fn resolution(&mut self, module: Module<'a>, ident: Ident, ns: Namespace)
|
||||
-> &'a RefCell<NameResolution<'a>> {
|
||||
*self.resolutions(module).borrow_mut().entry((ident.modern(), ns))
|
||||
.or_insert_with(|| self.arenas.alloc_name_resolution())
|
||||
}
|
||||
|
||||
crate fn resolve_ident_in_module_unadjusted(
|
||||
&mut self,
|
||||
module: ModuleOrUniformRoot<'a>,
|
||||
@ -1039,7 +1018,8 @@ impl<'a, 'b> ImportResolver<'a, 'b> {
|
||||
|
||||
return if all_ns_failed {
|
||||
let resolutions = match module {
|
||||
ModuleOrUniformRoot::Module(module) => Some(self.r.resolutions(module).borrow()),
|
||||
ModuleOrUniformRoot::Module(module) =>
|
||||
Some(self.r.resolutions(module).borrow()),
|
||||
_ => None,
|
||||
};
|
||||
let resolutions = resolutions.as_ref().into_iter().flat_map(|r| r.iter());
|
||||
@ -1292,8 +1272,8 @@ impl<'a, 'b> ImportResolver<'a, 'b> {
|
||||
|
||||
// Ensure that `resolutions` isn't borrowed during `try_define`,
|
||||
// since it might get updated via a glob cycle.
|
||||
let bindings = self.r.resolutions(module).borrow().iter().filter_map(|(&ident, resolution)| {
|
||||
resolution.borrow().binding().map(|binding| (ident, binding))
|
||||
let bindings = self.r.resolutions(module).borrow().iter().filter_map(|(ident, resolution)| {
|
||||
resolution.borrow().binding().map(|binding| (*ident, binding))
|
||||
}).collect::<Vec<_>>();
|
||||
for ((mut ident, ns), binding) in bindings {
|
||||
let scope = match ident.span.reverse_glob_adjust(module.expansion, directive.span) {
|
||||
|
Loading…
Reference in New Issue
Block a user