fallout from separating impl-items from impls
Basically adding `visit_impl_item` in various places and so forth.
This commit is contained in:
parent
b889259e2b
commit
3fd67eba87
30 changed files with 233 additions and 70 deletions
|
|
@ -56,6 +56,7 @@ use super::intravisit::Visitor;
|
|||
/// needed.
|
||||
pub trait ItemLikeVisitor<'hir> {
|
||||
fn visit_item(&mut self, item: &'hir Item);
|
||||
fn visit_impl_item(&mut self, impl_item: &'hir ImplItem);
|
||||
}
|
||||
|
||||
pub struct DeepVisitor<'v, V: 'v> {
|
||||
|
|
@ -76,4 +77,8 @@ impl<'v, 'hir, V> ItemLikeVisitor<'hir> for DeepVisitor<'v, V>
|
|||
fn visit_item(&mut self, item: &'hir Item) {
|
||||
self.visitor.visit_item(item);
|
||||
}
|
||||
|
||||
fn visit_impl_item(&mut self, impl_item: &'hir ImplItem) {
|
||||
self.visitor.visit_impl_item(impl_item);
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -99,6 +99,10 @@ impl<'ast> Visitor<'ast> for NodeCollector<'ast> {
|
|||
}
|
||||
}
|
||||
|
||||
fn visit_nested_impl_item(&mut self, item_id: ImplItemId) {
|
||||
self.visit_impl_item(self.krate.impl_item(item_id))
|
||||
}
|
||||
|
||||
fn visit_item(&mut self, i: &'ast Item) {
|
||||
debug!("visit_item: {:?}", i);
|
||||
|
||||
|
|
|
|||
|
|
@ -797,8 +797,13 @@ impl<'a, 'tcx, 'v> hir_visit::Visitor<'v> for LateContext<'a, 'tcx> {
|
|||
/// items in the context of the outer item, so enable
|
||||
/// deep-walking.
|
||||
fn visit_nested_item(&mut self, item: hir::ItemId) {
|
||||
let tcx = self.tcx;
|
||||
self.visit_item(tcx.map.expect_item(item.id))
|
||||
let item = self.tcx.map.expect_item(item.id);
|
||||
self.visit_item(item)
|
||||
}
|
||||
|
||||
fn visit_nested_impl_item(&mut self, item_id: hir::ImplItemId) {
|
||||
let impl_item = self.tcx.map.impl_item(item_id);
|
||||
self.visit_impl_item(impl_item)
|
||||
}
|
||||
|
||||
fn visit_item(&mut self, it: &hir::Item) {
|
||||
|
|
|
|||
|
|
@ -330,11 +330,12 @@ fn has_allow_dead_code_or_lang_attr(attrs: &[ast::Attribute]) -> bool {
|
|||
// or
|
||||
// 2) We are not sure to be live or not
|
||||
// * Implementation of a trait method
|
||||
struct LifeSeeder {
|
||||
worklist: Vec<ast::NodeId>
|
||||
struct LifeSeeder<'k> {
|
||||
worklist: Vec<ast::NodeId>,
|
||||
krate: &'k hir::Crate,
|
||||
}
|
||||
|
||||
impl<'v> ItemLikeVisitor<'v> for LifeSeeder {
|
||||
impl<'v, 'k> ItemLikeVisitor<'v> for LifeSeeder<'k> {
|
||||
fn visit_item(&mut self, item: &hir::Item) {
|
||||
let allow_dead_code = has_allow_dead_code_or_lang_attr(&item.attrs);
|
||||
if allow_dead_code {
|
||||
|
|
@ -358,17 +359,22 @@ impl<'v> ItemLikeVisitor<'v> for LifeSeeder {
|
|||
}
|
||||
}
|
||||
}
|
||||
hir::ItemImpl(.., ref opt_trait, _, ref impl_items) => {
|
||||
for impl_item in impl_items {
|
||||
hir::ItemImpl(.., ref opt_trait, _, ref impl_item_ids) => {
|
||||
for &impl_item_id in impl_item_ids {
|
||||
let impl_item = self.krate.impl_item(impl_item_id);
|
||||
if opt_trait.is_some() ||
|
||||
has_allow_dead_code_or_lang_attr(&impl_item.attrs) {
|
||||
self.worklist.push(impl_item.id);
|
||||
self.worklist.push(impl_item_id.id);
|
||||
}
|
||||
}
|
||||
}
|
||||
_ => ()
|
||||
}
|
||||
}
|
||||
|
||||
fn visit_impl_item(&mut self, _item: &hir::ImplItem) {
|
||||
// ignore: we are handling this in `visit_item` above
|
||||
}
|
||||
}
|
||||
|
||||
fn create_and_seed_worklist<'a, 'tcx>(tcx: TyCtxt<'a, 'tcx, 'tcx>,
|
||||
|
|
@ -387,7 +393,8 @@ fn create_and_seed_worklist<'a, 'tcx>(tcx: TyCtxt<'a, 'tcx, 'tcx>,
|
|||
|
||||
// Seed implemented trait items
|
||||
let mut life_seeder = LifeSeeder {
|
||||
worklist: worklist
|
||||
worklist: worklist,
|
||||
krate: krate,
|
||||
};
|
||||
krate.visit_all_item_likes(&mut life_seeder);
|
||||
|
||||
|
|
@ -510,8 +517,13 @@ impl<'a, 'tcx, 'v> Visitor<'v> for DeadVisitor<'a, 'tcx> {
|
|||
/// an error. We could do this also by checking the parents, but
|
||||
/// this is how the code is setup and it seems harmless enough.
|
||||
fn visit_nested_item(&mut self, item: hir::ItemId) {
|
||||
let tcx = self.tcx;
|
||||
self.visit_item(tcx.map.expect_item(item.id))
|
||||
let item = self.tcx.map.expect_item(item.id);
|
||||
self.visit_item(item)
|
||||
}
|
||||
|
||||
fn visit_nested_impl_item(&mut self, item_id: hir::ImplItemId) {
|
||||
let impl_item = self.tcx.map.impl_item(item_id);
|
||||
self.visit_impl_item(impl_item)
|
||||
}
|
||||
|
||||
fn visit_item(&mut self, item: &hir::Item) {
|
||||
|
|
|
|||
|
|
@ -17,7 +17,7 @@ use syntax::ast::NodeId;
|
|||
use syntax::attr;
|
||||
use syntax::entry::EntryPointType;
|
||||
use syntax_pos::Span;
|
||||
use hir::{Item, ItemFn};
|
||||
use hir::{Item, ItemFn, ImplItem};
|
||||
use hir::itemlikevisit::ItemLikeVisitor;
|
||||
|
||||
struct EntryContext<'a, 'tcx: 'a> {
|
||||
|
|
@ -46,6 +46,10 @@ impl<'a, 'tcx> ItemLikeVisitor<'tcx> for EntryContext<'a, 'tcx> {
|
|||
let at_root = def_key.parent == Some(CRATE_DEF_INDEX);
|
||||
find_item(item, self, at_root);
|
||||
}
|
||||
|
||||
fn visit_impl_item(&mut self, _impl_item: &'tcx ImplItem) {
|
||||
// entry fn is never an impl item
|
||||
}
|
||||
}
|
||||
|
||||
pub fn find_entry_point(session: &Session, ast_map: &ast_map::Map) {
|
||||
|
|
|
|||
|
|
@ -164,6 +164,10 @@ impl<'a, 'v, 'tcx> ItemLikeVisitor<'v> for LanguageItemCollector<'a, 'tcx> {
|
|||
}
|
||||
}
|
||||
}
|
||||
|
||||
fn visit_impl_item(&mut self, _impl_item: &hir::ImplItem) {
|
||||
// at present, lang items are always items, not impl items
|
||||
}
|
||||
}
|
||||
|
||||
impl<'a, 'tcx> LanguageItemCollector<'a, 'tcx> {
|
||||
|
|
|
|||
|
|
@ -336,6 +336,10 @@ impl<'a, 'v> ItemLikeVisitor<'v> for CollectPrivateImplItemsVisitor<'a> {
|
|||
}
|
||||
}
|
||||
}
|
||||
|
||||
fn visit_impl_item(&mut self, _impl_item: &hir::ImplItem) {
|
||||
// processed in visit_item above
|
||||
}
|
||||
}
|
||||
|
||||
pub fn find_reachable<'a, 'tcx>(tcx: TyCtxt<'a, 'tcx, 'tcx>,
|
||||
|
|
|
|||
|
|
@ -141,6 +141,11 @@ impl<'a, 'tcx, 'v> Visitor<'v> for LifetimeContext<'a, 'tcx> {
|
|||
self.visit_item(item)
|
||||
}
|
||||
|
||||
fn visit_nested_impl_item(&mut self, id: hir::ImplItemId) {
|
||||
let impl_item = self.hir_map.impl_item(id);
|
||||
self.visit_impl_item(impl_item)
|
||||
}
|
||||
|
||||
fn visit_item(&mut self, item: &hir::Item) {
|
||||
// Save labels for nested items.
|
||||
let saved_labels_in_fn = replace(&mut self.labels_in_fn, vec![]);
|
||||
|
|
|
|||
|
|
@ -239,8 +239,13 @@ impl<'a, 'tcx, 'v> Visitor<'v> for Annotator<'a, 'tcx> {
|
|||
/// nested items in the context of the outer item, so enable
|
||||
/// deep-walking.
|
||||
fn visit_nested_item(&mut self, item: hir::ItemId) {
|
||||
let tcx = self.tcx;
|
||||
self.visit_item(tcx.map.expect_item(item.id))
|
||||
let item = self.tcx.map.expect_item(item.id);
|
||||
self.visit_item(item)
|
||||
}
|
||||
|
||||
fn visit_nested_impl_item(&mut self, item_id: hir::ImplItemId) {
|
||||
let impl_item = self.tcx.map.impl_item(item_id);
|
||||
self.visit_impl_item(impl_item)
|
||||
}
|
||||
|
||||
fn visit_item(&mut self, i: &Item) {
|
||||
|
|
@ -449,8 +454,13 @@ impl<'a, 'v, 'tcx> Visitor<'v> for Checker<'a, 'tcx> {
|
|||
/// nested items in the context of the outer item, so enable
|
||||
/// deep-walking.
|
||||
fn visit_nested_item(&mut self, item: hir::ItemId) {
|
||||
let tcx = self.tcx;
|
||||
self.visit_item(tcx.map.expect_item(item.id))
|
||||
let item = self.tcx.map.expect_item(item.id);
|
||||
self.visit_item(item)
|
||||
}
|
||||
|
||||
fn visit_nested_impl_item(&mut self, item_id: hir::ImplItemId) {
|
||||
let impl_item = self.tcx.map.impl_item(item_id);
|
||||
self.visit_impl_item(impl_item)
|
||||
}
|
||||
|
||||
fn visit_item(&mut self, item: &hir::Item) {
|
||||
|
|
@ -527,9 +537,10 @@ pub fn check_item<'a, 'tcx>(tcx: TyCtxt<'a, 'tcx, 'tcx>,
|
|||
// For implementations of traits, check the stability of each item
|
||||
// individually as it's possible to have a stable trait with unstable
|
||||
// items.
|
||||
hir::ItemImpl(.., Some(ref t), _, ref impl_items) => {
|
||||
hir::ItemImpl(.., Some(ref t), _, ref impl_item_ids) => {
|
||||
let trait_did = tcx.expect_def(t.ref_id).def_id();
|
||||
for impl_item in impl_items {
|
||||
for &impl_item_id in impl_item_ids {
|
||||
let impl_item = tcx.map.impl_item(impl_item_id);
|
||||
let item = tcx.associated_items(trait_did)
|
||||
.find(|item| item.name == impl_item.name).unwrap();
|
||||
if warn_about_defns {
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue