diff --git a/src/librustc/hir/intravisit.rs b/src/librustc/hir/intravisit.rs index 12fe1f70370..780b0e36b5e 100644 --- a/src/librustc/hir/intravisit.rs +++ b/src/librustc/hir/intravisit.rs @@ -31,14 +31,67 @@ //! This order consistency is required in a few places in rustc, for //! example generator inference, and possibly also HIR borrowck. -use super::itemlikevisit::DeepVisitor; - +use crate::hir::itemlikevisit::{ItemLikeVisitor, ParItemLikeVisitor}; use crate::hir::map::Map; use crate::hir::*; use rustc_span::Span; use syntax::ast::{Attribute, Ident, Label, Name}; +pub struct DeepVisitor<'v, V> { + visitor: &'v mut V, +} + +impl<'v, 'hir, V> DeepVisitor<'v, V> +where + V: Visitor<'hir> + 'v, +{ + pub fn new(base: &'v mut V) -> Self { + DeepVisitor { visitor: base } + } +} + +impl<'v, 'hir, V> ItemLikeVisitor<'hir> for DeepVisitor<'v, V> +where + V: Visitor<'hir>, +{ + fn visit_item(&mut self, item: &'hir Item<'hir>) { + self.visitor.visit_item(item); + } + + fn visit_trait_item(&mut self, trait_item: &'hir TraitItem<'hir>) { + self.visitor.visit_trait_item(trait_item); + } + + fn visit_impl_item(&mut self, impl_item: &'hir ImplItem<'hir>) { + self.visitor.visit_impl_item(impl_item); + } +} + +pub trait IntoVisitor<'hir> { + type Visitor: Visitor<'hir>; + fn into_visitor(&self) -> Self::Visitor; +} + +pub struct ParDeepVisitor(pub V); + +impl<'hir, V> ParItemLikeVisitor<'hir> for ParDeepVisitor +where + V: IntoVisitor<'hir>, +{ + fn visit_item(&self, item: &'hir Item<'hir>) { + self.0.into_visitor().visit_item(item); + } + + fn visit_trait_item(&self, trait_item: &'hir TraitItem<'hir>) { + self.0.into_visitor().visit_trait_item(trait_item); + } + + fn visit_impl_item(&self, impl_item: &'hir ImplItem<'hir>) { + self.0.into_visitor().visit_impl_item(impl_item); + } +} + #[derive(Copy, Clone)] pub enum FnKind<'a> { /// `#[xxx] pub async/const/extern "Abi" fn foo()` diff --git a/src/librustc/hir/itemlikevisit.rs b/src/librustc/hir/itemlikevisit.rs index 56dcf91a134..369cd49621b 100644 --- a/src/librustc/hir/itemlikevisit.rs +++ b/src/librustc/hir/itemlikevisit.rs @@ -1,4 +1,3 @@ -use super::intravisit::Visitor; use super::{ImplItem, Item, TraitItem}; /// The "item-like visitor" defines only the top-level methods @@ -50,63 +49,9 @@ pub trait ItemLikeVisitor<'hir> { fn visit_impl_item(&mut self, impl_item: &'hir ImplItem<'hir>); } -pub struct DeepVisitor<'v, V> { - visitor: &'v mut V, -} - -impl<'v, 'hir, V> DeepVisitor<'v, V> -where - V: Visitor<'hir> + 'v, -{ - pub fn new(base: &'v mut V) -> Self { - DeepVisitor { visitor: base } - } -} - -impl<'v, 'hir, V> ItemLikeVisitor<'hir> for DeepVisitor<'v, V> -where - V: Visitor<'hir>, -{ - fn visit_item(&mut self, item: &'hir Item<'hir>) { - self.visitor.visit_item(item); - } - - fn visit_trait_item(&mut self, trait_item: &'hir TraitItem<'hir>) { - self.visitor.visit_trait_item(trait_item); - } - - fn visit_impl_item(&mut self, impl_item: &'hir ImplItem<'hir>) { - self.visitor.visit_impl_item(impl_item); - } -} - /// A parallel variant of `ItemLikeVisitor`. pub trait ParItemLikeVisitor<'hir> { fn visit_item(&self, item: &'hir Item<'hir>); fn visit_trait_item(&self, trait_item: &'hir TraitItem<'hir>); fn visit_impl_item(&self, impl_item: &'hir ImplItem<'hir>); } - -pub trait IntoVisitor<'hir> { - type Visitor: Visitor<'hir>; - fn into_visitor(&self) -> Self::Visitor; -} - -pub struct ParDeepVisitor(pub V); - -impl<'hir, V> ParItemLikeVisitor<'hir> for ParDeepVisitor -where - V: IntoVisitor<'hir>, -{ - fn visit_item(&self, item: &'hir Item<'hir>) { - self.0.into_visitor().visit_item(item); - } - - fn visit_trait_item(&self, trait_item: &'hir TraitItem<'hir>) { - self.0.into_visitor().visit_trait_item(trait_item); - } - - fn visit_impl_item(&self, impl_item: &'hir ImplItem<'hir>) { - self.0.into_visitor().visit_impl_item(impl_item); - } -} diff --git a/src/librustc_privacy/lib.rs b/src/librustc_privacy/lib.rs index 1b91f48d78f..68e5e6d2543 100644 --- a/src/librustc_privacy/lib.rs +++ b/src/librustc_privacy/lib.rs @@ -9,8 +9,7 @@ extern crate syntax; use rustc::bug; use rustc::hir::def::{DefKind, Res}; use rustc::hir::def_id::{CrateNum, DefId, CRATE_DEF_INDEX, LOCAL_CRATE}; -use rustc::hir::intravisit::{self, NestedVisitorMap, Visitor}; -use rustc::hir::itemlikevisit::DeepVisitor; +use rustc::hir::intravisit::{self, DeepVisitor, NestedVisitorMap, Visitor}; use rustc::hir::{self, AssocItemKind, HirIdSet, Node, PatKind}; use rustc::lint; use rustc::middle::privacy::{AccessLevel, AccessLevels};