resolve: Privatize all resolver fields
This commit is contained in:
parent
222503a354
commit
fb353f050a
3 changed files with 61 additions and 50 deletions
|
|
@ -6,6 +6,7 @@ use log::{info, warn, log_enabled};
|
|||
use rustc::dep_graph::DepGraph;
|
||||
use rustc::hir;
|
||||
use rustc::hir::lowering::lower_crate;
|
||||
use rustc::hir::map::Definitions;
|
||||
use rustc::hir::def_id::{CrateNum, LOCAL_CRATE};
|
||||
use rustc::lint;
|
||||
use rustc::middle::{self, reachable, resolve_lifetime, stability};
|
||||
|
|
@ -154,7 +155,7 @@ pub fn configure_and_expand(
|
|||
}
|
||||
};
|
||||
box_region_allow_access!(for(), (&mut Resolver<'_>), (&mut resolver));
|
||||
ExpansionResult::from_owned_resolver(resolver)
|
||||
ExpansionResult::from_resolver_outputs(resolver.into_outputs())
|
||||
});
|
||||
result.map(|k| (k, resolver))
|
||||
}
|
||||
|
|
@ -165,42 +166,8 @@ pub struct ExpansionResult {
|
|||
}
|
||||
|
||||
impl ExpansionResult {
|
||||
fn from_owned_resolver(
|
||||
resolver: Resolver<'_>,
|
||||
) -> Self {
|
||||
ExpansionResult {
|
||||
defs: Steal::new(resolver.definitions),
|
||||
resolutions: Steal::new(Resolutions {
|
||||
extern_crate_map: resolver.extern_crate_map,
|
||||
export_map: resolver.export_map,
|
||||
trait_map: resolver.trait_map,
|
||||
glob_map: resolver.glob_map,
|
||||
maybe_unused_trait_imports: resolver.maybe_unused_trait_imports,
|
||||
maybe_unused_extern_crates: resolver.maybe_unused_extern_crates,
|
||||
extern_prelude: resolver.extern_prelude.iter().map(|(ident, entry)| {
|
||||
(ident.name, entry.introduced_by_item)
|
||||
}).collect(),
|
||||
}),
|
||||
}
|
||||
}
|
||||
|
||||
pub fn from_resolver_ref(
|
||||
resolver: &Resolver<'_>,
|
||||
) -> Self {
|
||||
ExpansionResult {
|
||||
defs: Steal::new(resolver.definitions.clone()),
|
||||
resolutions: Steal::new(Resolutions {
|
||||
extern_crate_map: resolver.extern_crate_map.clone(),
|
||||
export_map: resolver.export_map.clone(),
|
||||
trait_map: resolver.trait_map.clone(),
|
||||
glob_map: resolver.glob_map.clone(),
|
||||
maybe_unused_trait_imports: resolver.maybe_unused_trait_imports.clone(),
|
||||
maybe_unused_extern_crates: resolver.maybe_unused_extern_crates.clone(),
|
||||
extern_prelude: resolver.extern_prelude.iter().map(|(ident, entry)| {
|
||||
(ident.name, entry.introduced_by_item)
|
||||
}).collect(),
|
||||
}),
|
||||
}
|
||||
fn from_resolver_outputs((defs, resolutions): (Definitions, Resolutions)) -> Self {
|
||||
ExpansionResult { defs: Steal::new(defs), resolutions: Steal::new(resolutions) }
|
||||
}
|
||||
}
|
||||
|
||||
|
|
@ -213,7 +180,7 @@ impl BoxedResolver {
|
|||
Err(resolver) => {
|
||||
let resolver = &*resolver;
|
||||
resolver.borrow_mut().access(|resolver| {
|
||||
ExpansionResult::from_resolver_ref(resolver)
|
||||
ExpansionResult::from_resolver_outputs(resolver.clone_outputs())
|
||||
})
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -831,12 +831,12 @@ pub struct Resolver<'a> {
|
|||
session: &'a Session,
|
||||
cstore: &'a CStore,
|
||||
|
||||
pub definitions: Definitions,
|
||||
definitions: Definitions,
|
||||
|
||||
pub graph_root: Module<'a>,
|
||||
graph_root: Module<'a>,
|
||||
|
||||
prelude: Option<Module<'a>>,
|
||||
pub extern_prelude: FxHashMap<Ident, ExternPreludeEntry<'a>>,
|
||||
extern_prelude: FxHashMap<Ident, ExternPreludeEntry<'a>>,
|
||||
|
||||
/// N.B., this is used only for better diagnostics, not name resolution itself.
|
||||
has_self: FxHashSet<DefId>,
|
||||
|
|
@ -869,9 +869,9 @@ pub struct Resolver<'a> {
|
|||
label_res_map: NodeMap<NodeId>,
|
||||
|
||||
/// `CrateNum` resolutions of `extern crate` items.
|
||||
pub extern_crate_map: NodeMap<CrateNum>,
|
||||
pub export_map: ExportMap<NodeId>,
|
||||
pub trait_map: TraitMap,
|
||||
extern_crate_map: NodeMap<CrateNum>,
|
||||
export_map: ExportMap<NodeId>,
|
||||
trait_map: TraitMap,
|
||||
|
||||
/// A map from nodes to anonymous modules.
|
||||
/// Anonymous modules are pseudo-modules that are implicitly created around items
|
||||
|
|
@ -898,11 +898,11 @@ pub struct Resolver<'a> {
|
|||
underscore_disambiguator: u32,
|
||||
|
||||
/// Maps glob imports to the names of items actually imported.
|
||||
pub glob_map: GlobMap,
|
||||
glob_map: GlobMap,
|
||||
|
||||
used_imports: FxHashSet<(NodeId, Namespace)>,
|
||||
pub maybe_unused_trait_imports: NodeSet,
|
||||
pub maybe_unused_extern_crates: Vec<(NodeId, Span)>,
|
||||
maybe_unused_trait_imports: NodeSet,
|
||||
maybe_unused_extern_crates: Vec<(NodeId, Span)>,
|
||||
|
||||
/// Privacy errors are delayed until the end in order to deduplicate them.
|
||||
privacy_errors: Vec<PrivacyError<'a>>,
|
||||
|
|
@ -920,7 +920,7 @@ pub struct Resolver<'a> {
|
|||
macro_names: FxHashSet<Ident>,
|
||||
builtin_macros: FxHashMap<Name, SyntaxExtension>,
|
||||
macro_use_prelude: FxHashMap<Name, &'a NameBinding<'a>>,
|
||||
pub all_macros: FxHashMap<Name, Res>,
|
||||
all_macros: FxHashMap<Name, Res>,
|
||||
macro_map: FxHashMap<DefId, Lrc<SyntaxExtension>>,
|
||||
dummy_ext_bang: Lrc<SyntaxExtension>,
|
||||
dummy_ext_derive: Lrc<SyntaxExtension>,
|
||||
|
|
@ -1236,6 +1236,40 @@ impl<'a> Resolver<'a> {
|
|||
Default::default()
|
||||
}
|
||||
|
||||
pub fn into_outputs(self) -> (Definitions, ty::Resolutions) {
|
||||
(
|
||||
self.definitions,
|
||||
ty::Resolutions {
|
||||
extern_crate_map: self.extern_crate_map,
|
||||
export_map: self.export_map,
|
||||
trait_map: self.trait_map,
|
||||
glob_map: self.glob_map,
|
||||
maybe_unused_trait_imports: self.maybe_unused_trait_imports,
|
||||
maybe_unused_extern_crates: self.maybe_unused_extern_crates,
|
||||
extern_prelude: self.extern_prelude.iter().map(|(ident, entry)| {
|
||||
(ident.name, entry.introduced_by_item)
|
||||
}).collect(),
|
||||
},
|
||||
)
|
||||
}
|
||||
|
||||
pub fn clone_outputs(&self) -> (Definitions, ty::Resolutions) {
|
||||
(
|
||||
self.definitions.clone(),
|
||||
ty::Resolutions {
|
||||
extern_crate_map: self.extern_crate_map.clone(),
|
||||
export_map: self.export_map.clone(),
|
||||
trait_map: self.trait_map.clone(),
|
||||
glob_map: self.glob_map.clone(),
|
||||
maybe_unused_trait_imports: self.maybe_unused_trait_imports.clone(),
|
||||
maybe_unused_extern_crates: self.maybe_unused_extern_crates.clone(),
|
||||
extern_prelude: self.extern_prelude.iter().map(|(ident, entry)| {
|
||||
(ident.name, entry.introduced_by_item)
|
||||
}).collect(),
|
||||
},
|
||||
)
|
||||
}
|
||||
|
||||
fn non_macro_attr(&self, mark_used: bool) -> Lrc<SyntaxExtension> {
|
||||
self.non_macro_attrs[mark_used as usize].clone()
|
||||
}
|
||||
|
|
@ -2808,6 +2842,16 @@ impl<'a> Resolver<'a> {
|
|||
seg.id = self.session.next_node_id();
|
||||
seg
|
||||
}
|
||||
|
||||
// For rustdoc.
|
||||
pub fn graph_root(&self) -> Module<'a> {
|
||||
self.graph_root
|
||||
}
|
||||
|
||||
// For rustdoc.
|
||||
pub fn all_macros(&self) -> &FxHashMap<Name, Res> {
|
||||
&self.all_macros
|
||||
}
|
||||
}
|
||||
|
||||
fn names_to_string(names: &[Name]) -> String {
|
||||
|
|
|
|||
|
|
@ -432,13 +432,13 @@ fn macro_resolve(cx: &DocContext<'_>, path_str: &str) -> Option<Res> {
|
|||
let path = ast::Path::from_ident(Ident::from_str(path_str));
|
||||
cx.enter_resolver(|resolver| {
|
||||
if let Ok((Some(ext), res)) = resolver.resolve_macro_path(
|
||||
&path, None, &ParentScope::module(resolver.graph_root), false, false
|
||||
&path, None, &ParentScope::module(resolver.graph_root()), false, false
|
||||
) {
|
||||
if let SyntaxExtensionKind::LegacyBang { .. } = ext.kind {
|
||||
return Some(res.map_id(|_| panic!("unexpected id")));
|
||||
}
|
||||
}
|
||||
if let Some(res) = resolver.all_macros.get(&Symbol::intern(path_str)) {
|
||||
if let Some(res) = resolver.all_macros().get(&Symbol::intern(path_str)) {
|
||||
return Some(res.map_id(|_| panic!("unexpected id")));
|
||||
}
|
||||
None
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue