1
Fork 0

Fix HIR map validation

This commit is contained in:
John Kåre Alsaker 2020-02-09 17:11:02 +01:00
parent 8b16b023b1
commit 0e316e29e6
3 changed files with 16 additions and 12 deletions

View file

@ -1,18 +1,20 @@
use crate::hir::map::Map;
use crate::ty::TyCtxt; use crate::ty::TyCtxt;
/*use rustc_data_structures::fx::FxHashSet; use rustc_data_structures::fx::FxHashSet;
use rustc_data_structures::sync::{par_iter, Lock, ParallelIterator}; use rustc_data_structures::sync::{par_iter, Lock, ParallelIterator};
use rustc_hir as hir; use rustc_hir as hir;
use rustc_hir::def_id::{DefId, DefIndex, CRATE_DEF_INDEX}; use rustc_hir::def_id::{DefId, DefIndex, CRATE_DEF_INDEX};
use rustc_hir::intravisit; use rustc_hir::intravisit;
use rustc_hir::itemlikevisit::ItemLikeVisitor; use rustc_hir::itemlikevisit::ItemLikeVisitor;
use rustc_hir::{HirId, ItemLocalId};*/ use rustc_hir::{HirId, ItemLocalId};
pub fn check_crate(_tcx: TyCtxt<'_>) { pub fn check_crate(tcx: TyCtxt<'_>) {
/*tcx.dep_graph.assert_ignored(); tcx.dep_graph.assert_ignored();
let errors = Lock::new(Vec::new()); let errors = Lock::new(Vec::new());
let hir_map = tcx.hir();
par_iter(&hir_map.krate.modules).for_each(|(module_id, _)| { par_iter(&hir_map.krate().modules).for_each(|(module_id, _)| {
let local_def_id = hir_map.local_def_id(*module_id); let local_def_id = hir_map.local_def_id(*module_id);
hir_map.visit_item_likes_in_module( hir_map.visit_item_likes_in_module(
local_def_id, local_def_id,
@ -25,23 +27,23 @@ pub fn check_crate(_tcx: TyCtxt<'_>) {
if !errors.is_empty() { if !errors.is_empty() {
let message = errors.iter().fold(String::new(), |s1, s2| s1 + "\n" + s2); let message = errors.iter().fold(String::new(), |s1, s2| s1 + "\n" + s2);
tcx.sess.delay_span_bug(rustc_span::DUMMY_SP, &message); tcx.sess.delay_span_bug(rustc_span::DUMMY_SP, &message);
}*/ }
} }
/*
struct HirIdValidator<'a, 'hir> { struct HirIdValidator<'a, 'hir> {
hir_map: &'a EarlyMap<'hir>, hir_map: Map<'hir>,
owner_def_index: Option<DefIndex>, owner_def_index: Option<DefIndex>,
hir_ids_seen: FxHashSet<ItemLocalId>, hir_ids_seen: FxHashSet<ItemLocalId>,
errors: &'a Lock<Vec<String>>, errors: &'a Lock<Vec<String>>,
} }
struct OuterVisitor<'a, 'hir> { struct OuterVisitor<'a, 'hir> {
hir_map: &'a EarlyMap<'hir>, hir_map: Map<'hir>,
errors: &'a Lock<Vec<String>>, errors: &'a Lock<Vec<String>>,
} }
impl<'a, 'hir> OuterVisitor<'a, 'hir> { impl<'a, 'hir> OuterVisitor<'a, 'hir> {
fn new_inner_visitor(&self, hir_map: &'a EarlyMap<'hir>) -> HirIdValidator<'a, 'hir> { fn new_inner_visitor(&self, hir_map: Map<'hir>) -> HirIdValidator<'a, 'hir> {
HirIdValidator { HirIdValidator {
hir_map, hir_map,
owner_def_index: None, owner_def_index: None,
@ -133,7 +135,7 @@ impl<'a, 'hir> HirIdValidator<'a, 'hir> {
} }
impl<'a, 'hir> intravisit::Visitor<'hir> for HirIdValidator<'a, 'hir> { impl<'a, 'hir> intravisit::Visitor<'hir> for HirIdValidator<'a, 'hir> {
type Map = EarlyMap<'hir>; type Map = Map<'hir>;
fn nested_visit_map(&mut self) -> intravisit::NestedVisitorMap<Self::Map> { fn nested_visit_map(&mut self) -> intravisit::NestedVisitorMap<Self::Map> {
intravisit::NestedVisitorMap::OnlyBodies(self.hir_map) intravisit::NestedVisitorMap::OnlyBodies(self.hir_map)
@ -173,4 +175,3 @@ impl<'a, 'hir> intravisit::Visitor<'hir> for HirIdValidator<'a, 'hir> {
// different owner. // different owner.
} }
} }
*/

View file

@ -25,6 +25,7 @@ pub mod blocks;
mod collector; mod collector;
pub mod definitions; pub mod definitions;
mod hir_id_validator; mod hir_id_validator;
pub use hir_id_validator::check_crate;
/// Represents an entry and its parent `HirId`. /// Represents an entry and its parent `HirId`.
#[derive(Copy, Clone, Debug)] #[derive(Copy, Clone, Debug)]

View file

@ -762,6 +762,8 @@ pub fn create_global_ctxt<'tcx>(
fn analysis(tcx: TyCtxt<'_>, cnum: CrateNum) -> Result<()> { fn analysis(tcx: TyCtxt<'_>, cnum: CrateNum) -> Result<()> {
assert_eq!(cnum, LOCAL_CRATE); assert_eq!(cnum, LOCAL_CRATE);
rustc::hir::map::check_crate(tcx);
let sess = tcx.sess; let sess = tcx.sess;
let mut entry_point = None; let mut entry_point = None;