rustc: Parameterize ty::Visibility
over used ID
It allows using `LocalDefId` instead of `DefId` when possible, and also encode cheaper `Visibility<DefIndex>` into metadata.
This commit is contained in:
parent
0568b0a3de
commit
d8d3b83e3a
24 changed files with 170 additions and 127 deletions
|
@ -39,24 +39,26 @@ use std::ptr;
|
|||
|
||||
type Res = def::Res<NodeId>;
|
||||
|
||||
impl<'a> ToNameBinding<'a> for (Module<'a>, ty::Visibility, Span, LocalExpnId) {
|
||||
impl<'a, Id: Into<DefId>> ToNameBinding<'a>
|
||||
for (Module<'a>, ty::Visibility<Id>, Span, LocalExpnId)
|
||||
{
|
||||
fn to_name_binding(self, arenas: &'a ResolverArenas<'a>) -> &'a NameBinding<'a> {
|
||||
arenas.alloc_name_binding(NameBinding {
|
||||
kind: NameBindingKind::Module(self.0),
|
||||
ambiguity: None,
|
||||
vis: self.1,
|
||||
vis: self.1.to_def_id(),
|
||||
span: self.2,
|
||||
expansion: self.3,
|
||||
})
|
||||
}
|
||||
}
|
||||
|
||||
impl<'a> ToNameBinding<'a> for (Res, ty::Visibility, Span, LocalExpnId) {
|
||||
impl<'a, Id: Into<DefId>> ToNameBinding<'a> for (Res, ty::Visibility<Id>, Span, LocalExpnId) {
|
||||
fn to_name_binding(self, arenas: &'a ResolverArenas<'a>) -> &'a NameBinding<'a> {
|
||||
arenas.alloc_name_binding(NameBinding {
|
||||
kind: NameBindingKind::Res(self.0, false),
|
||||
ambiguity: None,
|
||||
vis: self.1,
|
||||
vis: self.1.to_def_id(),
|
||||
span: self.2,
|
||||
expansion: self.3,
|
||||
})
|
||||
|
@ -70,7 +72,7 @@ impl<'a> ToNameBinding<'a> for (Res, ty::Visibility, Span, LocalExpnId, IsMacroE
|
|||
arenas.alloc_name_binding(NameBinding {
|
||||
kind: NameBindingKind::Res(self.0, true),
|
||||
ambiguity: None,
|
||||
vis: self.1,
|
||||
vis: self.1.to_def_id(),
|
||||
span: self.2,
|
||||
expansion: self.3,
|
||||
})
|
||||
|
@ -260,7 +262,9 @@ impl<'a, 'b> BuildReducedGraphVisitor<'a, 'b> {
|
|||
self.r.visibilities[&def_id.expect_local()]
|
||||
}
|
||||
// Otherwise, the visibility is restricted to the nearest parent `mod` item.
|
||||
_ => ty::Visibility::Restricted(self.parent_scope.module.nearest_parent_mod()),
|
||||
_ => ty::Visibility::Restricted(
|
||||
self.parent_scope.module.nearest_parent_mod().expect_local(),
|
||||
),
|
||||
})
|
||||
}
|
||||
ast::VisibilityKind::Restricted { ref path, id, .. } => {
|
||||
|
@ -311,7 +315,7 @@ impl<'a, 'b> BuildReducedGraphVisitor<'a, 'b> {
|
|||
} else {
|
||||
let vis = ty::Visibility::Restricted(res.def_id());
|
||||
if self.r.is_accessible_from(vis, parent_scope.module) {
|
||||
Ok(vis)
|
||||
Ok(vis.expect_local())
|
||||
} else {
|
||||
Err(VisResolutionError::AncestorOnly(path.span))
|
||||
}
|
||||
|
@ -649,7 +653,9 @@ impl<'a, 'b> BuildReducedGraphVisitor<'a, 'b> {
|
|||
true,
|
||||
// The whole `use` item
|
||||
item,
|
||||
ty::Visibility::Restricted(self.parent_scope.module.nearest_parent_mod()),
|
||||
ty::Visibility::Restricted(
|
||||
self.parent_scope.module.nearest_parent_mod().expect_local(),
|
||||
),
|
||||
root_span,
|
||||
);
|
||||
}
|
||||
|
@ -765,10 +771,10 @@ impl<'a, 'b> BuildReducedGraphVisitor<'a, 'b> {
|
|||
if let Some(ctor_node_id) = vdata.ctor_id() {
|
||||
// If the structure is marked as non_exhaustive then lower the visibility
|
||||
// to within the crate.
|
||||
let mut ctor_vis = if vis == ty::Visibility::Public
|
||||
let mut ctor_vis = if vis.is_public()
|
||||
&& self.r.session.contains_name(&item.attrs, sym::non_exhaustive)
|
||||
{
|
||||
ty::Visibility::Restricted(CRATE_DEF_ID.to_def_id())
|
||||
ty::Visibility::Restricted(CRATE_DEF_ID)
|
||||
} else {
|
||||
vis
|
||||
};
|
||||
|
@ -785,7 +791,7 @@ impl<'a, 'b> BuildReducedGraphVisitor<'a, 'b> {
|
|||
if ctor_vis.is_at_least(field_vis, &*self.r) {
|
||||
ctor_vis = field_vis;
|
||||
}
|
||||
ret_fields.push(field_vis);
|
||||
ret_fields.push(field_vis.to_def_id());
|
||||
}
|
||||
let ctor_def_id = self.r.local_def_id(ctor_node_id);
|
||||
let ctor_res = Res::Def(
|
||||
|
@ -795,7 +801,9 @@ impl<'a, 'b> BuildReducedGraphVisitor<'a, 'b> {
|
|||
self.r.define(parent, ident, ValueNS, (ctor_res, ctor_vis, sp, expansion));
|
||||
self.r.visibilities.insert(ctor_def_id, ctor_vis);
|
||||
|
||||
self.r.struct_constructors.insert(def_id, (ctor_res, ctor_vis, ret_fields));
|
||||
self.r
|
||||
.struct_constructors
|
||||
.insert(def_id, (ctor_res, ctor_vis.to_def_id(), ret_fields));
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -867,8 +875,8 @@ impl<'a, 'b> BuildReducedGraphVisitor<'a, 'b> {
|
|||
}
|
||||
.map(|module| {
|
||||
let used = self.process_macro_use_imports(item, module);
|
||||
let binding =
|
||||
(module, ty::Visibility::Public, sp, expansion).to_name_binding(self.r.arenas);
|
||||
let vis = ty::Visibility::<LocalDefId>::Public;
|
||||
let binding = (module, vis, sp, expansion).to_name_binding(self.r.arenas);
|
||||
(used, Some(ModuleOrUniformRoot::Module(module)), binding)
|
||||
})
|
||||
.unwrap_or((true, None, self.r.dummy_binding));
|
||||
|
@ -1117,7 +1125,7 @@ impl<'a, 'b> BuildReducedGraphVisitor<'a, 'b> {
|
|||
root_span: span,
|
||||
span,
|
||||
module_path: Vec::new(),
|
||||
vis: Cell::new(Some(ty::Visibility::Restricted(CRATE_DEF_ID.to_def_id()))),
|
||||
vis: Cell::new(Some(ty::Visibility::Restricted(CRATE_DEF_ID))),
|
||||
used: Cell::new(false),
|
||||
})
|
||||
};
|
||||
|
@ -1263,7 +1271,7 @@ impl<'a, 'b> BuildReducedGraphVisitor<'a, 'b> {
|
|||
let vis = if is_macro_export {
|
||||
ty::Visibility::Public
|
||||
} else {
|
||||
ty::Visibility::Restricted(CRATE_DEF_ID.to_def_id())
|
||||
ty::Visibility::Restricted(CRATE_DEF_ID)
|
||||
};
|
||||
let binding = (res, vis, span, expansion).to_name_binding(self.r.arenas);
|
||||
self.r.set_binding_parent_module(binding, parent_scope.module);
|
||||
|
@ -1294,7 +1302,7 @@ impl<'a, 'b> BuildReducedGraphVisitor<'a, 'b> {
|
|||
}
|
||||
_ => self.resolve_visibility(&item.vis),
|
||||
};
|
||||
if vis != ty::Visibility::Public {
|
||||
if !vis.is_public() {
|
||||
self.insert_unused_macro(ident, def_id, item.id, &rule_spans);
|
||||
}
|
||||
self.r.define(module, ident, MacroNS, (res, vis, span, expansion));
|
||||
|
@ -1507,10 +1515,10 @@ impl<'a, 'b> Visitor<'b> for BuildReducedGraphVisitor<'a, 'b> {
|
|||
self.r.visibilities.insert(def_id, vis);
|
||||
|
||||
// If the variant is marked as non_exhaustive then lower the visibility to within the crate.
|
||||
let ctor_vis = if vis == ty::Visibility::Public
|
||||
let ctor_vis = if vis.is_public()
|
||||
&& self.r.session.contains_name(&variant.attrs, sym::non_exhaustive)
|
||||
{
|
||||
ty::Visibility::Restricted(CRATE_DEF_ID.to_def_id())
|
||||
ty::Visibility::Restricted(CRATE_DEF_ID)
|
||||
} else {
|
||||
vis
|
||||
};
|
||||
|
|
|
@ -6,6 +6,7 @@ use rustc_middle::bug;
|
|||
use rustc_middle::ty;
|
||||
use rustc_session::lint::builtin::PROC_MACRO_DERIVE_RESOLUTION_FALLBACK;
|
||||
use rustc_session::lint::BuiltinLintDiagnostics;
|
||||
use rustc_span::def_id::LocalDefId;
|
||||
use rustc_span::edition::Edition;
|
||||
use rustc_span::hygiene::{ExpnId, ExpnKind, LocalExpnId, MacroKind, SyntaxContext};
|
||||
use rustc_span::symbol::{kw, Ident};
|
||||
|
@ -26,6 +27,8 @@ use Determinacy::*;
|
|||
use Namespace::*;
|
||||
use RibKind::*;
|
||||
|
||||
type Visibility = ty::Visibility<LocalDefId>;
|
||||
|
||||
impl<'a> Resolver<'a> {
|
||||
/// A generic scope visitor.
|
||||
/// Visits scopes in order to resolve some identifier in them or perform other actions.
|
||||
|
@ -424,8 +427,7 @@ impl<'a> Resolver<'a> {
|
|||
let ident = Ident::new(orig_ident.name, orig_ident.span.with_ctxt(ctxt));
|
||||
let ok = |res, span, arenas| {
|
||||
Ok((
|
||||
(res, ty::Visibility::Public, span, LocalExpnId::ROOT)
|
||||
.to_name_binding(arenas),
|
||||
(res, Visibility::Public, span, LocalExpnId::ROOT).to_name_binding(arenas),
|
||||
Flags::empty(),
|
||||
))
|
||||
};
|
||||
|
@ -438,7 +440,7 @@ impl<'a> Resolver<'a> {
|
|||
{
|
||||
let binding = (
|
||||
Res::NonMacroAttr(NonMacroAttrKind::DeriveHelper),
|
||||
ty::Visibility::Public,
|
||||
Visibility::Public,
|
||||
attr.span,
|
||||
expn_id,
|
||||
)
|
||||
|
@ -841,9 +843,8 @@ impl<'a> Resolver<'a> {
|
|||
if ns == TypeNS {
|
||||
if ident.name == kw::Crate || ident.name == kw::DollarCrate {
|
||||
let module = self.resolve_crate_root(ident);
|
||||
let binding =
|
||||
(module, ty::Visibility::Public, module.span, LocalExpnId::ROOT)
|
||||
.to_name_binding(self.arenas);
|
||||
let binding = (module, Visibility::Public, module.span, LocalExpnId::ROOT)
|
||||
.to_name_binding(self.arenas);
|
||||
return Ok(binding);
|
||||
} else if ident.name == kw::Super || ident.name == kw::SelfLower {
|
||||
// FIXME: Implement these with renaming requirements so that e.g.
|
||||
|
|
|
@ -214,7 +214,7 @@ impl<'a> Resolver<'a> {
|
|||
binding: &'a NameBinding<'a>,
|
||||
import: &'a Import<'a>,
|
||||
) -> &'a NameBinding<'a> {
|
||||
let import_vis = import.expect_vis();
|
||||
let import_vis = import.expect_vis().to_def_id();
|
||||
let vis = if binding.vis.is_at_least(import_vis, self)
|
||||
|| pub_use_of_private_extern_crate_hack(import, binding)
|
||||
{
|
||||
|
@ -227,7 +227,7 @@ impl<'a> Resolver<'a> {
|
|||
if vis == import_vis
|
||||
|| max_vis.get().map_or(true, |max_vis| vis.is_at_least(max_vis, self))
|
||||
{
|
||||
max_vis.set(Some(vis))
|
||||
max_vis.set(Some(vis.expect_local()))
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -648,7 +648,7 @@ pub struct NameBinding<'a> {
|
|||
ambiguity: Option<(&'a NameBinding<'a>, AmbiguityKind)>,
|
||||
expansion: LocalExpnId,
|
||||
span: Span,
|
||||
vis: ty::Visibility,
|
||||
vis: ty::Visibility<DefId>,
|
||||
}
|
||||
|
||||
pub trait ToNameBinding<'a> {
|
||||
|
@ -1012,7 +1012,7 @@ pub struct Resolver<'a> {
|
|||
/// Table for mapping struct IDs into struct constructor IDs,
|
||||
/// it's not used during normal resolution, only for better error reporting.
|
||||
/// Also includes of list of each fields visibility
|
||||
struct_constructors: DefIdMap<(Res, ty::Visibility, Vec<ty::Visibility>)>,
|
||||
struct_constructors: DefIdMap<(Res, ty::Visibility<DefId>, Vec<ty::Visibility<DefId>>)>,
|
||||
|
||||
/// Features enabled for this crate.
|
||||
active_features: FxHashSet<Symbol>,
|
||||
|
@ -1808,7 +1808,11 @@ impl<'a> Resolver<'a> {
|
|||
self.pat_span_map.insert(node, span);
|
||||
}
|
||||
|
||||
fn is_accessible_from(&self, vis: ty::Visibility, module: Module<'a>) -> bool {
|
||||
fn is_accessible_from(
|
||||
&self,
|
||||
vis: ty::Visibility<impl Into<DefId>>,
|
||||
module: Module<'a>,
|
||||
) -> bool {
|
||||
vis.is_accessible_from(module.nearest_parent_mod(), self)
|
||||
}
|
||||
|
||||
|
@ -1862,10 +1866,8 @@ impl<'a> Resolver<'a> {
|
|||
self.crate_loader.maybe_process_path_extern(ident.name)?
|
||||
};
|
||||
let crate_root = self.expect_module(crate_id.as_def_id());
|
||||
Some(
|
||||
(crate_root, ty::Visibility::Public, DUMMY_SP, LocalExpnId::ROOT)
|
||||
.to_name_binding(self.arenas),
|
||||
)
|
||||
let vis = ty::Visibility::<LocalDefId>::Public;
|
||||
Some((crate_root, vis, DUMMY_SP, LocalExpnId::ROOT).to_name_binding(self.arenas))
|
||||
}
|
||||
})
|
||||
}
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue