//! example generator inference, and possibly also HIR borrowck.
use crate::hir::*;
-use crate::hir_id::CRATE_HIR_ID;
use crate::itemlikevisit::{ItemLikeVisitor, ParItemLikeVisitor};
use rustc_ast::walk_list;
use rustc_ast::{Attribute, Label};
}
}
-/// Walks the contents of a crate. See also `Crate::visit_all_items`.
-pub fn walk_crate_and_attributes<'v, V: Visitor<'v>>(visitor: &mut V, krate: &'v Crate<'v>) {
- let top_mod = krate.module();
- visitor.visit_mod(top_mod, top_mod.inner, CRATE_HIR_ID);
- for (&id, attrs) in krate.attrs.iter() {
- for a in *attrs {
- visitor.visit_attribute(id, a)
- }
- }
-}
-
pub fn walk_mod<'v, V: Visitor<'v>>(visitor: &mut V, module: &'v Mod<'v>, mod_hir_id: HirId) {
visitor.visit_id(mod_hir_id);
for &item_id in module.item_ids {
arena,
);
- if sess.opts.debugging_opts.hir_stats {
- hir_stats::print_hir_stats(&hir_crate);
- }
-
sess.time("early_lint_checks", || {
rustc_lint::check_ast_crate(
sess,
pub fn check_crate(tcx: TyCtxt<'_>) {
tcx.dep_graph.assert_ignored();
+ if tcx.sess.opts.debugging_opts.hir_stats {
+ crate::hir_stats::print_hir_stats(tcx);
+ }
+
let errors = Lock::new(Vec::new());
let hir_map = tcx.hir();
use rustc_hir::intravisit as hir_visit;
use rustc_hir::HirId;
use rustc_middle::hir::map::Map;
+use rustc_middle::ty::TyCtxt;
use rustc_middle::util::common::to_readable_str;
use rustc_span::Span;
}
struct StatCollector<'k> {
- krate: Option<&'k hir::Crate<'k>>,
+ krate: Option<Map<'k>>,
data: FxHashMap<&'static str, NodeData>,
seen: FxHashSet<Id>,
}
-pub fn print_hir_stats(krate: &hir::Crate<'_>) {
+pub fn print_hir_stats(tcx: TyCtxt<'_>) {
let mut collector = StatCollector {
- krate: Some(krate),
+ krate: Some(tcx.hir()),
data: FxHashMap::default(),
seen: FxHashSet::default(),
};
- hir_visit::walk_crate_and_attributes(&mut collector, krate);
+ tcx.hir().walk_crate(&mut collector);
+ tcx.hir().walk_attributes(&mut collector);
collector.print("HIR STATS");
}