diff --git a/Cargo.lock b/Cargo.lock index cf448937e031d..40b8cf507e97c 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -3254,6 +3254,7 @@ dependencies = [ "minifier 0.0.30 (registry+https://github.com/rust-lang/crates.io-index)", "parking_lot 0.7.1 (registry+https://github.com/rust-lang/crates.io-index)", "pulldown-cmark 0.5.2 (registry+https://github.com/rust-lang/crates.io-index)", + "rustc-rayon 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)", "tempfile 3.0.5 (registry+https://github.com/rust-lang/crates.io-index)", ] diff --git a/src/doc/rustc/src/linker-plugin-lto.md b/src/doc/rustc/src/linker-plugin-lto.md index 73a2efcb33a75..2ae726c4ba61d 100644 --- a/src/doc/rustc/src/linker-plugin-lto.md +++ b/src/doc/rustc/src/linker-plugin-lto.md @@ -100,9 +100,10 @@ LLVM. However, the approximation is usually reliable. The following table shows known good combinations of toolchain versions. -| | Clang 7 | Clang 8 | +| | Clang 7 | Clang 8 | |-----------|-----------|-----------| | Rust 1.34 | ✗ | ✓ | -| Rust 1.35 | ✗ | ✓(?) | +| Rust 1.35 | ✗ | ✓ | +| Rust 1.36 | ✗ | ✓ | Note that the compatibility policy for this feature might change in the future. diff --git a/src/liballoc/slice.rs b/src/liballoc/slice.rs index aeb7f90d3e60e..f7b0a5e703cc3 100644 --- a/src/liballoc/slice.rs +++ b/src/liballoc/slice.rs @@ -581,7 +581,9 @@ pub trait SliceConcatExt { /// ``` #[stable(feature = "rust1", since = "1.0.0")] #[rustc_deprecated(since = "1.3.0", reason = "renamed to join")] - fn connect(&self, sep: &T) -> Self::Output; + fn connect(&self, sep: &T) -> Self::Output { + self.join(sep) + } } #[unstable(feature = "slice_concat_ext", @@ -615,10 +617,6 @@ impl> SliceConcatExt for [V] { } result } - - fn connect(&self, sep: &T) -> Vec { - self.join(sep) - } } //////////////////////////////////////////////////////////////////////////////// diff --git a/src/liballoc/str.rs b/src/liballoc/str.rs index 0c7d2b837a39a..40104554fe574 100644 --- a/src/liballoc/str.rs +++ b/src/liballoc/str.rs @@ -86,10 +86,6 @@ impl> SliceConcatExt for [S] { String::from_utf8_unchecked( join_generic_copy(self, sep.as_bytes()) ) } } - - fn connect(&self, sep: &str) -> String { - self.join(sep) - } } macro_rules! spezialize_for_lengths { diff --git a/src/librustc/hir/map/blocks.rs b/src/librustc/hir/map/blocks.rs index f50037a746d97..8c5fa97d4b72d 100644 --- a/src/librustc/hir/map/blocks.rs +++ b/src/librustc/hir/map/blocks.rs @@ -15,7 +15,7 @@ use crate::hir as ast; use crate::hir::map; use crate::hir::{Expr, FnDecl, Node}; use crate::hir::intravisit::FnKind; -use syntax::ast::{Attribute, Ident, NodeId}; +use syntax::ast::{Attribute, Ident}; use syntax_pos::Span; /// An FnLikeNode is a Node that is like a fn, in that it has a decl @@ -83,11 +83,11 @@ impl<'a> Code<'a> { } /// Attempts to construct a Code from presumed FnLike or Expr node input. - pub fn from_node(map: &map::Map<'a>, id: NodeId) -> Option> { + pub fn from_node(map: &map::Map<'a>, id: ast::HirId) -> Option> { match map.get(id) { map::Node::Block(_) => { // Use the parent, hopefully an expression node. - Code::from_node(map, map.get_parent_node(id)) + Code::from_node(map, map.get_parent_node_by_hir_id(id)) } map::Node::Expr(expr) => Some(Code::Expr(expr)), node => FnLikeNode::from_node(node).map(Code::FnLike) diff --git a/src/librustc/hir/map/definitions.rs b/src/librustc/hir/map/definitions.rs index 6a561f0c63a2a..b4bda36bc8a27 100644 --- a/src/librustc/hir/map/definitions.rs +++ b/src/librustc/hir/map/definitions.rs @@ -397,11 +397,6 @@ impl Definitions { self.node_to_hir_id[node_id] } - #[inline] - pub fn def_index_to_node_id(&self, def_index: DefIndex) -> ast::NodeId { - self.as_local_node_id(DefId::local(def_index)).unwrap() - } - /// Retrieves the span of the given `DefId` if `DefId` is in the local crate, the span exists /// and it's not `DUMMY_SP`. #[inline] diff --git a/src/librustc/hir/map/mod.rs b/src/librustc/hir/map/mod.rs index 87da3273bd220..0b8b69be0a480 100644 --- a/src/librustc/hir/map/mod.rs +++ b/src/librustc/hir/map/mod.rs @@ -291,8 +291,8 @@ impl<'hir> Map<'hir> { self.definitions.def_index_to_hir_id(def_id.to_def_id().index) } - fn def_kind(&self, node_id: NodeId) -> Option { - let node = if let Some(node) = self.find(node_id) { + fn def_kind(&self, hir_id: HirId) -> Option { + let node = if let Some(node) = self.find_by_hir_id(hir_id) { node } else { return None @@ -347,7 +347,7 @@ impl<'hir> Map<'hir> { if variant_data.ctor_hir_id().is_none() { return None; } - let ctor_of = match self.find(self.get_parent_node(node_id)) { + let ctor_of = match self.find_by_hir_id(self.get_parent_node_by_hir_id(hir_id)) { Some(Node::Item(..)) => def::CtorOf::Struct, Some(Node::Variant(..)) => def::CtorOf::Variant, _ => unreachable!(), @@ -458,7 +458,7 @@ impl<'hir> Map<'hir> { } pub fn body_owner_kind(&self, id: HirId) -> BodyOwnerKind { - match self.get_by_hir_id(id) { + match self.get(id) { Node::Item(&Item { node: ItemKind::Const(..), .. }) | Node::TraitItem(&TraitItem { node: TraitItemKind::Const(..), .. }) | Node::ImplItem(&ImplItem { node: ImplItemKind::Const(..), .. }) | @@ -482,7 +482,7 @@ impl<'hir> Map<'hir> { } pub fn ty_param_owner(&self, id: HirId) -> HirId { - match self.get_by_hir_id(id) { + match self.get(id) { Node::Item(&Item { node: ItemKind::Trait(..), .. }) | Node::Item(&Item { node: ItemKind::TraitAlias(..), .. }) => id, Node::GenericParam(_) => self.get_parent_node_by_hir_id(id), @@ -491,7 +491,7 @@ impl<'hir> Map<'hir> { } pub fn ty_param_name(&self, id: HirId) -> Name { - match self.get_by_hir_id(id) { + match self.get(id) { Node::Item(&Item { node: ItemKind::Trait(..), .. }) | Node::Item(&Item { node: ItemKind::TraitAlias(..), .. }) => kw::SelfUpper, Node::GenericParam(param) => param.name.ident().name, @@ -561,20 +561,14 @@ impl<'hir> Map<'hir> { } /// Retrieves the `Node` corresponding to `id`, panicking if it cannot be found. - pub fn get(&self, id: NodeId) -> Node<'hir> { - let hir_id = self.node_to_hir_id(id); - self.get_by_hir_id(hir_id) - } - - // FIXME(@ljedrz): replace the `NodeId` variant. - pub fn get_by_hir_id(&self, id: HirId) -> Node<'hir> { + pub fn get(&self, id: HirId) -> Node<'hir> { // read recorded by `find` self.find_by_hir_id(id).unwrap_or_else(|| bug!("couldn't find hir id {} in the HIR map", id)) } pub fn get_if_local(&self, id: DefId) -> Option> { - self.as_local_node_id(id).map(|id| self.get(id)) // read recorded by `get` + self.as_local_hir_id(id).map(|id| self.get(id)) // read recorded by `get` } pub fn get_generics(&self, id: DefId) -> Option<&'hir Generics> { @@ -846,7 +840,7 @@ impl<'hir> Map<'hir> { if scope == CRATE_HIR_ID { return Some(CRATE_HIR_ID); } - match self.get_by_hir_id(scope) { + match self.get(scope) { Node::Item(i) => { match i.node { ItemKind::Existential(ExistTy { impl_trait_fn: None, .. }) => {} @@ -927,28 +921,15 @@ impl<'hir> Map<'hir> { } } - pub fn expect_expr(&self, id: NodeId) -> &'hir Expr { - let hir_id = self.node_to_hir_id(id); - self.expect_expr_by_hir_id(hir_id) - } - - // FIXME(@ljedrz): replace the `NodeId` variant. - pub fn expect_expr_by_hir_id(&self, id: HirId) -> &'hir Expr { + pub fn expect_expr(&self, id: HirId) -> &'hir Expr { match self.find_by_hir_id(id) { // read recorded by find Some(Node::Expr(expr)) => expr, _ => bug!("expected expr, found {}", self.node_to_string(id)) } } - /// Returns the name associated with the given `NodeId`'s AST. - pub fn name(&self, id: NodeId) -> Name { - let hir_id = self.node_to_hir_id(id); - self.name_by_hir_id(hir_id) - } - - // FIXME(@ljedrz): replace the `NodeId` variant. - pub fn name_by_hir_id(&self, id: HirId) -> Name { - match self.get_by_hir_id(id) { + pub fn name(&self, id: HirId) -> Name { + match self.get(id) { Node::Item(i) => i.ident.name, Node::ForeignItem(fi) => fi.ident.name, Node::ImplItem(ii) => ii.ident.name, @@ -958,7 +939,7 @@ impl<'hir> Map<'hir> { Node::Lifetime(lt) => lt.name.ident().name, Node::GenericParam(param) => param.name.ident().name, Node::Binding(&Pat { node: PatKind::Binding(_, _, l, _), .. }) => l.name, - Node::Ctor(..) => self.name_by_hir_id(self.get_parent_item(id)), + Node::Ctor(..) => self.name(self.get_parent_item(id)), _ => bug!("no name for {}", self.node_to_string(id)) } } @@ -1080,7 +1061,7 @@ impl<'hir> Map<'hir> { } pub fn hir_to_pretty_string(&self, id: HirId) -> String { - print::to_string(self, |s| s.print_node(self.get_by_hir_id(id))) + print::to_string(self, |s| s.print_node(self.get(id))) } } @@ -1407,8 +1388,8 @@ fn hir_id_to_string(map: &Map<'_>, id: HirId, include_id: bool) -> String { pub fn provide(providers: &mut Providers<'_>) { providers.def_kind = |tcx, def_id| { - if let Some(node_id) = tcx.hir().as_local_node_id(def_id) { - tcx.hir().def_kind(node_id) + if let Some(hir_id) = tcx.hir().as_local_hir_id(def_id) { + tcx.hir().def_kind(hir_id) } else { bug!("calling local def_kind query provider for upstream DefId: {:?}", def_id diff --git a/src/librustc/infer/error_reporting/mod.rs b/src/librustc/infer/error_reporting/mod.rs index 321c06897de11..d1e32b1dbad36 100644 --- a/src/librustc/infer/error_reporting/mod.rs +++ b/src/librustc/infer/error_reporting/mod.rs @@ -617,7 +617,7 @@ impl<'a, 'tcx> InferCtxt<'a, 'tcx> { } hir::MatchSource::TryDesugar => { if let Some(ty::error::ExpectedFound { expected, .. }) = exp_found { - let discrim_expr = self.tcx.hir().expect_expr_by_hir_id(discrim_hir_id); + let discrim_expr = self.tcx.hir().expect_expr(discrim_hir_id); let discrim_ty = if let hir::ExprKind::Call(_, args) = &discrim_expr.node { let arg_expr = args.first().expect("try desugaring call w/out arg"); self.in_progress_tables.and_then(|tables| { @@ -1335,7 +1335,7 @@ impl<'a, 'tcx> InferCtxt<'a, 'tcx> { // We do this to avoid suggesting code that ends up as `T: 'a'b`, // instead we suggest `T: 'a + 'b` in that case. let mut has_bounds = false; - if let Node::GenericParam(ref param) = hir.get_by_hir_id(id) { + if let Node::GenericParam(ref param) = hir.get(id) { has_bounds = !param.bounds.is_empty(); } let sp = hir.span(id); @@ -1583,7 +1583,7 @@ impl<'a, 'tcx> InferCtxt<'a, 'tcx> { format!(" for lifetime parameter `{}` in coherence check", name) } infer::UpvarRegion(ref upvar_id, _) => { - let var_name = self.tcx.hir().name_by_hir_id(upvar_id.var_path.hir_id); + let var_name = self.tcx.hir().name(upvar_id.var_path.hir_id); format!(" for capture of `{}` by closure", var_name) } infer::NLL(..) => bug!("NLL variable found in lexical phase"), diff --git a/src/librustc/infer/error_reporting/need_type_info.rs b/src/librustc/infer/error_reporting/need_type_info.rs index fe151bdec6a84..4426b5c0e85b5 100644 --- a/src/librustc/infer/error_reporting/need_type_info.rs +++ b/src/librustc/infer/error_reporting/need_type_info.rs @@ -133,7 +133,7 @@ impl<'a, 'tcx> InferCtxt<'a, 'tcx> { }; if let Some(body_id) = body_id { - let expr = self.tcx.hir().expect_expr_by_hir_id(body_id.hir_id); + let expr = self.tcx.hir().expect_expr(body_id.hir_id); local_visitor.visit_expr(expr); } diff --git a/src/librustc/infer/error_reporting/nice_region_error/find_anon_type.rs b/src/librustc/infer/error_reporting/nice_region_error/find_anon_type.rs index 78d1d56993e06..283af94b89b48 100644 --- a/src/librustc/infer/error_reporting/nice_region_error/find_anon_type.rs +++ b/src/librustc/infer/error_reporting/nice_region_error/find_anon_type.rs @@ -29,7 +29,7 @@ impl<'a, 'tcx> NiceRegionError<'a, 'tcx> { if let Some(anon_reg) = self.tcx().is_suitable_region(region) { let def_id = anon_reg.def_id; if let Some(hir_id) = self.tcx().hir().as_local_hir_id(def_id) { - let fndecl = match self.tcx().hir().get_by_hir_id(hir_id) { + let fndecl = match self.tcx().hir().get(hir_id) { Node::Item(&hir::Item { node: hir::ItemKind::Fn(ref fndecl, ..), .. diff --git a/src/librustc/infer/error_reporting/nice_region_error/outlives_closure.rs b/src/librustc/infer/error_reporting/nice_region_error/outlives_closure.rs index 6ed2b67556ddc..f5a4dac2c2cb8 100644 --- a/src/librustc/infer/error_reporting/nice_region_error/outlives_closure.rs +++ b/src/librustc/infer/error_reporting/nice_region_error/outlives_closure.rs @@ -52,7 +52,7 @@ impl<'a, 'tcx> NiceRegionError<'a, 'tcx> { if let Node::Expr(Expr { node: Closure(_, _, _, closure_span, None), .. - }) = hir.get_by_hir_id(hir_id) { + }) = hir.get(hir_id) { let sup_sp = sup_origin.span(); let origin_sp = origin.span(); let mut err = self.tcx().sess.struct_span_err( diff --git a/src/librustc/infer/error_reporting/note.rs b/src/librustc/infer/error_reporting/note.rs index cc7c13cea7d92..caed4288892ef 100644 --- a/src/librustc/infer/error_reporting/note.rs +++ b/src/librustc/infer/error_reporting/note.rs @@ -31,7 +31,7 @@ impl<'a, 'tcx> InferCtxt<'a, 'tcx> { "...so that reference does not outlive borrowed content"); } infer::ReborrowUpvar(span, ref upvar_id) => { - let var_name = self.tcx.hir().name_by_hir_id(upvar_id.var_path.hir_id); + let var_name = self.tcx.hir().name(upvar_id.var_path.hir_id); err.span_note(span, &format!("...so that closure can access `{}`", var_name)); } @@ -163,7 +163,7 @@ impl<'a, 'tcx> InferCtxt<'a, 'tcx> { err } infer::ReborrowUpvar(span, ref upvar_id) => { - let var_name = self.tcx.hir().name_by_hir_id(upvar_id.var_path.hir_id); + let var_name = self.tcx.hir().name(upvar_id.var_path.hir_id); let mut err = struct_span_err!(self.tcx.sess, span, E0313, diff --git a/src/librustc/infer/mod.rs b/src/librustc/infer/mod.rs index fc46fe383c972..5c5e6303b8243 100644 --- a/src/librustc/infer/mod.rs +++ b/src/librustc/infer/mod.rs @@ -265,7 +265,7 @@ pub enum SubregionOrigin<'tcx> { DerefPointer(Span), /// Closure bound must not outlive captured variables - ClosureCapture(Span, ast::NodeId), + ClosureCapture(Span, hir::HirId), /// Index into slice must be within its lifetime IndexSlice(Span), diff --git a/src/librustc/infer/opaque_types/mod.rs b/src/librustc/infer/opaque_types/mod.rs index 60554a30060bb..a687b0e459100 100644 --- a/src/librustc/infer/opaque_types/mod.rs +++ b/src/librustc/infer/opaque_types/mod.rs @@ -945,8 +945,8 @@ pub fn may_define_existential_type( let mut hir_id = tcx.hir().as_local_hir_id(def_id).unwrap(); trace!( "may_define_existential_type(def={:?}, opaque_node={:?})", - tcx.hir().get_by_hir_id(hir_id), - tcx.hir().get_by_hir_id(opaque_hir_id) + tcx.hir().get(hir_id), + tcx.hir().get(opaque_hir_id) ); // Named existential types can be defined by any siblings or children of siblings. diff --git a/src/librustc/middle/liveness.rs b/src/librustc/middle/liveness.rs index bf054d68b704a..0d59e32b09818 100644 --- a/src/librustc/middle/liveness.rs +++ b/src/librustc/middle/liveness.rs @@ -1630,7 +1630,7 @@ impl<'a, 'tcx> Liveness<'a, 'tcx> { ); if self.ir.variable_is_shorthand(var) { - if let Node::Binding(pat) = self.ir.tcx.hir().get_by_hir_id(hir_id) { + if let Node::Binding(pat) = self.ir.tcx.hir().get(hir_id) { // Handle `ref` and `ref mut`. let spans = spans.iter() .map(|_span| (pat.span, format!("{}: _", name))) diff --git a/src/librustc/middle/mem_categorization.rs b/src/librustc/middle/mem_categorization.rs index c0f56a33eec8f..10796abe5d4c4 100644 --- a/src/librustc/middle/mem_categorization.rs +++ b/src/librustc/middle/mem_categorization.rs @@ -344,7 +344,7 @@ impl MutabilityCategory { tables: &ty::TypeckTables<'_>, id: hir::HirId, ) -> MutabilityCategory { - let ret = match tcx.hir().get_by_hir_id(id) { + let ret = match tcx.hir().get(id) { Node::Binding(p) => match p.node { PatKind::Binding(..) => { let bm = *tables.pat_binding_modes() diff --git a/src/librustc/middle/region.rs b/src/librustc/middle/region.rs index 93cb6ab96f883..d9ccb9d42f236 100644 --- a/src/librustc/middle/region.rs +++ b/src/librustc/middle/region.rs @@ -190,7 +190,7 @@ impl Scope { } let span = tcx.hir().span(hir_id); if let ScopeData::Remainder(first_statement_index) = self.data { - if let Node::Block(ref blk) = tcx.hir().get_by_hir_id(hir_id) { + if let Node::Block(ref blk) = tcx.hir().get(hir_id) { // Want span for scope starting after the // indexed statement and ending at end of // `blk`; reuse span of `blk` and shift `lo` @@ -1368,7 +1368,7 @@ fn region_scope_tree<'tcx>(tcx: TyCtxt<'tcx>, def_id: DefId) -> &'tcx ScopeTree // If the item is an associated const or a method, // record its impl/trait parent, as it can also have // lifetime parameters free in this body. - match tcx.hir().get_by_hir_id(id) { + match tcx.hir().get(id) { Node::ImplItem(_) | Node::TraitItem(_) => { visitor.scope_tree.root_parent = Some(tcx.hir().get_parent_item(id)); diff --git a/src/librustc/middle/resolve_lifetime.rs b/src/librustc/middle/resolve_lifetime.rs index f68e18c2bb85b..b8e7db99d071c 100644 --- a/src/librustc/middle/resolve_lifetime.rs +++ b/src/librustc/middle/resolve_lifetime.rs @@ -1488,7 +1488,7 @@ impl<'a, 'tcx> LifetimeContext<'a, 'tcx> { } } }; - if let Node::Lifetime(hir_lifetime) = self.tcx.hir().get_by_hir_id(lifetime.hir_id) { + if let Node::Lifetime(hir_lifetime) = self.tcx.hir().get(lifetime.hir_id) { if let Some(parent) = self.tcx.hir().find_by_hir_id( self.tcx.hir().get_parent_item(hir_lifetime.hir_id)) { @@ -1569,7 +1569,7 @@ impl<'a, 'tcx> LifetimeContext<'a, 'tcx> { Some(LifetimeUseSet::One(lifetime)) => { let hir_id = self.tcx.hir().as_local_hir_id(def_id).unwrap(); debug!("hir id first={:?}", hir_id); - if let Some((id, span, name)) = match self.tcx.hir().get_by_hir_id(hir_id) { + if let Some((id, span, name)) = match self.tcx.hir().get(hir_id) { Node::Lifetime(hir_lifetime) => Some(( hir_lifetime.hir_id, hir_lifetime.span, @@ -1620,7 +1620,7 @@ impl<'a, 'tcx> LifetimeContext<'a, 'tcx> { } None => { let hir_id = self.tcx.hir().as_local_hir_id(def_id).unwrap(); - if let Some((id, span, name)) = match self.tcx.hir().get_by_hir_id(hir_id) { + if let Some((id, span, name)) = match self.tcx.hir().get(hir_id) { Node::Lifetime(hir_lifetime) => Some(( hir_lifetime.hir_id, hir_lifetime.span, @@ -1823,7 +1823,7 @@ impl<'a, 'tcx> LifetimeContext<'a, 'tcx> { // Do not free early-bound regions, only late-bound ones. } else if let Some(body_id) = outermost_body { let fn_id = self.tcx.hir().body_owner(body_id); - match self.tcx.hir().get_by_hir_id(fn_id) { + match self.tcx.hir().get(fn_id) { Node::Item(&hir::Item { node: hir::ItemKind::Fn(..), .. @@ -2052,7 +2052,7 @@ impl<'a, 'tcx> LifetimeContext<'a, 'tcx> { let mut assoc_item_kind = None; let mut impl_self = None; let parent = self.tcx.hir().get_parent_node_by_hir_id(output.hir_id); - let body = match self.tcx.hir().get_by_hir_id(parent) { + let body = match self.tcx.hir().get(parent) { // `fn` definitions and methods. Node::Item(&hir::Item { node: hir::ItemKind::Fn(.., body), diff --git a/src/librustc/middle/stability.rs b/src/librustc/middle/stability.rs index 5a1e5212f8657..38df4060652b7 100644 --- a/src/librustc/middle/stability.rs +++ b/src/librustc/middle/stability.rs @@ -580,7 +580,7 @@ impl<'tcx> TyCtxt<'tcx> { let mut diag = self.struct_span_lint_hir(lint, id, span, &msg); if let Some(suggestion) = suggestion { - if let hir::Node::Expr(_) = self.hir().get_by_hir_id(id) { + if let hir::Node::Expr(_) = self.hir().get(id) { diag.span_suggestion( span, "replace the use of the deprecated item", diff --git a/src/librustc/mir/mod.rs b/src/librustc/mir/mod.rs index 6e09cc0452828..6f9cede7e46b1 100644 --- a/src/librustc/mir/mod.rs +++ b/src/librustc/mir/mod.rs @@ -2573,7 +2573,7 @@ impl<'tcx> Debug for Rvalue<'tcx> { if let Some(upvars) = tcx.upvars(def_id) { for (&var_id, place) in upvars.keys().zip(places) { - let var_name = tcx.hir().name_by_hir_id(var_id); + let var_name = tcx.hir().name(var_id); struct_fmt.field(&var_name.as_str(), place); } } @@ -2592,7 +2592,7 @@ impl<'tcx> Debug for Rvalue<'tcx> { if let Some(upvars) = tcx.upvars(def_id) { for (&var_id, place) in upvars.keys().zip(places) { - let var_name = tcx.hir().name_by_hir_id(var_id); + let var_name = tcx.hir().name(var_id); struct_fmt.field(&var_name.as_str(), place); } } diff --git a/src/librustc/session/config.rs b/src/librustc/session/config.rs index fc092481a4a96..895f9c6d8fb85 100644 --- a/src/librustc/session/config.rs +++ b/src/librustc/session/config.rs @@ -330,14 +330,6 @@ macro_rules! hash_option { bug!("Duplicate key in CLI DepTrackingHash: {}", stringify!($opt_name)) } }); - ($opt_name:ident, - $opt_expr:expr, - $sub_hashes:expr, - [UNTRACKED_WITH_WARNING $warn_val:expr, $warn_text:expr, $error_format:expr]) => ({ - if *$opt_expr == $warn_val { - early_warn($error_format, $warn_text) - } - }); } macro_rules! top_level_options { @@ -383,10 +375,6 @@ macro_rules! top_level_options { // [UNTRACKED] // Incremental compilation is not influenced by this option. // -// [UNTRACKED_WITH_WARNING(val, warning)] -// The option is incompatible with incremental compilation in some way. If it -// has the value `val`, the string `warning` is emitted as a warning. -// // If you add a new option to this struct or one of the sub-structs like // CodegenOptions, think about how it influences incremental compilation. If in // doubt, specify [TRACKED], which is always "correct" but might lead to @@ -1163,9 +1151,7 @@ options! {CodegenOptions, CodegenSetter, basic_codegen_options, "a list of extra LLVM passes to run (space separated)"), llvm_args: Vec = (Vec::new(), parse_list, [TRACKED], "a list of arguments to pass to llvm (space separated)"), - save_temps: bool = (false, parse_bool, [UNTRACKED_WITH_WARNING(true, - "`-C save-temps` might not produce all requested temporary products \ - when incremental compilation is enabled.")], + save_temps: bool = (false, parse_bool, [UNTRACKED], "save all temporary output files during compilation"), rpath: bool = (false, parse_bool, [UNTRACKED], "set rpath values in libs/exes"), @@ -1241,9 +1227,7 @@ options! {DebuggingOptions, DebuggingSetter, basic_debugging_options, "measure time of each rustc pass"), time: bool = (false, parse_bool, [UNTRACKED], "measure time of rustc processes"), - time_llvm_passes: bool = (false, parse_bool, [UNTRACKED_WITH_WARNING(true, - "The output of `-Z time-llvm-passes` will only reflect timings of \ - re-codegened modules when used with incremental compilation" )], + time_llvm_passes: bool = (false, parse_bool, [UNTRACKED], "measure time of each LLVM pass"), input_stats: bool = (false, parse_bool, [UNTRACKED], "gather statistics about the input"), diff --git a/src/librustc/traits/error_reporting.rs b/src/librustc/traits/error_reporting.rs index 2555833cd77e3..b433098c1b265 100644 --- a/src/librustc/traits/error_reporting.rs +++ b/src/librustc/traits/error_reporting.rs @@ -937,9 +937,9 @@ impl<'a, 'tcx> InferCtxt<'a, 'tcx> { code: &ObligationCauseCode<'tcx>, err: &mut DiagnosticBuilder<'tcx>, ) { - if let &ObligationCauseCode::VariableType(node_id) = code { - let parent_node = self.tcx.hir().get_parent_node(node_id); - if let Some(Node::Local(ref local)) = self.tcx.hir().find(parent_node) { + if let &ObligationCauseCode::VariableType(hir_id) = code { + let parent_node = self.tcx.hir().get_parent_node_by_hir_id(hir_id); + if let Some(Node::Local(ref local)) = self.tcx.hir().find_by_hir_id(parent_node) { if let Some(ref expr) = local.init { if let hir::ExprKind::Index(_, _) = expr.node { if let Ok(snippet) = self.tcx.sess.source_map().span_to_snippet(expr.span) { diff --git a/src/librustc/traits/mod.rs b/src/librustc/traits/mod.rs index f5c91a77517cd..8d17df1e61055 100644 --- a/src/librustc/traits/mod.rs +++ b/src/librustc/traits/mod.rs @@ -188,7 +188,7 @@ pub enum ObligationCauseCode<'tcx> { /// S { ... } must be Sized StructInitializerSized, /// Type of each variable must be Sized - VariableType(ast::NodeId), + VariableType(hir::HirId), /// Argument type must be Sized SizedArgumentType, /// Return type must be Sized diff --git a/src/librustc/ty/constness.rs b/src/librustc/ty/constness.rs index 65b83224ae521..e4022bb24ad44 100644 --- a/src/librustc/ty/constness.rs +++ b/src/librustc/ty/constness.rs @@ -67,13 +67,13 @@ impl<'tcx> TyCtxt<'tcx> { } -pub fn provide<'tcx>(providers: &mut Providers<'tcx>) { +pub fn provide(providers: &mut Providers<'_>) { /// only checks whether the function has a `const` modifier - fn is_const_fn_raw<'tcx>(tcx: TyCtxt<'tcx>, def_id: DefId) -> bool { + fn is_const_fn_raw(tcx: TyCtxt<'_>, def_id: DefId) -> bool { let hir_id = tcx.hir().as_local_hir_id(def_id) .expect("Non-local call to local provider is_const_fn"); - let node = tcx.hir().get_by_hir_id(hir_id); + let node = tcx.hir().get(hir_id); if let Some(fn_like) = FnLikeNode::from_node(node) { fn_like.constness() == hir::Constness::Const } else if let hir::Node::Ctor(_) = node { @@ -83,7 +83,7 @@ pub fn provide<'tcx>(providers: &mut Providers<'tcx>) { } } - fn is_promotable_const_fn<'tcx>(tcx: TyCtxt<'tcx>, def_id: DefId) -> bool { + fn is_promotable_const_fn(tcx: TyCtxt<'_>, def_id: DefId) -> bool { tcx.is_const_fn(def_id) && match tcx.lookup_stability(def_id) { Some(stab) => { if cfg!(debug_assertions) && stab.promotable { @@ -101,7 +101,7 @@ pub fn provide<'tcx>(providers: &mut Providers<'tcx>) { } } - fn const_fn_is_allowed_fn_ptr<'tcx>(tcx: TyCtxt<'tcx>, def_id: DefId) -> bool { + fn const_fn_is_allowed_fn_ptr(tcx: TyCtxt<'_>, def_id: DefId) -> bool { tcx.is_const_fn(def_id) && tcx.lookup_stability(def_id) .map(|stab| stab.allow_const_fn_ptr).unwrap_or(false) diff --git a/src/librustc/ty/context.rs b/src/librustc/ty/context.rs index b84ebd8afe885..ce785f9a0246b 100644 --- a/src/librustc/ty/context.rs +++ b/src/librustc/ty/context.rs @@ -1610,7 +1610,7 @@ impl<'tcx> TyCtxt<'tcx> { ) -> Option> { // HACK: `type_of_def_id()` will fail on these (#55796), so return None let hir_id = self.hir().as_local_hir_id(scope_def_id).unwrap(); - match self.hir().get_by_hir_id(hir_id) { + match self.hir().get(hir_id) { Node::Item(item) => { match item.node { ItemKind::Fn(..) => { /* type_of_def_id() will work */ } @@ -2223,7 +2223,7 @@ impl<'tcx> Borrow<[Ty<'tcx>]> for Interned<'tcx, List>> { } impl<'tcx> Borrow<[CanonicalVarInfo]> for Interned<'tcx, List> { - fn borrow<'a>(&'a self) -> &'a [CanonicalVarInfo] { + fn borrow(&self) -> &[CanonicalVarInfo] { &self.0[..] } } @@ -2236,13 +2236,13 @@ impl<'tcx> Borrow<[Kind<'tcx>]> for Interned<'tcx, InternalSubsts<'tcx>> { impl<'tcx> Borrow<[ProjectionKind]> for Interned<'tcx, List> { - fn borrow<'a>(&'a self) -> &'a [ProjectionKind] { + fn borrow(&self) -> &[ProjectionKind] { &self.0[..] } } impl<'tcx> Borrow for Interned<'tcx, RegionKind> { - fn borrow<'a>(&'a self) -> &'a RegionKind { + fn borrow(&self) -> &RegionKind { &self.0 } } diff --git a/src/librustc/ty/fast_reject.rs b/src/librustc/ty/fast_reject.rs index 7aab1aef3b895..ee0d33dbe345c 100644 --- a/src/librustc/ty/fast_reject.rs +++ b/src/librustc/ty/fast_reject.rs @@ -55,8 +55,8 @@ pub enum SimplifiedTypeGen /// then we can't say much about whether two types would unify. Put another way, /// `can_simplify_params` should be true if type parameters appear free in `ty` and `false` if they /// are to be considered bound. -pub fn simplify_type<'tcx>( - tcx: TyCtxt<'tcx>, +pub fn simplify_type( + tcx: TyCtxt<'_>, ty: Ty<'_>, can_simplify_params: bool, ) -> Option { diff --git a/src/librustc/ty/mod.rs b/src/librustc/ty/mod.rs index 361410380e8f8..ad9880725128f 100644 --- a/src/librustc/ty/mod.rs +++ b/src/librustc/ty/mod.rs @@ -213,7 +213,7 @@ impl AssocItem { } } - pub fn signature<'tcx>(&self, tcx: TyCtxt<'tcx>) -> String { + pub fn signature(&self, tcx: TyCtxt<'_>) -> String { match self.kind { ty::AssocKind::Method => { // We skip the binder here because the binder would deanonymize all @@ -2311,7 +2311,7 @@ impl<'tcx> AdtDef { /// Returns an iterator over all fields contained /// by this ADT. #[inline] - pub fn all_fields<'s>(&'s self) -> impl Iterator + Clone { + pub fn all_fields(&self) -> impl Iterator + Clone { self.variants.iter().flat_map(|v| v.fields.iter()) } @@ -2777,20 +2777,6 @@ impl<'tcx> TyCtxt<'tcx> { }); } - pub fn expr_span(self, id: NodeId) -> Span { - match self.hir().find(id) { - Some(Node::Expr(e)) => { - e.span - } - Some(f) => { - bug!("node-ID {} is not an expr: {:?}", id, f); - } - None => { - bug!("node-ID {} is not present in the node map", id); - } - } - } - pub fn provided_trait_methods(self, id: DefId) -> Vec { self.associated_items(id) .filter(|item| item.kind == AssocKind::Method && item.defaultness.has_value()) @@ -2805,7 +2791,7 @@ impl<'tcx> TyCtxt<'tcx> { pub fn opt_associated_item(self, def_id: DefId) -> Option { let is_associated_item = if let Some(hir_id) = self.hir().as_local_hir_id(def_id) { - match self.hir().get_by_hir_id(hir_id) { + match self.hir().get(hir_id) { Node::TraitItem(_) | Node::ImplItem(_) => true, _ => false, } @@ -3125,7 +3111,7 @@ impl Iterator for AssocItemsIterator<'_> { } } -fn associated_item<'tcx>(tcx: TyCtxt<'tcx>, def_id: DefId) -> AssocItem { +fn associated_item(tcx: TyCtxt<'_>, def_id: DefId) -> AssocItem { let id = tcx.hir().as_local_hir_id(def_id).unwrap(); let parent_id = tcx.hir().get_parent_item(id); let parent_def_id = tcx.hir().local_def_id_from_hir_id(parent_id); @@ -3170,7 +3156,7 @@ pub struct AdtSizedConstraint<'tcx>(pub &'tcx [Ty<'tcx>]); /// such. /// - a Error, if a type contained itself. The representability /// check should catch this case. -fn adt_sized_constraint<'tcx>(tcx: TyCtxt<'tcx>, def_id: DefId) -> AdtSizedConstraint<'tcx> { +fn adt_sized_constraint(tcx: TyCtxt<'_>, def_id: DefId) -> AdtSizedConstraint<'_> { let def = tcx.adt_def(def_id); let result = tcx.mk_type_list(def.variants.iter().flat_map(|v| { @@ -3184,7 +3170,7 @@ fn adt_sized_constraint<'tcx>(tcx: TyCtxt<'tcx>, def_id: DefId) -> AdtSizedConst AdtSizedConstraint(result) } -fn associated_item_def_ids<'tcx>(tcx: TyCtxt<'tcx>, def_id: DefId) -> &'tcx [DefId] { +fn associated_item_def_ids(tcx: TyCtxt<'_>, def_id: DefId) -> &[DefId] { let id = tcx.hir().as_local_hir_id(def_id).unwrap(); let item = tcx.hir().expect_item(id); match item.node { @@ -3207,14 +3193,14 @@ fn associated_item_def_ids<'tcx>(tcx: TyCtxt<'tcx>, def_id: DefId) -> &'tcx [Def } } -fn def_span<'tcx>(tcx: TyCtxt<'tcx>, def_id: DefId) -> Span { +fn def_span(tcx: TyCtxt<'_>, def_id: DefId) -> Span { tcx.hir().span_if_local(def_id).unwrap() } /// If the given `DefId` describes an item belonging to a trait, /// returns the `DefId` of the trait that the trait item belongs to; /// otherwise, returns `None`. -fn trait_of_item<'tcx>(tcx: TyCtxt<'tcx>, def_id: DefId) -> Option { +fn trait_of_item(tcx: TyCtxt<'_>, def_id: DefId) -> Option { tcx.opt_associated_item(def_id) .and_then(|associated_item| { match associated_item.container { @@ -3227,7 +3213,7 @@ fn trait_of_item<'tcx>(tcx: TyCtxt<'tcx>, def_id: DefId) -> Option { /// Yields the parent function's `DefId` if `def_id` is an `impl Trait` definition. pub fn is_impl_trait_defn(tcx: TyCtxt<'_>, def_id: DefId) -> Option { if let Some(hir_id) = tcx.hir().as_local_hir_id(def_id) { - if let Node::Item(item) = tcx.hir().get_by_hir_id(hir_id) { + if let Node::Item(item) = tcx.hir().get(hir_id) { if let hir::ItemKind::Existential(ref exist_ty) = item.node { return exist_ty.impl_trait_fn; } @@ -3237,7 +3223,7 @@ pub fn is_impl_trait_defn(tcx: TyCtxt<'_>, def_id: DefId) -> Option { } /// See `ParamEnv` struct definition for details. -fn param_env<'tcx>(tcx: TyCtxt<'tcx>, def_id: DefId) -> ParamEnv<'tcx> { +fn param_env(tcx: TyCtxt<'_>, def_id: DefId) -> ParamEnv<'_> { // The param_env of an impl Trait type is its defining function's param_env if let Some(parent) = is_impl_trait_defn(tcx, def_id) { return param_env(tcx, parent); @@ -3272,17 +3258,17 @@ fn param_env<'tcx>(tcx: TyCtxt<'tcx>, def_id: DefId) -> ParamEnv<'tcx> { traits::normalize_param_env_or_error(tcx, def_id, unnormalized_env, cause) } -fn crate_disambiguator<'tcx>(tcx: TyCtxt<'tcx>, crate_num: CrateNum) -> CrateDisambiguator { +fn crate_disambiguator(tcx: TyCtxt<'_>, crate_num: CrateNum) -> CrateDisambiguator { assert_eq!(crate_num, LOCAL_CRATE); tcx.sess.local_crate_disambiguator() } -fn original_crate_name<'tcx>(tcx: TyCtxt<'tcx>, crate_num: CrateNum) -> Symbol { +fn original_crate_name(tcx: TyCtxt<'_>, crate_num: CrateNum) -> Symbol { assert_eq!(crate_num, LOCAL_CRATE); tcx.crate_name.clone() } -fn crate_hash<'tcx>(tcx: TyCtxt<'tcx>, crate_num: CrateNum) -> Svh { +fn crate_hash(tcx: TyCtxt<'_>, crate_num: CrateNum) -> Svh { assert_eq!(crate_num, LOCAL_CRATE); tcx.hir().crate_hash } @@ -3302,7 +3288,7 @@ fn instance_def_size_estimate<'tcx>(tcx: TyCtxt<'tcx>, instance_def: InstanceDef /// If `def_id` is an issue 33140 hack impl, returns its self type; otherwise, returns `None`. /// /// See [`ImplOverlapKind::Issue33140`] for more details. -fn issue33140_self_ty<'tcx>(tcx: TyCtxt<'tcx>, def_id: DefId) -> Option> { +fn issue33140_self_ty(tcx: TyCtxt<'_>, def_id: DefId) -> Option> { debug!("issue33140_self_ty({:?})", def_id); let trait_ref = tcx.impl_trait_ref(def_id).unwrap_or_else(|| { diff --git a/src/librustc/ty/print/pretty.rs b/src/librustc/ty/print/pretty.rs index d143cc3e6092d..cb0ac0f07f287 100644 --- a/src/librustc/ty/print/pretty.rs +++ b/src/librustc/ty/print/pretty.rs @@ -600,7 +600,7 @@ pub trait PrettyPrinter<'tcx>: p!( write("{}{}:", sep, - self.tcx().hir().name_by_hir_id(var_id)), + self.tcx().hir().name(var_id)), print(upvar_ty)); sep = ", "; } @@ -643,7 +643,7 @@ pub trait PrettyPrinter<'tcx>: p!( write("{}{}:", sep, - self.tcx().hir().name_by_hir_id(var_id)), + self.tcx().hir().name(var_id)), print(upvar_ty)); sep = ", "; } diff --git a/src/librustc/ty/structural_impls.rs b/src/librustc/ty/structural_impls.rs index ced2c8c465da4..3d8170586c47f 100644 --- a/src/librustc/ty/structural_impls.rs +++ b/src/librustc/ty/structural_impls.rs @@ -62,7 +62,7 @@ impl fmt::Debug for ty::ClosureUpvar<'tcx> { impl fmt::Debug for ty::UpvarId { fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { let name = ty::tls::with(|tcx| { - tcx.hir().name_by_hir_id(self.var_path.hir_id) + tcx.hir().name(self.var_path.hir_id) }); write!(f, "UpvarId({:?};`{}`;{:?})", self.var_path.hir_id, diff --git a/src/librustc/ty/trait_def.rs b/src/librustc/ty/trait_def.rs index c40d4d5b9cc35..a7ade875bf11b 100644 --- a/src/librustc/ty/trait_def.rs +++ b/src/librustc/ty/trait_def.rs @@ -150,10 +150,10 @@ impl<'tcx> TyCtxt<'tcx> { } // Query provider for `trait_impls_of`. -pub(super) fn trait_impls_of_provider<'tcx>( - tcx: TyCtxt<'tcx>, +pub(super) fn trait_impls_of_provider( + tcx: TyCtxt<'_>, trait_id: DefId, -) -> &'tcx TraitImpls { +) -> &TraitImpls { let mut impls = TraitImpls::default(); { diff --git a/src/librustc/ty/walk.rs b/src/librustc/ty/walk.rs index 234407a7c4eaf..c74511cf0fdda 100644 --- a/src/librustc/ty/walk.rs +++ b/src/librustc/ty/walk.rs @@ -56,7 +56,7 @@ impl<'tcx> Iterator for TypeWalker<'tcx> { } } -pub fn walk_shallow<'tcx>(ty: Ty<'tcx>) -> smallvec::IntoIter> { +pub fn walk_shallow(ty: Ty<'_>) -> smallvec::IntoIter> { let mut stack = SmallVec::new(); push_subtypes(&mut stack, ty); stack.into_iter() diff --git a/src/librustc_borrowck/borrowck/check_loans.rs b/src/librustc_borrowck/borrowck/check_loans.rs index ace44421d3757..714b7c27200e3 100644 --- a/src/librustc_borrowck/borrowck/check_loans.rs +++ b/src/librustc_borrowck/borrowck/check_loans.rs @@ -191,7 +191,7 @@ pub fn check_loans<'a, 'tcx>( let def_id = bccx.tcx.hir().body_owner_def_id(body.id()); let hir_id = bccx.tcx.hir().as_local_hir_id(def_id).unwrap(); - let movable_generator = !match bccx.tcx.hir().get_by_hir_id(hir_id) { + let movable_generator = !match bccx.tcx.hir().get(hir_id) { Node::Expr(&hir::Expr { node: hir::ExprKind::Closure(.., Some(hir::GeneratorMovability::Static)), .. diff --git a/src/librustc_borrowck/borrowck/gather_loans/gather_moves.rs b/src/librustc_borrowck/borrowck/gather_loans/gather_moves.rs index 05c0a22900a0b..fa286632dac84 100644 --- a/src/librustc_borrowck/borrowck/gather_loans/gather_moves.rs +++ b/src/librustc_borrowck/borrowck/gather_loans/gather_moves.rs @@ -49,7 +49,7 @@ fn get_pattern_source<'tcx>(tcx: TyCtxt<'tcx>, pat: &Pat) -> PatternSource<'tcx> let parent = tcx.hir().get_parent_node_by_hir_id(pat.hir_id); - match tcx.hir().get_by_hir_id(parent) { + match tcx.hir().get(parent) { Node::Expr(ref e) => { // the enclosing expression must be a `match` or something else assert!(match e.node { diff --git a/src/librustc_borrowck/borrowck/mod.rs b/src/librustc_borrowck/borrowck/mod.rs index 025d5adc2b3ea..87c0b8563cadb 100644 --- a/src/librustc_borrowck/borrowck/mod.rs +++ b/src/librustc_borrowck/borrowck/mod.rs @@ -80,7 +80,7 @@ fn borrowck<'tcx>(tcx: TyCtxt<'tcx>, owner_def_id: DefId) -> &'tcx BorrowCheckRe let owner_id = tcx.hir().as_local_hir_id(owner_def_id).unwrap(); - match tcx.hir().get_by_hir_id(owner_id) { + match tcx.hir().get(owner_id) { Node::Ctor(..) => { // We get invoked with anything that has MIR, but some of // those things (notably the synthesized constructors from @@ -390,7 +390,7 @@ pub enum LoanPathElem<'tcx> { fn closure_to_block(closure_id: LocalDefId, tcx: TyCtxt<'_>) -> HirId { let closure_id = tcx.hir().local_def_id_to_hir_id(closure_id); - match tcx.hir().get_by_hir_id(closure_id) { + match tcx.hir().get(closure_id) { Node::Expr(expr) => match expr.node { hir::ExprKind::Closure(.., body_id, _, _) => { body_id.hir_id @@ -702,7 +702,7 @@ impl BorrowckCtxt<'_, 'tcx> { move_data::MovePat => (self.tcx.hir().span(hir_id), ""), move_data::Captured => - (match self.tcx.hir().expect_expr_by_hir_id(hir_id).node { + (match self.tcx.hir().expect_expr(hir_id).node { hir::ExprKind::Closure(.., fn_decl_span, _) => fn_decl_span, ref r => bug!("Captured({:?}) maps to non-closure: {:?}", the_move.id, r), @@ -896,7 +896,7 @@ impl BorrowckCtxt<'_, 'tcx> { // to implement two traits for "one operator" is not very intuitive for // many programmers. if err.cmt.note == mc::NoteIndex { - let node = self.tcx.hir().get_by_hir_id(err.cmt.hir_id); + let node = self.tcx.hir().get(err.cmt.hir_id); // This pattern probably always matches. if let Node::Expr( @@ -1172,7 +1172,7 @@ impl BorrowckCtxt<'_, 'tcx> { } fn local_binding_mode(&self, hir_id: hir::HirId) -> ty::BindingMode { - let pat = match self.tcx.hir().get_by_hir_id(hir_id) { + let pat = match self.tcx.hir().get(hir_id) { Node::Binding(pat) => pat, node => bug!("bad node for local: {:?}", node) }; @@ -1190,7 +1190,7 @@ impl BorrowckCtxt<'_, 'tcx> { fn local_ty(&self, hir_id: hir::HirId) -> (Option<&hir::Ty>, bool) { let parent = self.tcx.hir().get_parent_node_by_hir_id(hir_id); - let parent_node = self.tcx.hir().get_by_hir_id(parent); + let parent_node = self.tcx.hir().get(parent); // The parent node is like a fn if let Some(fn_like) = FnLikeNode::from_node(parent_node) { @@ -1255,7 +1255,7 @@ impl BorrowckCtxt<'_, 'tcx> { None => return }; - if let Node::Field(ref field) = self.tcx.hir().get_by_hir_id(hir_id) { + if let Node::Field(ref field) = self.tcx.hir().get(hir_id) { if let Some(msg) = self.suggest_mut_for_immutable(&field.ty, false) { db.span_label(field.ty.span, msg); } @@ -1394,10 +1394,10 @@ impl BorrowckCtxt<'_, 'tcx> { out: &mut String) { match loan_path.kind { LpUpvar(ty::UpvarId { var_path: ty::UpvarPath { hir_id: id }, closure_expr_id: _ }) => { - out.push_str(&self.tcx.hir().name_by_hir_id(id).as_str()); + out.push_str(&self.tcx.hir().name(id).as_str()); } LpVar(id) => { - out.push_str(&self.tcx.hir().name_by_hir_id(id).as_str()); + out.push_str(&self.tcx.hir().name(id).as_str()); } LpDowncast(ref lp_base, variant_def_id) => { diff --git a/src/librustc_codegen_llvm/consts.rs b/src/librustc_codegen_llvm/consts.rs index 24167a2f88713..e02d14a151e62 100644 --- a/src/librustc_codegen_llvm/consts.rs +++ b/src/librustc_codegen_llvm/consts.rs @@ -210,7 +210,7 @@ impl CodegenCx<'ll, 'tcx> { let g = if let Some(id) = self.tcx.hir().as_local_hir_id(def_id) { let llty = self.layout_of(ty).llvm_type(self); - let (g, attrs) = match self.tcx.hir().get_by_hir_id(id) { + let (g, attrs) = match self.tcx.hir().get(id) { Node::Item(&hir::Item { ref attrs, span, node: hir::ItemKind::Static(..), .. }) => { diff --git a/src/librustc_codegen_ssa/back/symbol_export.rs b/src/librustc_codegen_ssa/back/symbol_export.rs index aeff73c7e5216..b9ee82f108ae3 100644 --- a/src/librustc_codegen_ssa/back/symbol_export.rs +++ b/src/librustc_codegen_ssa/back/symbol_export.rs @@ -82,7 +82,7 @@ fn reachable_non_generics_provider<'tcx>( // // As a result, if this id is an FFI item (foreign item) then we only // let it through if it's included statically. - match tcx.hir().get_by_hir_id(hir_id) { + match tcx.hir().get(hir_id) { Node::ForeignItem(..) => { let def_id = tcx.hir().local_def_id_from_hir_id(hir_id); if tcx.is_statically_included_foreign_item(def_id) { diff --git a/src/librustc_codegen_utils/symbol_names.rs b/src/librustc_codegen_utils/symbol_names.rs index ba74f79eba302..7ccd024769f75 100644 --- a/src/librustc_codegen_utils/symbol_names.rs +++ b/src/librustc_codegen_utils/symbol_names.rs @@ -135,7 +135,7 @@ fn symbol_name(tcx: TyCtxt<'tcx>, instance: Instance<'tcx>) -> InternedString { // FIXME(eddyb) Precompute a custom symbol name based on attributes. let is_foreign = if let Some(id) = hir_id { - match tcx.hir().get_by_hir_id(id) { + match tcx.hir().get(id) { Node::ForeignItem(_) => true, _ => false, } diff --git a/src/librustc_driver/pretty.rs b/src/librustc_driver/pretty.rs index eb89b5c1e6370..030166182490b 100644 --- a/src/librustc_driver/pretty.rs +++ b/src/librustc_driver/pretty.rs @@ -627,7 +627,7 @@ fn print_flowgraph<'tcx, W: Write>( // Find the function this expression is from. let mut hir_id = expr.hir_id; loop { - let node = tcx.hir().get_by_hir_id(hir_id); + let node = tcx.hir().get(hir_id); if let Some(n) = hir::map::blocks::FnLikeNode::from_node(node) { break n.body(); } @@ -830,7 +830,8 @@ pub fn print_after_hir_lowering<'tcx>( box out, annotation.pp_ann()); for node_id in uii.all_matching_node_ids(hir_map) { - let node = hir_map.get(node_id); + let hir_id = tcx.hir().node_to_hir_id(node_id); + let node = hir_map.get(hir_id); pp_state.print_node(node)?; pp_state.s.space()?; let path = annotation.node_path(node_id) @@ -847,7 +848,8 @@ pub fn print_after_hir_lowering<'tcx>( s.call_with_pp_support_hir(tcx, move |_annotation, _krate| { debug!("pretty printing source code {:?}", s); for node_id in uii.all_matching_node_ids(tcx.hir()) { - let node = tcx.hir().get(node_id); + let hir_id = tcx.hir().node_to_hir_id(node_id); + let node = tcx.hir().get(hir_id); write!(out, "{:#?}", node)?; } Ok(()) @@ -909,7 +911,8 @@ fn print_with_analysis<'tcx>( tcx.sess.fatal(&format!("--pretty flowgraph couldn't find id: {}", nodeid)) }); - match blocks::Code::from_node(&tcx.hir(), nodeid) { + let hir_id = tcx.hir().node_to_hir_id(nodeid); + match blocks::Code::from_node(&tcx.hir(), hir_id) { Some(code) => { let variants = gather_flowgraph_variants(tcx.sess); diff --git a/src/librustc_incremental/persist/dirty_clean.rs b/src/librustc_incremental/persist/dirty_clean.rs index e2e4a4ebcb056..5296ed0ffd0b8 100644 --- a/src/librustc_incremental/persist/dirty_clean.rs +++ b/src/librustc_incremental/persist/dirty_clean.rs @@ -322,7 +322,7 @@ impl DirtyCleanVisitor<'tcx> { /// Return all DepNode labels that should be asserted for this item. /// index=0 is the "name" used for error messages fn auto_labels(&mut self, item_id: hir::HirId, attr: &Attribute) -> (&'static str, Labels) { - let node = self.tcx.hir().get_by_hir_id(item_id); + let node = self.tcx.hir().get(item_id); let (name, labels) = match node { HirNode::Item(item) => { match item.node { diff --git a/src/librustc_lint/types.rs b/src/librustc_lint/types.rs index 5f052f65333bb..cd4eecf26387f 100644 --- a/src/librustc_lint/types.rs +++ b/src/librustc_lint/types.rs @@ -276,7 +276,7 @@ fn lint_int_literal<'a, 'tcx>( } let par_id = cx.tcx.hir().get_parent_node_by_hir_id(e.hir_id); - if let Node::Expr(par_e) = cx.tcx.hir().get_by_hir_id(par_id) { + if let Node::Expr(par_e) = cx.tcx.hir().get(par_id) { if let hir::ExprKind::Struct(..) = par_e.node { if is_range_literal(cx.sess(), par_e) && lint_overflowing_range_endpoint(cx, lit, v, max, e, par_e, t) @@ -315,7 +315,7 @@ fn lint_uint_literal<'a, 'tcx>( }; if lit_val < min || lit_val > max { let parent_id = cx.tcx.hir().get_parent_node_by_hir_id(e.hir_id); - if let Node::Expr(par_e) = cx.tcx.hir().get_by_hir_id(parent_id) { + if let Node::Expr(par_e) = cx.tcx.hir().get(parent_id) { match par_e.node { hir::ExprKind::Cast(..) => { if let ty::Char = cx.tables.expr_ty(par_e).sty { diff --git a/src/librustc_mir/borrow_check/conflict_errors.rs b/src/librustc_mir/borrow_check/conflict_errors.rs index dfaad95fa3cb9..f23cffeda689c 100644 --- a/src/librustc_mir/borrow_check/conflict_errors.rs +++ b/src/librustc_mir/borrow_check/conflict_errors.rs @@ -853,7 +853,7 @@ impl<'cx, 'tcx> MirBorrowckCtxt<'cx, 'tcx> { format!( "...but `{}` will be dropped here, when the function `{}` returns", name, - self.infcx.tcx.hir().name_by_hir_id(fn_hir_id), + self.infcx.tcx.hir().name(fn_hir_id), ), ); diff --git a/src/librustc_mir/borrow_check/error_reporting.rs b/src/librustc_mir/borrow_check/error_reporting.rs index 7eb296353a494..ac64cf79537cd 100644 --- a/src/librustc_mir/borrow_check/error_reporting.rs +++ b/src/librustc_mir/borrow_check/error_reporting.rs @@ -349,7 +349,7 @@ impl<'cx, 'tcx> MirBorrowckCtxt<'cx, 'tcx> { let (&var_id, _) = self.infcx.tcx.upvars(def_id).unwrap() .get_index(field.index()).unwrap(); - self.infcx.tcx.hir().name_by_hir_id(var_id).to_string() + self.infcx.tcx.hir().name(var_id).to_string() } _ => { // Might need a revision when the fields in trait RFC is implemented @@ -659,7 +659,7 @@ impl<'cx, 'tcx> MirBorrowckCtxt<'cx, 'tcx> { def_id, target_place, places ); let hir_id = self.infcx.tcx.hir().as_local_hir_id(def_id)?; - let expr = &self.infcx.tcx.hir().expect_expr_by_hir_id(hir_id).node; + let expr = &self.infcx.tcx.hir().expect_expr(hir_id).node; debug!("closure_span: hir_id={:?} expr={:?}", hir_id, expr); if let hir::ExprKind::Closure( .., args_span, _ diff --git a/src/librustc_mir/borrow_check/mod.rs b/src/librustc_mir/borrow_check/mod.rs index ca8c4c58301ab..919ed5ccaba1e 100644 --- a/src/librustc_mir/borrow_check/mod.rs +++ b/src/librustc_mir/borrow_check/mod.rs @@ -124,14 +124,13 @@ fn do_mir_borrowck<'a, 'tcx>( .flat_map(|v| v.values()) .map(|upvar_id| { let var_hir_id = upvar_id.var_path.hir_id; - let var_node_id = tcx.hir().hir_to_node_id(var_hir_id); let capture = tables.upvar_capture(*upvar_id); let by_ref = match capture { ty::UpvarCapture::ByValue => false, ty::UpvarCapture::ByRef(..) => true, }; let mut upvar = Upvar { - name: tcx.hir().name(var_node_id), + name: tcx.hir().name(var_hir_id), var_hir_id, by_ref, mutability: Mutability::Not, @@ -231,7 +230,7 @@ fn do_mir_borrowck<'a, 'tcx>( |bd, i| DebugFormatted::new(&bd.move_data().inits[i]), )); - let movable_generator = match tcx.hir().get_by_hir_id(id) { + let movable_generator = match tcx.hir().get(id) { Node::Expr(&hir::Expr { node: hir::ExprKind::Closure(.., Some(hir::GeneratorMovability::Static)), .. diff --git a/src/librustc_mir/borrow_check/nll/region_infer/error_reporting/region_name.rs b/src/librustc_mir/borrow_check/nll/region_infer/error_reporting/region_name.rs index 46b690129ea25..3f5b2f4bce78b 100644 --- a/src/librustc_mir/borrow_check/nll/region_infer/error_reporting/region_name.rs +++ b/src/librustc_mir/borrow_check/nll/region_infer/error_reporting/region_name.rs @@ -237,7 +237,7 @@ impl<'tcx> RegionInferenceContext<'tcx> { if let DefiningTy::Closure(def_id, substs) = def_ty { let args_span = if let hir::ExprKind::Closure(_, _, _, span, _) = - tcx.hir().expect_expr_by_hir_id(mir_hir_id).node + tcx.hir().expect_expr(mir_hir_id).node { span } else { @@ -698,7 +698,7 @@ impl<'tcx> RegionInferenceContext<'tcx> { let mir_hir_id = tcx.hir().as_local_hir_id(mir_def_id).expect("non-local mir"); - let (return_span, mir_description) = match tcx.hir().get_by_hir_id(mir_hir_id) { + let (return_span, mir_description) = match tcx.hir().get(mir_hir_id) { hir::Node::Expr(hir::Expr { node: hir::ExprKind::Closure(_, return_ty, _, span, gen_move), .. @@ -761,7 +761,7 @@ impl<'tcx> RegionInferenceContext<'tcx> { let mir_hir_id = tcx.hir().as_local_hir_id(mir_def_id).expect("non-local mir"); - let yield_span = match tcx.hir().get_by_hir_id(mir_hir_id) { + let yield_span = match tcx.hir().get(mir_hir_id) { hir::Node::Expr(hir::Expr { node: hir::ExprKind::Closure(_, _, _, span, _), .. diff --git a/src/librustc_mir/borrow_check/nll/region_infer/error_reporting/var_name.rs b/src/librustc_mir/borrow_check/nll/region_infer/error_reporting/var_name.rs index 59fc4113794a4..750a1324faeb3 100644 --- a/src/librustc_mir/borrow_check/nll/region_infer/error_reporting/var_name.rs +++ b/src/librustc_mir/borrow_check/nll/region_infer/error_reporting/var_name.rs @@ -72,7 +72,7 @@ impl<'tcx> RegionInferenceContext<'tcx> { let upvar_hir_id = upvars[upvar_index].var_hir_id; debug!("get_upvar_name_and_span_for_region: upvar_hir_id={:?}", upvar_hir_id); - let upvar_name = tcx.hir().name_by_hir_id(upvar_hir_id); + let upvar_name = tcx.hir().name(upvar_hir_id); let upvar_span = tcx.hir().span(upvar_hir_id); debug!("get_upvar_name_and_span_for_region: upvar_name={:?} upvar_span={:?}", upvar_name, upvar_span); diff --git a/src/librustc_mir/borrow_check/nll/universal_regions.rs b/src/librustc_mir/borrow_check/nll/universal_regions.rs index fa3c7b9613e19..a85f4776a8bee 100644 --- a/src/librustc_mir/borrow_check/nll/universal_regions.rs +++ b/src/librustc_mir/borrow_check/nll/universal_regions.rs @@ -767,7 +767,7 @@ fn for_each_late_bound_region_defined_on<'tcx>( owner: fn_def_id.index, local_id: *late_bound, }; - let name = tcx.hir().name_by_hir_id(hir_id).as_interned_str(); + let name = tcx.hir().name(hir_id).as_interned_str(); let region_def_id = tcx.hir().local_def_id_from_hir_id(hir_id); let liberated_region = tcx.mk_region(ty::ReFree(ty::FreeRegion { scope: fn_def_id, diff --git a/src/librustc_mir/build/mod.rs b/src/librustc_mir/build/mod.rs index f7958434afa64..66064221b391c 100644 --- a/src/librustc_mir/build/mod.rs +++ b/src/librustc_mir/build/mod.rs @@ -26,7 +26,7 @@ pub fn mir_build<'tcx>(tcx: TyCtxt<'tcx>, def_id: DefId) -> Body<'tcx> { let id = tcx.hir().as_local_hir_id(def_id).unwrap(); // Figure out what primary body this item has. - let (body_id, return_ty_span) = match tcx.hir().get_by_hir_id(id) { + let (body_id, return_ty_span) = match tcx.hir().get(id) { Node::Expr(hir::Expr { node: hir::ExprKind::Closure(_, decl, body_id, _, _), .. }) | Node::Item(hir::Item { node: hir::ItemKind::Fn(decl, _, _, body_id), .. }) | Node::ImplItem( diff --git a/src/librustc_mir/hair/cx/expr.rs b/src/librustc_mir/hair/cx/expr.rs index baf9086a4800e..597f172da671f 100644 --- a/src/librustc_mir/hair/cx/expr.rs +++ b/src/librustc_mir/hair/cx/expr.rs @@ -914,7 +914,7 @@ fn convert_path_expr<'a, 'tcx>( let generics = cx.tcx.generics_of(item_def_id); let local_def_id = cx.tcx.hir().local_def_id_from_hir_id(hir_id); let index = generics.param_def_id_to_index[&local_def_id]; - let name = cx.tcx.hir().name_by_hir_id(hir_id).as_interned_str(); + let name = cx.tcx.hir().name(hir_id).as_interned_str(); let val = ConstValue::Param(ty::ParamConst::new(index, name)); ExprKind::Literal { literal: cx.tcx.mk_const( diff --git a/src/librustc_mir/hair/cx/mod.rs b/src/librustc_mir/hair/cx/mod.rs index 4e197f1ed4ecf..a21d900cf5e5e 100644 --- a/src/librustc_mir/hair/cx/mod.rs +++ b/src/librustc_mir/hair/cx/mod.rs @@ -155,7 +155,7 @@ impl<'a, 'tcx> Cx<'a, 'tcx> { pub fn pattern_from_hir(&mut self, p: &hir::Pat) -> Pattern<'tcx> { let tcx = self.tcx.global_tcx(); - let p = match tcx.hir().get_by_hir_id(p.hir_id) { + let p = match tcx.hir().get(p.hir_id) { Node::Pat(p) | Node::Binding(p) => p, node => bug!("pattern became {:?}", node) }; diff --git a/src/librustc_mir/interpret/validity.rs b/src/librustc_mir/interpret/validity.rs index d747eddd8d7ba..e42c667fec9ef 100644 --- a/src/librustc_mir/interpret/validity.rs +++ b/src/librustc_mir/interpret/validity.rs @@ -193,7 +193,7 @@ impl<'rt, 'mir, 'tcx, M: Machine<'mir, 'tcx>> ValidityVisitor<'rt, 'mir, 'tcx, M // Sometimes the index is beyond the number of upvars (seen // for a generator). if let Some((&var_hir_id, _)) = upvars.get_index(field) { - let node = self.ecx.tcx.hir().get_by_hir_id(var_hir_id); + let node = self.ecx.tcx.hir().get(var_hir_id); if let hir::Node::Binding(pat) = node { if let hir::PatKind::Binding(_, _, ident, _) = pat.node { name = Some(ident.name); diff --git a/src/librustc_mir/lints.rs b/src/librustc_mir/lints.rs index a7120888742d0..8c815a51b5d65 100644 --- a/src/librustc_mir/lints.rs +++ b/src/librustc_mir/lints.rs @@ -10,7 +10,7 @@ use rustc::ty::subst::InternalSubsts; pub fn check(tcx: TyCtxt<'tcx>, body: &Body<'tcx>, def_id: DefId) { let hir_id = tcx.hir().as_local_hir_id(def_id).unwrap(); - if let Some(fn_like_node) = FnLikeNode::from_node(tcx.hir().get_by_hir_id(hir_id)) { + if let Some(fn_like_node) = FnLikeNode::from_node(tcx.hir().get(hir_id)) { check_fn_for_unconditional_recursion(tcx, fn_like_node.kind(), body, def_id); } } diff --git a/src/librustc_mir/transform/const_prop.rs b/src/librustc_mir/transform/const_prop.rs index 5b567512a7b6f..9092cf2c45796 100644 --- a/src/librustc_mir/transform/const_prop.rs +++ b/src/librustc_mir/transform/const_prop.rs @@ -41,7 +41,7 @@ impl MirPass for ConstProp { let hir_id = tcx.hir().as_local_hir_id(source.def_id()) .expect("Non-local call to local provider is_const_fn"); - let is_fn_like = FnLikeNode::from_node(tcx.hir().get_by_hir_id(hir_id)).is_some(); + let is_fn_like = FnLikeNode::from_node(tcx.hir().get(hir_id)).is_some(); let is_assoc_const = match tcx.def_kind(source.def_id()) { Some(DefKind::AssocConst) => true, _ => false, diff --git a/src/librustc_passes/loops.rs b/src/librustc_passes/loops.rs index e1e4195d6d516..1c18322259f80 100644 --- a/src/librustc_passes/loops.rs +++ b/src/librustc_passes/loops.rs @@ -116,7 +116,7 @@ impl<'a, 'hir> Visitor<'hir> for CheckLoopVisitor<'a, 'hir> { let loop_kind = if loop_id == hir::DUMMY_HIR_ID { None } else { - Some(match self.hir_map.expect_expr_by_hir_id(loop_id).node { + Some(match self.hir_map.expect_expr(loop_id).node { hir::ExprKind::While(..) => LoopKind::WhileLoop, hir::ExprKind::Loop(_, _, source) => LoopKind::Loop(source), ref r => span_bug!(e.span, diff --git a/src/librustc_privacy/lib.rs b/src/librustc_privacy/lib.rs index ba834bf09aa84..0fdc9ac890350 100644 --- a/src/librustc_privacy/lib.rs +++ b/src/librustc_privacy/lib.rs @@ -229,14 +229,14 @@ fn def_id_visibility<'tcx>( ) -> (ty::Visibility, Span, &'static str) { match tcx.hir().as_local_hir_id(def_id) { Some(hir_id) => { - let vis = match tcx.hir().get_by_hir_id(hir_id) { + let vis = match tcx.hir().get(hir_id) { Node::Item(item) => &item.vis, Node::ForeignItem(foreign_item) => &foreign_item.vis, Node::TraitItem(..) | Node::Variant(..) => { return def_id_visibility(tcx, tcx.hir().get_parent_did(hir_id)); } Node::ImplItem(impl_item) => { - match tcx.hir().get_by_hir_id(tcx.hir().get_parent_item(hir_id)) { + match tcx.hir().get(tcx.hir().get_parent_item(hir_id)) { Node::Item(item) => match &item.node { hir::ItemKind::Impl(.., None, _, _) => &impl_item.vis, hir::ItemKind::Impl(.., Some(trait_ref), _, _) @@ -248,7 +248,7 @@ fn def_id_visibility<'tcx>( } Node::Ctor(vdata) => { let parent_hir_id = tcx.hir().get_parent_node_by_hir_id(hir_id); - match tcx.hir().get_by_hir_id(parent_hir_id) { + match tcx.hir().get(parent_hir_id) { Node::Variant(..) => { let parent_did = tcx.hir().local_def_id_from_hir_id(parent_hir_id); let (mut ctor_vis, mut span, mut descr) = def_id_visibility( @@ -274,7 +274,7 @@ fn def_id_visibility<'tcx>( return (ctor_vis, span, descr); } Node::Item(..) => { - let item = match tcx.hir().get_by_hir_id(parent_hir_id) { + let item = match tcx.hir().get(parent_hir_id) { Node::Item(item) => item, node => bug!("unexpected node kind: {:?}", node), }; diff --git a/src/librustc_save_analysis/dump_visitor.rs b/src/librustc_save_analysis/dump_visitor.rs index a7f46e876830c..f67241ef23efc 100644 --- a/src/librustc_save_analysis/dump_visitor.rs +++ b/src/librustc_save_analysis/dump_visitor.rs @@ -1531,7 +1531,8 @@ impl<'l, 'tcx, 'll, O: DumpOutput + 'll> Visitor<'l> for DumpVisitor<'l, 'tcx, ' self.process_macro_use(ex.span); match ex.node { ast::ExprKind::Struct(ref path, ref fields, ref base) => { - let hir_expr = self.save_ctxt.tcx.hir().expect_expr(ex.id); + let expr_hir_id = self.save_ctxt.tcx.hir().node_to_hir_id(ex.id); + let hir_expr = self.save_ctxt.tcx.hir().expect_expr(expr_hir_id); let adt = match self.save_ctxt.tables.expr_ty_opt(&hir_expr) { Some(ty) if ty.ty_adt_def().is_some() => ty.ty_adt_def().unwrap(), _ => { diff --git a/src/librustc_save_analysis/lib.rs b/src/librustc_save_analysis/lib.rs index bc813b3d5a2e7..23fe150c6ff65 100644 --- a/src/librustc_save_analysis/lib.rs +++ b/src/librustc_save_analysis/lib.rs @@ -513,7 +513,8 @@ impl<'l, 'tcx> SaveContext<'l, 'tcx> { } pub fn get_expr_data(&self, expr: &ast::Expr) -> Option { - let hir_node = self.tcx.hir().expect_expr(expr.id); + let expr_hir_id = self.tcx.hir().node_to_hir_id(expr.id); + let hir_node = self.tcx.hir().expect_expr(expr_hir_id); let ty = self.tables.expr_ty_adjusted_opt(&hir_node); if ty.is_none() || ty.unwrap().sty == ty::Error { return None; @@ -606,7 +607,8 @@ impl<'l, 'tcx> SaveContext<'l, 'tcx> { } pub fn get_path_res(&self, id: NodeId) -> Res { - match self.tcx.hir().get(id) { + let hir_id = self.tcx.hir().node_to_hir_id(id); + match self.tcx.hir().get(hir_id) { Node::TraitRef(tr) => tr.path.res, Node::Item(&hir::Item { @@ -627,7 +629,6 @@ impl<'l, 'tcx> SaveContext<'l, 'tcx> { node: hir::ExprKind::Struct(ref qpath, ..), .. }) => { - let hir_id = self.tcx.hir().node_to_hir_id(id); self.tables.qpath_res(qpath, hir_id) } @@ -651,7 +652,6 @@ impl<'l, 'tcx> SaveContext<'l, 'tcx> { node: hir::TyKind::Path(ref qpath), .. }) => { - let hir_id = self.tcx.hir().node_to_hir_id(id); self.tables.qpath_res(qpath, hir_id) } diff --git a/src/librustc_traits/lowering/environment.rs b/src/librustc_traits/lowering/environment.rs index d1bad6b4d1ee2..0173685583148 100644 --- a/src/librustc_traits/lowering/environment.rs +++ b/src/librustc_traits/lowering/environment.rs @@ -185,7 +185,7 @@ crate fn environment<'tcx>(tcx: TyCtxt<'tcx>, def_id: DefId) -> Environment<'tcx .map(Clause::ForAll); let hir_id = tcx.hir().as_local_hir_id(def_id).unwrap(); - let node = tcx.hir().get_by_hir_id(hir_id); + let node = tcx.hir().get(hir_id); enum NodeKind { TraitImpl, diff --git a/src/librustc_typeck/astconv.rs b/src/librustc_typeck/astconv.rs index 267f3798bd1e3..514a400d90e8c 100644 --- a/src/librustc_typeck/astconv.rs +++ b/src/librustc_typeck/astconv.rs @@ -123,7 +123,7 @@ impl<'o, 'tcx> dyn AstConv<'tcx> + 'o { { let tcx = self.tcx(); let lifetime_name = |def_id| { - tcx.hir().name_by_hir_id(tcx.hir().as_local_hir_id(def_id).unwrap()).as_interned_str() + tcx.hir().name(tcx.hir().as_local_hir_id(def_id).unwrap()).as_interned_str() }; let r = match tcx.named_region(lifetime.hir_id) { @@ -2004,7 +2004,7 @@ impl<'o, 'tcx> dyn AstConv<'tcx> + 'o { let item_def_id = tcx.hir().local_def_id_from_hir_id(item_id); let generics = tcx.generics_of(item_def_id); let index = generics.param_def_id_to_index[&def_id]; - tcx.mk_ty_param(index, tcx.hir().name_by_hir_id(hir_id).as_interned_str()) + tcx.mk_ty_param(index, tcx.hir().name(hir_id).as_interned_str()) } Res::SelfTy(Some(_), None) => { // `Self` in trait or type alias. @@ -2194,7 +2194,7 @@ impl<'o, 'tcx> dyn AstConv<'tcx> + 'o { let item_def_id = tcx.hir().local_def_id_from_hir_id(item_id); let generics = tcx.generics_of(item_def_id); let index = generics.param_def_id_to_index[&tcx.hir().local_def_id_from_hir_id(hir_id)]; - let name = tcx.hir().name_by_hir_id(hir_id).as_interned_str(); + let name = tcx.hir().name(hir_id).as_interned_str(); const_.val = ConstValue::Param(ty::ParamConst::new(index, name)); } diff --git a/src/librustc_typeck/check/_match.rs b/src/librustc_typeck/check/_match.rs index 65a36d9230641..293b68c871131 100644 --- a/src/librustc_typeck/check/_match.rs +++ b/src/librustc_typeck/check/_match.rs @@ -547,7 +547,7 @@ impl<'a, 'tcx> FnCtxt<'a, 'tcx> { let tcx = self.tcx; if let PatKind::Binding(..) = inner.node { let parent_id = tcx.hir().get_parent_node_by_hir_id(pat.hir_id); - let parent = tcx.hir().get_by_hir_id(parent_id); + let parent = tcx.hir().get(parent_id); debug!("inner {:?} pat {:?} parent {:?}", inner, pat, parent); match parent { hir::Node::Item(hir::Item { node: hir::ItemKind::Fn(..), .. }) | @@ -812,10 +812,10 @@ https://doc.rust-lang.org/reference/types.html#trait-objects"); let match_id = hir.get_parent_node_by_hir_id(arm_id); let containing_id = hir.get_parent_node_by_hir_id(match_id); - let node = hir.get_by_hir_id(containing_id); + let node = hir.get(containing_id); if let Block(block) = node { // check that the body's parent is an fn - let parent = hir.get_by_hir_id( + let parent = hir.get( hir.get_parent_node_by_hir_id( hir.get_parent_node_by_hir_id(block.hir_id), ), diff --git a/src/librustc_typeck/check/callee.rs b/src/librustc_typeck/check/callee.rs index 42c7ff607c55a..87807ad91a27d 100644 --- a/src/librustc_typeck/check/callee.rs +++ b/src/librustc_typeck/check/callee.rs @@ -245,7 +245,7 @@ impl<'a, 'tcx> FnCtxt<'a, 'tcx> { callee_span: Span, ) { let hir_id = self.tcx.hir().get_parent_node_by_hir_id(hir_id); - let parent_node = self.tcx.hir().get_by_hir_id(hir_id); + let parent_node = self.tcx.hir().get(hir_id); if let ( hir::Node::Expr(hir::Expr { node: hir::ExprKind::Closure(_, _, _, sp, ..), .. }), hir::ExprKind::Block(..), diff --git a/src/librustc_typeck/check/coercion.rs b/src/librustc_typeck/check/coercion.rs index a56196ccf82f5..71a0ca090b0d8 100644 --- a/src/librustc_typeck/check/coercion.rs +++ b/src/librustc_typeck/check/coercion.rs @@ -1291,7 +1291,7 @@ impl<'tcx, 'exprs, E: AsCoercionSite> CoerceMany<'tcx, 'exprs, E> { cause.span, blk_id, ); - let parent = fcx.tcx.hir().get_by_hir_id(parent_id); + let parent = fcx.tcx.hir().get(parent_id); fcx.get_node_fn_decl(parent).map(|(fn_decl, _, is_main)| (fn_decl, is_main)) } else { fcx.get_fn_decl(parent_id) diff --git a/src/librustc_typeck/check/method/suggest.rs b/src/librustc_typeck/check/method/suggest.rs index 5943302c7088f..8ad67c2adc035 100644 --- a/src/librustc_typeck/check/method/suggest.rs +++ b/src/librustc_typeck/check/method/suggest.rs @@ -268,7 +268,7 @@ impl<'a, 'tcx> FnCtxt<'a, 'tcx> { let snippet = tcx.sess.source_map().span_to_snippet(span); let filename = tcx.sess.source_map().span_to_filename(span); - let parent_node = self.tcx.hir().get_by_hir_id( + let parent_node = self.tcx.hir().get( self.tcx.hir().get_parent_node_by_hir_id(hir_id), ); let msg = format!( @@ -389,7 +389,7 @@ impl<'a, 'tcx> FnCtxt<'a, 'tcx> { Applicability::MachineApplicable, ); } else { - let call_expr = self.tcx.hir().expect_expr_by_hir_id( + let call_expr = self.tcx.hir().expect_expr( self.tcx.hir().get_parent_node_by_hir_id(expr.hir_id), ); diff --git a/src/librustc_typeck/check/mod.rs b/src/librustc_typeck/check/mod.rs index bde4f80457451..0ec5c9763a0fb 100644 --- a/src/librustc_typeck/check/mod.rs +++ b/src/librustc_typeck/check/mod.rs @@ -759,7 +759,7 @@ fn primary_body_of<'tcx>( tcx: TyCtxt<'tcx>, id: hir::HirId, ) -> Option<(hir::BodyId, Option<&'tcx hir::FnDecl>)> { - match tcx.hir().get_by_hir_id(id) { + match tcx.hir().get(id) { Node::Item(item) => { match item.node { hir::ItemKind::Const(_, body) | @@ -993,10 +993,9 @@ impl<'a, 'tcx> Visitor<'tcx> for GatherLocalsVisitor<'a, 'tcx> { if let PatKind::Binding(_, _, ident, _) = p.node { let var_ty = self.assign(p.span, p.hir_id, None); - let node_id = self.fcx.tcx.hir().hir_to_node_id(p.hir_id); if !self.fcx.tcx.features().unsized_locals { self.fcx.require_type_is_sized(var_ty, p.span, - traits::VariableType(node_id)); + traits::VariableType(p.hir_id)); } debug!("Pattern binding {} is assigned to {} with type {:?}", @@ -1214,7 +1213,7 @@ fn check_fn<'a, 'tcx>( ); } - if let Node::Item(item) = fcx.tcx.hir().get_by_hir_id(fn_id) { + if let Node::Item(item) = fcx.tcx.hir().get(fn_id) { if let ItemKind::Fn(_, _, ref generics, _) = item.node { if !generics.params.is_empty() { fcx.tcx.sess.span_err( @@ -1262,7 +1261,7 @@ fn check_fn<'a, 'tcx>( ); } - if let Node::Item(item) = fcx.tcx.hir().get_by_hir_id(fn_id) { + if let Node::Item(item) = fcx.tcx.hir().get(fn_id) { if let ItemKind::Fn(_, _, ref generics, _) = item.node { if !generics.params.is_empty() { fcx.tcx.sess.span_err( @@ -3677,7 +3676,7 @@ impl<'a, 'tcx> FnCtxt<'a, 'tcx> { } fn parent_item_span(&self, id: hir::HirId) -> Option { - let node = self.tcx.hir().get_by_hir_id(self.tcx.hir().get_parent_item(id)); + let node = self.tcx.hir().get(self.tcx.hir().get_parent_item(id)); match node { Node::Item(&hir::Item { node: hir::ItemKind::Fn(_, _, _, body_id), .. @@ -3697,7 +3696,7 @@ impl<'a, 'tcx> FnCtxt<'a, 'tcx> { /// Given a function block's `HirId`, returns its `FnDecl` if it exists, or `None` otherwise. fn get_parent_fn_decl(&self, blk_id: hir::HirId) -> Option<(&'tcx hir::FnDecl, ast::Ident)> { - let parent = self.tcx.hir().get_by_hir_id(self.tcx.hir().get_parent_item(blk_id)); + let parent = self.tcx.hir().get(self.tcx.hir().get_parent_item(blk_id)); self.get_node_fn_decl(parent).map(|(fn_decl, ident, _)| (fn_decl, ident)) } @@ -3732,7 +3731,7 @@ impl<'a, 'tcx> FnCtxt<'a, 'tcx> { // Get enclosing Fn, if it is a function or a trait method, unless there's a `loop` or // `while` before reaching it, as block tail returns are not available in them. self.tcx.hir().get_return_block(blk_id).and_then(|blk_id| { - let parent = self.tcx.hir().get_by_hir_id(blk_id); + let parent = self.tcx.hir().get(blk_id); self.get_node_fn_decl(parent).map(|(fn_decl, _, is_main)| (fn_decl, is_main)) }) } @@ -4259,7 +4258,7 @@ impl<'a, 'tcx> FnCtxt<'a, 'tcx> { // If our calling expression is indeed the function itself, we're good! // If not, generate an error that this can only be called directly. - if let Node::Expr(expr) = self.tcx.hir().get_by_hir_id( + if let Node::Expr(expr) = self.tcx.hir().get( self.tcx.hir().get_parent_node_by_hir_id(hir_id)) { if let ExprKind::Call(ref callee, ..) = expr.node { @@ -4335,7 +4334,7 @@ impl<'a, 'tcx> FnCtxt<'a, 'tcx> { let mut contained_in_place = false; while let hir::Node::Expr(parent_expr) = - self.tcx.hir().get_by_hir_id(self.tcx.hir().get_parent_node_by_hir_id(expr_id)) + self.tcx.hir().get(self.tcx.hir().get_parent_node_by_hir_id(expr_id)) { match &parent_expr.node { hir::ExprKind::Assign(lhs, ..) | hir::ExprKind::AssignOp(_, lhs, ..) => { diff --git a/src/librustc_typeck/check/upvar.rs b/src/librustc_typeck/check/upvar.rs index bba108aa282a9..ac39757df74dc 100644 --- a/src/librustc_typeck/check/upvar.rs +++ b/src/librustc_typeck/check/upvar.rs @@ -652,5 +652,5 @@ impl<'a, 'tcx> euv::Delegate<'tcx> for InferBorrowKind<'a, 'tcx> { } fn var_name(tcx: TyCtxt<'_>, var_hir_id: hir::HirId) -> ast::Name { - tcx.hir().name_by_hir_id(var_hir_id) + tcx.hir().name(var_hir_id) } diff --git a/src/librustc_typeck/collect.rs b/src/librustc_typeck/collect.rs index 52cda4ac3c628..301168aefd203 100644 --- a/src/librustc_typeck/collect.rs +++ b/src/librustc_typeck/collect.rs @@ -284,7 +284,7 @@ fn type_param_predicates<'tcx>( let mut extend = None; let item_hir_id = tcx.hir().as_local_hir_id(item_def_id).unwrap(); - let ast_generics = match tcx.hir().get_by_hir_id(item_hir_id) { + let ast_generics = match tcx.hir().get(item_hir_id) { Node::TraitItem(item) => &item.generics, Node::ImplItem(item) => &item.generics, @@ -623,7 +623,7 @@ fn adt_def<'tcx>(tcx: TyCtxt<'tcx>, def_id: DefId) -> &'tcx ty::AdtDef { use rustc::hir::*; let hir_id = tcx.hir().as_local_hir_id(def_id).unwrap(); - let item = match tcx.hir().get_by_hir_id(hir_id) { + let item = match tcx.hir().get(hir_id) { Node::Item(item) => item, _ => bug!(), }; @@ -693,7 +693,7 @@ fn super_predicates_of<'tcx>( debug!("super_predicates(trait_def_id={:?})", trait_def_id); let trait_hir_id = tcx.hir().as_local_hir_id(trait_def_id).unwrap(); - let item = match tcx.hir().get_by_hir_id(trait_hir_id) { + let item = match tcx.hir().get(trait_hir_id) { Node::Item(item) => item, _ => bug!("trait_node_id {} is not an item", trait_hir_id), }; @@ -884,7 +884,7 @@ fn generics_of<'tcx>(tcx: TyCtxt<'tcx>, def_id: DefId) -> &'tcx ty::Generics { let hir_id = tcx.hir().as_local_hir_id(def_id).unwrap(); - let node = tcx.hir().get_by_hir_id(hir_id); + let node = tcx.hir().get(hir_id); let parent_def_id = match node { Node::ImplItem(_) | Node::TraitItem(_) | Node::Variant(_) | Node::Ctor(..) | Node::Field(_) => { @@ -1154,7 +1154,7 @@ pub fn checked_type_of<'tcx>(tcx: TyCtxt<'tcx>, def_id: DefId, fail: bool) -> Op let icx = ItemCtxt::new(tcx, def_id); - Some(match tcx.hir().get_by_hir_id(hir_id) { + Some(match tcx.hir().get(hir_id) { Node::TraitItem(item) => match item.node { TraitItemKind::Method(..) => { let substs = InternalSubsts::identity_for_item(tcx, def_id); @@ -1298,7 +1298,7 @@ pub fn checked_type_of<'tcx>(tcx: TyCtxt<'tcx>, def_id: DefId, fail: bool) -> Op } Node::AnonConst(_) => { - let parent_node = tcx.hir().get_by_hir_id(tcx.hir().get_parent_node_by_hir_id(hir_id)); + let parent_node = tcx.hir().get(tcx.hir().get_parent_node_by_hir_id(hir_id)); match parent_node { Node::Ty(&hir::Ty { node: hir::TyKind::Array(_, ref constant), @@ -1660,8 +1660,8 @@ fn find_existential_constraints<'tcx>(tcx: TyCtxt<'tcx>, def_id: DefId) -> Ty<'t if scope == hir::CRATE_HIR_ID { intravisit::walk_crate(&mut locator, tcx.hir().krate()); } else { - debug!("find_existential_constraints: scope={:?}", tcx.hir().get_by_hir_id(scope)); - match tcx.hir().get_by_hir_id(scope) { + debug!("find_existential_constraints: scope={:?}", tcx.hir().get(scope)); + match tcx.hir().get(scope) { Node::Item(ref it) => intravisit::walk_item(&mut locator, it), Node::ImplItem(ref it) => intravisit::walk_impl_item(&mut locator, it), Node::TraitItem(ref it) => intravisit::walk_trait_item(&mut locator, it), @@ -1690,7 +1690,7 @@ fn fn_sig<'tcx>(tcx: TyCtxt<'tcx>, def_id: DefId) -> ty::PolyFnSig<'tcx> { let icx = ItemCtxt::new(tcx, def_id); - match tcx.hir().get_by_hir_id(hir_id) { + match tcx.hir().get(hir_id) { TraitItem(hir::TraitItem { node: TraitItemKind::Method(sig, _), .. @@ -1903,7 +1903,7 @@ fn explicit_predicates_of<'tcx>( Some(hir_id) => hir_id, None => return tcx.predicates_of(def_id), }; - let node = tcx.hir().get_by_hir_id(hir_id); + let node = tcx.hir().get(hir_id); let mut is_trait = None; let mut is_default_impl_trait = None; diff --git a/src/librustc_typeck/outlives/implicit_infer.rs b/src/librustc_typeck/outlives/implicit_infer.rs index 1c2bb8c2f0b28..f2661b46b8b0c 100644 --- a/src/librustc_typeck/outlives/implicit_infer.rs +++ b/src/librustc_typeck/outlives/implicit_infer.rs @@ -61,7 +61,7 @@ impl<'cx, 'tcx> ItemLikeVisitor<'tcx> for InferVisitor<'cx, 'tcx> { .hir() .as_local_hir_id(item_did) .expect("expected local def-id"); - let item = match self.tcx.hir().get_by_hir_id(hir_id) { + let item = match self.tcx.hir().get(hir_id) { Node::Item(item) => item, _ => bug!(), }; diff --git a/src/librustc_typeck/outlives/mod.rs b/src/librustc_typeck/outlives/mod.rs index ad538b0effedf..63e41e01fbff5 100644 --- a/src/librustc_typeck/outlives/mod.rs +++ b/src/librustc_typeck/outlives/mod.rs @@ -29,7 +29,7 @@ fn inferred_outlives_of<'tcx>( .as_local_hir_id(item_def_id) .expect("expected local def-id"); - match tcx.hir().get_by_hir_id(id) { + match tcx.hir().get(id) { Node::Item(item) => match item.node { hir::ItemKind::Struct(..) | hir::ItemKind::Enum(..) | hir::ItemKind::Union(..) => { let crate_map = tcx.inferred_outlives_crate(LOCAL_CRATE); diff --git a/src/librustc_typeck/variance/mod.rs b/src/librustc_typeck/variance/mod.rs index 5dbd667485e98..1a8871a3da9da 100644 --- a/src/librustc_typeck/variance/mod.rs +++ b/src/librustc_typeck/variance/mod.rs @@ -48,7 +48,7 @@ fn variances_of<'tcx>(tcx: TyCtxt<'tcx>, item_def_id: DefId) -> &'tcx [ty::Varia // Variance not relevant. span_bug!(tcx.hir().span(id), "asked to compute variance for wrong kind of item") }; - match tcx.hir().get_by_hir_id(id) { + match tcx.hir().get(id) { Node::Item(item) => match item.node { hir::ItemKind::Enum(..) | hir::ItemKind::Struct(..) | diff --git a/src/librustdoc/Cargo.toml b/src/librustdoc/Cargo.toml index b75212d606fa5..3158ec3832aed 100644 --- a/src/librustdoc/Cargo.toml +++ b/src/librustdoc/Cargo.toml @@ -11,5 +11,6 @@ path = "lib.rs" [dependencies] pulldown-cmark = { version = "0.5.2", default-features = false } minifier = "0.0.30" +rayon = { version = "0.2.0", package = "rustc-rayon" } tempfile = "3" parking_lot = "0.7" diff --git a/src/librustdoc/docfs.rs b/src/librustdoc/docfs.rs new file mode 100644 index 0000000000000..740947fc3e37e --- /dev/null +++ b/src/librustdoc/docfs.rs @@ -0,0 +1,116 @@ +//! Rustdoc's FileSystem abstraction module. +//! +//! On Windows this indirects IO into threads to work around performance issues +//! with Defender (and other similar virus scanners that do blocking operations). +//! On other platforms this is a thin shim to fs. +//! +//! Only calls needed to permit this workaround have been abstracted: thus +//! fs::read is still done directly via the fs module; if in future rustdoc +//! needs to read-after-write from a file, then it would be added to this +//! abstraction. + +use errors; + +use std::fs; +use std::io; +use std::path::Path; +use std::sync::Arc; +use std::sync::mpsc::{channel, Receiver, Sender}; + +macro_rules! try_err { + ($e:expr, $file:expr) => {{ + match $e { + Ok(e) => e, + Err(e) => return Err(E::new(e, $file)), + } + }}; +} + +pub trait PathError { + fn new>(e: io::Error, path: P) -> Self; +} + +pub struct ErrorStorage { + sender: Option>>, + receiver: Receiver>, +} + +impl ErrorStorage { + pub fn new() -> ErrorStorage { + let (sender, receiver) = channel(); + ErrorStorage { + sender: Some(sender), + receiver, + } + } + + /// Prints all stored errors. Returns the number of printed errors. + pub fn write_errors(&mut self, diag: &errors::Handler) -> usize { + let mut printed = 0; + // In order to drop the sender part of the channel. + self.sender = None; + + for msg in self.receiver.iter() { + if let Some(ref error) = msg { + diag.struct_err(&error).emit(); + printed += 1; + } + } + printed + } +} + +pub struct DocFS { + sync_only: bool, + errors: Arc, +} + +impl DocFS { + pub fn new(errors: &Arc) -> DocFS { + DocFS { + sync_only: false, + errors: Arc::clone(errors), + } + } + + pub fn set_sync_only(&mut self, sync_only: bool) { + self.sync_only = sync_only; + } + + pub fn create_dir_all>(&self, path: P) -> io::Result<()> { + // For now, dir creation isn't a huge time consideration, do it + // synchronously, which avoids needing ordering between write() actions + // and directory creation. + fs::create_dir_all(path) + } + + pub fn write(&self, path: P, contents: C) -> Result<(), E> + where + P: AsRef, + C: AsRef<[u8]>, + E: PathError, + { + if !self.sync_only && cfg!(windows) { + // A possible future enhancement after more detailed profiling would + // be to create the file sync so errors are reported eagerly. + let contents = contents.as_ref().to_vec(); + let path = path.as_ref().to_path_buf(); + let sender = self.errors.sender.clone().unwrap(); + rayon::spawn(move || { + match fs::write(&path, &contents) { + Ok(_) => { + sender.send(None) + .expect(&format!("failed to send error on \"{}\"", path.display())); + } + Err(e) => { + sender.send(Some(format!("\"{}\": {}", path.display(), e))) + .expect(&format!("failed to send non-error on \"{}\"", path.display())); + } + } + }); + Ok(()) + } else { + Ok(try_err!(fs::write(&path, contents), path)) + } + } +} diff --git a/src/librustdoc/html/render.rs b/src/librustdoc/html/render.rs index b42a78f1e226a..f0aff961c6751 100644 --- a/src/librustdoc/html/render.rs +++ b/src/librustdoc/html/render.rs @@ -35,9 +35,9 @@ use std::default::Default; use std::error; use std::fmt::{self, Display, Formatter, Write as FmtWrite}; use std::ffi::OsStr; -use std::fs::{self, File, OpenOptions}; +use std::fs::{self, File}; use std::io::prelude::*; -use std::io::{self, BufWriter, BufReader}; +use std::io::{self, BufReader}; use std::mem; use std::path::{PathBuf, Path, Component}; use std::str; @@ -61,6 +61,7 @@ use rustc_data_structures::flock; use crate::clean::{self, AttributesExt, Deprecation, GetDefId, SelfTy, Mutability}; use crate::config::RenderOptions; +use crate::docfs::{DocFS, ErrorStorage, PathError}; use crate::doctree; use crate::fold::DocFolder; use crate::html::escape::Escape; @@ -89,6 +90,58 @@ impl<'a> Display for SlashChecker<'a> { } } +#[derive(Debug)] +pub struct Error { + pub file: PathBuf, + pub error: io::Error, +} + +impl error::Error for Error { + fn description(&self) -> &str { + self.error.description() + } +} + +impl Display for Error { + fn fmt(&self, f: &mut Formatter<'_>) -> fmt::Result { + let file = self.file.display().to_string(); + if file.is_empty() { + write!(f, "{}", self.error) + } else { + write!(f, "\"{}\": {}", self.file.display(), self.error) + } + } +} + +impl PathError for Error { + fn new>(e: io::Error, path: P) -> Error { + Error { + file: path.as_ref().to_path_buf(), + error: e, + } + } +} + +macro_rules! try_none { + ($e:expr, $file:expr) => ({ + use std::io; + match $e { + Some(e) => e, + None => return Err(Error::new(io::Error::new(io::ErrorKind::Other, "not found"), + $file)) + } + }) +} + +macro_rules! try_err { + ($e:expr, $file:expr) => ({ + match $e { + Ok(e) => e, + Err(e) => return Err(Error::new(e, $file)), + } + }) +} + /// Major driving force in all rustdoc rendering. This contains information /// about where in the tree-like hierarchy rendering is occurring and controls /// how the current page is being rendered. @@ -156,13 +209,15 @@ struct SharedContext { pub generate_search_filter: bool, /// Option disabled by default to generate files used by RLS and some other tools. pub generate_redirect_pages: bool, + /// The fs handle we are working with. + pub fs: DocFS, } impl SharedContext { - fn ensure_dir(&self, dst: &Path) -> io::Result<()> { + fn ensure_dir(&self, dst: &Path) -> Result<(), Error> { let mut dirs = self.created_dirs.borrow_mut(); if !dirs.contains(dst) { - fs::create_dir_all(dst)?; + try_err!(self.fs.create_dir_all(dst), dst); dirs.insert(dst.to_path_buf()); } @@ -216,53 +271,6 @@ impl Impl { } } -#[derive(Debug)] -pub struct Error { - pub file: PathBuf, - pub error: io::Error, -} - -impl error::Error for Error { - fn description(&self) -> &str { - self.error.description() - } -} - -impl Display for Error { - fn fmt(&self, f: &mut Formatter<'_>) -> fmt::Result { - write!(f, "\"{}\": {}", self.file.display(), self.error) - } -} - -impl Error { - pub fn new(e: io::Error, file: &Path) -> Error { - Error { - file: file.to_path_buf(), - error: e, - } - } -} - -macro_rules! try_none { - ($e:expr, $file:expr) => ({ - use std::io; - match $e { - Some(e) => e, - None => return Err(Error::new(io::Error::new(io::ErrorKind::Other, "not found"), - $file)) - } - }) -} - -macro_rules! try_err { - ($e:expr, $file:expr) => ({ - match $e { - Ok(e) => e, - Err(e) => return Err(Error::new(e, $file)), - } - }) -} - /// This cache is used to store information about the `clean::Crate` being /// rendered in order to provide more useful documentation. This contains /// information like all implementors of a trait, all traits a type implements, @@ -544,6 +552,7 @@ pub fn run(mut krate: clean::Crate, }, _ => PathBuf::new(), }; + let mut errors = Arc::new(ErrorStorage::new()); let mut scx = SharedContext { src_root, passes, @@ -564,6 +573,7 @@ pub fn run(mut krate: clean::Crate, static_root_path, generate_search_filter, generate_redirect_pages, + fs: DocFS::new(&errors), }; // If user passed in `--playground-url` arg, we fill in crate name here @@ -601,9 +611,9 @@ pub fn run(mut krate: clean::Crate, } } let dst = output; - try_err!(fs::create_dir_all(&dst), &dst); + scx.ensure_dir(&dst)?; krate = render_sources(&dst, &mut scx, krate)?; - let cx = Context { + let mut cx = Context { current: Vec::new(), dst, render_redirect_pages: false, @@ -705,10 +715,21 @@ pub fn run(mut krate: clean::Crate, CACHE_KEY.with(|v| *v.borrow_mut() = cache.clone()); CURRENT_LOCATION_KEY.with(|s| s.borrow_mut().clear()); + // Write shared runs within a flock; disable thread dispatching of IO temporarily. + Arc::get_mut(&mut cx.shared).unwrap().fs.set_sync_only(true); write_shared(&cx, &krate, &*cache, index, &md_opts, diag)?; + Arc::get_mut(&mut cx.shared).unwrap().fs.set_sync_only(false); // And finally render the whole crate's documentation - cx.krate(krate) + let ret = cx.krate(krate); + let nb_errors = Arc::get_mut(&mut errors).map_or_else(|| 0, |errors| errors.write_errors(diag)); + if ret.is_err() { + ret + } else if nb_errors > 0 { + Err(Error::new(io::Error::new(io::ErrorKind::Other, "I/O error"), "")) + } else { + Ok(()) + } } /// Builds the search index from the collected metadata @@ -797,13 +818,13 @@ fn write_shared( // Add all the static files. These may already exist, but we just // overwrite them anyway to make sure that they're fresh and up-to-date. - write_minify(cx.dst.join(&format!("rustdoc{}.css", cx.shared.resource_suffix)), + write_minify(&cx.shared.fs, cx.dst.join(&format!("rustdoc{}.css", cx.shared.resource_suffix)), static_files::RUSTDOC_CSS, options.enable_minification)?; - write_minify(cx.dst.join(&format!("settings{}.css", cx.shared.resource_suffix)), + write_minify(&cx.shared.fs, cx.dst.join(&format!("settings{}.css", cx.shared.resource_suffix)), static_files::SETTINGS_CSS, options.enable_minification)?; - write_minify(cx.dst.join(&format!("noscript{}.css", cx.shared.resource_suffix)), + write_minify(&cx.shared.fs, cx.dst.join(&format!("noscript{}.css", cx.shared.resource_suffix)), static_files::NOSCRIPT_CSS, options.enable_minification)?; @@ -815,11 +836,13 @@ fn write_shared( let content = try_err!(fs::read(&entry), &entry); let theme = try_none!(try_none!(entry.file_stem(), &entry).to_str(), &entry); let extension = try_none!(try_none!(entry.extension(), &entry).to_str(), &entry); - write(cx.dst.join(format!("{}{}.{}", theme, cx.shared.resource_suffix, extension)), - content.as_slice())?; + cx.shared.fs.write( + cx.dst.join(format!("{}{}.{}", theme, cx.shared.resource_suffix, extension)), + content.as_slice())?; themes.insert(theme.to_owned()); } + let write = |p, c| { cx.shared.fs.write(p, c) }; if (*cx.shared).layout.logo.is_empty() { write(cx.dst.join(&format!("rust-logo{}.png", cx.shared.resource_suffix)), static_files::RUST_LOGO)?; @@ -834,11 +857,11 @@ fn write_shared( static_files::WHEEL_SVG)?; write(cx.dst.join(&format!("down-arrow{}.svg", cx.shared.resource_suffix)), static_files::DOWN_ARROW_SVG)?; - write_minify(cx.dst.join(&format!("light{}.css", cx.shared.resource_suffix)), + write_minify(&cx.shared.fs, cx.dst.join(&format!("light{}.css", cx.shared.resource_suffix)), static_files::themes::LIGHT, options.enable_minification)?; themes.insert("light".to_owned()); - write_minify(cx.dst.join(&format!("dark{}.css", cx.shared.resource_suffix)), + write_minify(&cx.shared.fs, cx.dst.join(&format!("dark{}.css", cx.shared.resource_suffix)), static_files::themes::DARK, options.enable_minification)?; themes.insert("dark".to_owned()); @@ -847,8 +870,7 @@ fn write_shared( themes.sort(); // To avoid theme switch latencies as much as possible, we put everything theme related // at the beginning of the html files into another js file. - write(cx.dst.join(&format!("theme{}.js", cx.shared.resource_suffix)), - format!( + let theme_js = format!( r#"var themes = document.getElementById("theme-choices"); var themePicker = document.getElementById("theme-picker"); @@ -891,39 +913,45 @@ themePicker.onblur = handleThemeButtonsBlur; themes.iter() .map(|s| format!("\"{}\"", s)) .collect::>() - .join(",")).as_bytes(), + .join(",")); + write(cx.dst.join(&format!("theme{}.js", cx.shared.resource_suffix)), + theme_js.as_bytes() )?; - write_minify(cx.dst.join(&format!("main{}.js", cx.shared.resource_suffix)), + write_minify(&cx.shared.fs, cx.dst.join(&format!("main{}.js", cx.shared.resource_suffix)), static_files::MAIN_JS, options.enable_minification)?; - write_minify(cx.dst.join(&format!("settings{}.js", cx.shared.resource_suffix)), + write_minify(&cx.shared.fs, cx.dst.join(&format!("settings{}.js", cx.shared.resource_suffix)), static_files::SETTINGS_JS, options.enable_minification)?; if cx.shared.include_sources { - write_minify(cx.dst.join(&format!("source-script{}.js", cx.shared.resource_suffix)), - static_files::sidebar::SOURCE_SCRIPT, - options.enable_minification)?; + write_minify( + &cx.shared.fs, + cx.dst.join(&format!("source-script{}.js", cx.shared.resource_suffix)), + static_files::sidebar::SOURCE_SCRIPT, + options.enable_minification)?; } { - write_minify(cx.dst.join(&format!("storage{}.js", cx.shared.resource_suffix)), - &format!("var resourcesSuffix = \"{}\";{}", - cx.shared.resource_suffix, - static_files::STORAGE_JS), - options.enable_minification)?; + write_minify( + &cx.shared.fs, + cx.dst.join(&format!("storage{}.js", cx.shared.resource_suffix)), + &format!("var resourcesSuffix = \"{}\";{}", + cx.shared.resource_suffix, + static_files::STORAGE_JS), + options.enable_minification)?; } if let Some(ref css) = cx.shared.css_file_extension { let out = cx.dst.join(&format!("theme{}.css", cx.shared.resource_suffix)); + let buffer = try_err!(fs::read_to_string(css), css); if !options.enable_minification { - try_err!(fs::copy(css, out), css); + cx.shared.fs.write(&out, &buffer)?; } else { - let buffer = try_err!(fs::read_to_string(css), css); - write_minify(out, &buffer, options.enable_minification)?; + write_minify(&cx.shared.fs, out, &buffer, options.enable_minification)?; } } - write_minify(cx.dst.join(&format!("normalize{}.css", cx.shared.resource_suffix)), + write_minify(&cx.shared.fs, cx.dst.join(&format!("normalize{}.css", cx.shared.resource_suffix)), static_files::NORMALIZE_CSS, options.enable_minification)?; write(cx.dst.join("FiraSans-Regular.woff"), @@ -999,7 +1027,6 @@ themePicker.onblur = handleThemeButtonsBlur; let dst = cx.dst.join(&format!("aliases{}.js", cx.shared.resource_suffix)); { let (mut all_aliases, _, _) = try_err!(collect(&dst, &krate.name, "ALIASES", false), &dst); - let mut w = try_err!(File::create(&dst), &dst); let mut output = String::with_capacity(100); for (alias, items) in &cache.aliases { if items.is_empty() { @@ -1014,10 +1041,12 @@ themePicker.onblur = handleThemeButtonsBlur; } all_aliases.push(format!("ALIASES[\"{}\"] = {{{}}};", krate.name, output)); all_aliases.sort(); - try_err!(writeln!(&mut w, "var ALIASES = {{}};"), &dst); + let mut v = Vec::new(); + try_err!(writeln!(&mut v, "var ALIASES = {{}};"), &dst); for aliases in &all_aliases { - try_err!(writeln!(&mut w, "{}", aliases), &dst); + try_err!(writeln!(&mut v, "{}", aliases), &dst); } + cx.shared.fs.write(&dst, &v)?; } use std::ffi::OsString; @@ -1101,11 +1130,12 @@ themePicker.onblur = handleThemeButtonsBlur; &krate.name, hierarchy.to_json_string())); all_sources.sort(); - let mut w = try_err!(File::create(&dst), &dst); - try_err!(writeln!(&mut w, + let mut v = Vec::new(); + try_err!(writeln!(&mut v, "var N = null;var sourcesIndex = {{}};\n{}\ncreateSourceSidebar();", all_sources.join("\n")), &dst); + cx.shared.fs.write(&dst, &v)?; } // Update the search index @@ -1119,14 +1149,17 @@ themePicker.onblur = handleThemeButtonsBlur; // Sort the indexes by crate so the file will be generated identically even // with rustdoc running in parallel. all_indexes.sort(); - let mut w = try_err!(File::create(&dst), &dst); - try_err!(writeln!(&mut w, "var N=null,E=\"\",T=\"t\",U=\"u\",searchIndex={{}};"), &dst); - try_err!(write_minify_replacer(&mut w, - &format!("{}\n{}", variables.join(""), all_indexes.join("\n")), - options.enable_minification), - &dst); - try_err!(write!(&mut w, "initSearch(searchIndex);addSearchOptions(searchIndex);"), &dst); - + { + let mut v = Vec::new(); + try_err!(writeln!(&mut v, "var N=null,E=\"\",T=\"t\",U=\"u\",searchIndex={{}};"), &dst); + try_err!(write_minify_replacer( + &mut v, + &format!("{}\n{}", variables.join(""), all_indexes.join("\n")), + options.enable_minification), + &dst); + try_err!(write!(&mut v, "initSearch(searchIndex);addSearchOptions(searchIndex);"), &dst); + cx.shared.fs.write(&dst, &v)?; + } if options.enable_index_page { if let Some(index_page) = options.index_page.clone() { let mut md_opts = options.clone(); @@ -1136,7 +1169,6 @@ themePicker.onblur = handleThemeButtonsBlur; crate::markdown::render(index_page, md_opts, diag, cx.edition); } else { let dst = cx.dst.join("index.html"); - let mut w = BufWriter::new(try_err!(File::create(&dst), &dst)); let page = layout::Page { title: "Index of crates", css_class: "mod", @@ -1163,12 +1195,13 @@ themePicker.onblur = handleThemeButtonsBlur; SlashChecker(s), s) }) .collect::()); - try_err!(layout::render(&mut w, &cx.shared.layout, + let mut v = Vec::new(); + try_err!(layout::render(&mut v, &cx.shared.layout, &page, &(""), &content, cx.shared.css_file_extension.is_some(), &cx.shared.themes, cx.shared.generate_search_filter), &dst); - try_err!(w.flush(), &dst); + cx.shared.fs.write(&dst, &v)?; } } @@ -1220,7 +1253,7 @@ themePicker.onblur = handleThemeButtonsBlur; for part in &remote_path[..remote_path.len() - 1] { mydst.push(part); } - try_err!(fs::create_dir_all(&mydst), &mydst); + cx.shared.ensure_dir(&mydst)?; mydst.push(&format!("{}.{}.js", remote_item_type.css_class(), remote_path[remote_path.len() - 1])); @@ -1233,19 +1266,20 @@ themePicker.onblur = handleThemeButtonsBlur; // identically even with rustdoc running in parallel. all_implementors.sort(); - let mut f = try_err!(File::create(&mydst), &mydst); - try_err!(writeln!(&mut f, "(function() {{var implementors = {{}};"), &mydst); + let mut v = Vec::new(); + try_err!(writeln!(&mut v, "(function() {{var implementors = {{}};"), &mydst); for implementor in &all_implementors { - try_err!(writeln!(&mut f, "{}", *implementor), &mydst); + try_err!(writeln!(&mut v, "{}", *implementor), &mydst); } - try_err!(writeln!(&mut f, "{}", r" + try_err!(writeln!(&mut v, "{}", r" if (window.register_implementors) { window.register_implementors(implementors); } else { window.pending_implementors = implementors; } "), &mydst); - try_err!(writeln!(&mut f, r"}})()"), &mydst); + try_err!(writeln!(&mut v, r"}})()"), &mydst); + cx.shared.fs.write(&mydst, &v)?; } Ok(()) } @@ -1254,7 +1288,7 @@ fn render_sources(dst: &Path, scx: &mut SharedContext, krate: clean::Crate) -> Result { info!("emitting source files"); let dst = dst.join("src").join(&krate.name); - try_err!(fs::create_dir_all(&dst), &dst); + scx.ensure_dir(&dst)?; let mut folder = SourceCollector { dst, scx, @@ -1262,22 +1296,17 @@ fn render_sources(dst: &Path, scx: &mut SharedContext, Ok(folder.fold_crate(krate)) } -/// Writes the entire contents of a string to a destination, not attempting to -/// catch any errors. -fn write(dst: PathBuf, contents: &[u8]) -> Result<(), Error> { - Ok(try_err!(fs::write(&dst, contents), &dst)) -} - -fn write_minify(dst: PathBuf, contents: &str, enable_minification: bool) -> Result<(), Error> { +fn write_minify(fs:&DocFS, dst: PathBuf, contents: &str, enable_minification: bool + ) -> Result<(), Error> { if enable_minification { if dst.extension() == Some(&OsStr::new("css")) { let res = try_none!(minifier::css::minify(contents).ok(), &dst); - write(dst, res.as_bytes()) + fs.write(dst, res.as_bytes()) } else { - write(dst, minifier::js::minify(contents).as_bytes()) + fs.write(dst, minifier::js::minify(contents).as_bytes()) } } else { - write(dst, contents.as_bytes()) + fs.write(dst, contents.as_bytes()) } } @@ -1439,7 +1468,7 @@ impl<'a> DocFolder for SourceCollector<'a> { impl<'a> SourceCollector<'a> { /// Renders the given filename into its corresponding HTML source file. - fn emit_source(&mut self, filename: &FileName) -> io::Result<()> { + fn emit_source(&mut self, filename: &FileName) -> Result<(), Error> { let p = match *filename { FileName::Real(ref file) => file, _ => return Ok(()), @@ -1449,7 +1478,7 @@ impl<'a> SourceCollector<'a> { return Ok(()); } - let contents = fs::read_to_string(&p)?; + let contents = try_err!(fs::read_to_string(&p), &p); // Remove the utf-8 BOM if any let contents = if contents.starts_with("\u{feff}") { @@ -1468,7 +1497,7 @@ impl<'a> SourceCollector<'a> { href.push_str(&component.to_string_lossy()); href.push('/'); }); - fs::create_dir_all(&cur)?; + self.scx.ensure_dir(&cur)?; let mut fname = p.file_name() .expect("source has no filename") .to_os_string(); @@ -1476,7 +1505,7 @@ impl<'a> SourceCollector<'a> { cur.push(&fname); href.push_str(&fname.to_string_lossy()); - let mut w = BufWriter::new(File::create(&cur)?); + let mut v = Vec::new(); let title = format!("{} -- source", cur.file_name().expect("failed to get file name") .to_string_lossy()); let desc = format!("Source to the Rust file `{}`.", filename); @@ -1491,12 +1520,12 @@ impl<'a> SourceCollector<'a> { extra_scripts: &[&format!("source-files{}", self.scx.resource_suffix)], static_extra_scripts: &[&format!("source-script{}", self.scx.resource_suffix)], }; - layout::render(&mut w, &self.scx.layout, + try_err!(layout::render(&mut v, &self.scx.layout, &page, &(""), &Source(contents), self.scx.css_file_extension.is_some(), &self.scx.themes, - self.scx.generate_search_filter)?; - w.flush()?; + self.scx.generate_search_filter), &cur); + self.scx.fs.write(&cur, &v)?; self.scx.local_sources.insert(p.clone(), href); Ok(()) } @@ -2073,7 +2102,6 @@ impl Context { } } - let mut w = BufWriter::new(try_err!(File::create(&final_file), &final_file)); let mut root_path = self.dst.to_str().expect("invalid path").to_owned(); if !root_path.ends_with('/') { root_path.push('/'); @@ -2099,12 +2127,14 @@ impl Context { } else { String::new() }; - try_err!(layout::render(&mut w, &self.shared.layout, + let mut v = Vec::new(); + try_err!(layout::render(&mut v, &self.shared.layout, &page, &sidebar, &all, self.shared.css_file_extension.is_some(), &self.shared.themes, self.shared.generate_search_filter), &final_file); + self.shared.fs.write(&final_file, &v)?; // Generating settings page. let settings = Settings::new(self.shared.static_root_path.deref().unwrap_or("./"), @@ -2113,17 +2143,18 @@ impl Context { page.description = "Settings of Rustdoc"; page.root_path = "./"; - let mut w = BufWriter::new(try_err!(File::create(&settings_file), &settings_file)); let mut themes = self.shared.themes.clone(); let sidebar = "

Settings

"; themes.push(PathBuf::from("settings.css")); let layout = self.shared.layout.clone(); - try_err!(layout::render(&mut w, &layout, + let mut v = Vec::new(); + try_err!(layout::render(&mut v, &layout, &page, &sidebar, &settings, self.shared.css_file_extension.is_some(), &themes, self.shared.generate_search_filter), &settings_file); + self.shared.fs.write(&settings_file, &v)?; Ok(()) } @@ -2223,6 +2254,7 @@ impl Context { // recurse into the items of the module as well. let name = item.name.as_ref().unwrap().to_string(); let mut item = Some(item); + let scx = self.shared.clone(); self.recurse(name, |this| { let item = item.take().unwrap(); @@ -2230,9 +2262,9 @@ impl Context { this.render_item(&mut buf, &item, false).unwrap(); // buf will be empty if the module is stripped and there is no redirect for it if !buf.is_empty() { - try_err!(this.shared.ensure_dir(&this.dst), &this.dst); + this.shared.ensure_dir(&this.dst)?; let joint_dst = this.dst.join("index.html"); - try_err!(fs::write(&joint_dst, buf), &joint_dst); + scx.fs.write(&joint_dst, buf)?; } let m = match item.inner { @@ -2245,9 +2277,10 @@ impl Context { if !this.render_redirect_pages { let items = this.build_sidebar_items(&m); let js_dst = this.dst.join("sidebar-items.js"); - let mut js_out = BufWriter::new(try_err!(File::create(&js_dst), &js_dst)); - try_err!(write!(&mut js_out, "initSidebarItems({});", + let mut v = Vec::new(); + try_err!(write!(&mut v, "initSidebarItems({});", as_json(&items)), &js_dst); + scx.fs.write(&js_dst, &v)?; } for item in m.items { @@ -2264,9 +2297,9 @@ impl Context { let name = item.name.as_ref().unwrap(); let item_type = item.type_(); let file_name = &item_path(item_type, name); - try_err!(self.shared.ensure_dir(&self.dst), &self.dst); + self.shared.ensure_dir(&self.dst)?; let joint_dst = self.dst.join(file_name); - try_err!(fs::write(&joint_dst, buf), &joint_dst); + self.shared.fs.write(&joint_dst, buf)?; if !self.render_redirect_pages { all.append(full_path(self, &item), &item_type); @@ -2276,21 +2309,18 @@ impl Context { // URL for the page. let redir_name = format!("{}.{}.html", name, item_type.name_space()); let redir_dst = self.dst.join(redir_name); - if let Ok(redirect_out) = OpenOptions::new().create_new(true) - .write(true) - .open(&redir_dst) { - let mut redirect_out = BufWriter::new(redirect_out); - try_err!(layout::redirect(&mut redirect_out, file_name), &redir_dst); - } + let mut v = Vec::new(); + try_err!(layout::redirect(&mut v, file_name), &redir_dst); + self.shared.fs.write(&redir_dst, &v)?; } // If the item is a macro, redirect from the old macro URL (with !) // to the new one (without). if item_type == ItemType::Macro { let redir_name = format!("{}.{}!.html", item_type, name); let redir_dst = self.dst.join(redir_name); - let redirect_out = try_err!(File::create(&redir_dst), &redir_dst); - let mut redirect_out = BufWriter::new(redirect_out); - try_err!(layout::redirect(&mut redirect_out, file_name), &redir_dst); + let mut v = Vec::new(); + try_err!(layout::redirect(&mut v, file_name), &redir_dst); + self.shared.fs.write(&redir_dst, &v)?; } } } diff --git a/src/librustdoc/lib.rs b/src/librustdoc/lib.rs index 3b4d65352a34c..7a8b088020c53 100644 --- a/src/librustdoc/lib.rs +++ b/src/librustdoc/lib.rs @@ -59,6 +59,7 @@ mod externalfiles; mod clean; mod config; mod core; +mod docfs; mod doctree; mod fold; pub mod html { diff --git a/src/librustdoc/passes/collect_intra_doc_links.rs b/src/librustdoc/passes/collect_intra_doc_links.rs index 68b96a408294b..e6f09927796fa 100644 --- a/src/librustdoc/passes/collect_intra_doc_links.rs +++ b/src/librustdoc/passes/collect_intra_doc_links.rs @@ -246,7 +246,7 @@ impl<'a, 'tcx> DocFolder for LinkCollector<'a, 'tcx> { match parent_node.or(self.mod_ids.last().cloned()) { Some(parent) if parent != hir::CRATE_HIR_ID => { // FIXME: can we pull the parent module's name from elsewhere? - Some(self.cx.tcx.hir().name_by_hir_id(parent).to_string()) + Some(self.cx.tcx.hir().name(parent).to_string()) } _ => None, } diff --git a/src/librustdoc/theme.rs b/src/librustdoc/theme.rs index 7a0ccf6975f8c..7220a05df47e6 100644 --- a/src/librustdoc/theme.rs +++ b/src/librustdoc/theme.rs @@ -103,16 +103,16 @@ fn is_line_comment(pos: usize, v: &[u8], events: &[Events]) -> bool { if let Some(&Events::StartComment(_)) = events.last() { return false; } - pos + 1 < v.len() && v[pos + 1] == b'/' + v[pos + 1] == b'/' } fn load_css_events(v: &[u8]) -> Vec { let mut pos = 0; let mut events = Vec::with_capacity(100); - while pos < v.len() - 1 { + while pos + 1 < v.len() { match v[pos] { - b'/' if pos + 1 < v.len() && v[pos + 1] == b'*' => { + b'/' if v[pos + 1] == b'*' => { events.push(Events::StartComment(pos)); pos += 1; } @@ -123,7 +123,7 @@ fn load_css_events(v: &[u8]) -> Vec { b'\n' if previous_is_line_comment(&events) => { events.push(Events::EndComment(pos)); } - b'*' if pos + 1 < v.len() && v[pos + 1] == b'/' => { + b'*' if v[pos + 1] == b'/' => { events.push(Events::EndComment(pos + 2)); pos += 1; } @@ -264,9 +264,11 @@ pub fn get_differences(against: &CssPath, other: &CssPath, v: &mut Vec) } } -pub fn test_theme_against>(f: &P, against: &CssPath, diag: &Handler) - -> (bool, Vec) -{ +pub fn test_theme_against>( + f: &P, + against: &CssPath, + diag: &Handler, +) -> (bool, Vec) { let data = try_something!(fs::read(f), diag, (false, vec![])); let paths = load_css_paths(&data); let mut ret = vec![]; @@ -366,4 +368,16 @@ a { get_differences(&other, &against, &mut ret); assert_eq!(ret, vec![" Missing \"c\" rule".to_owned()]); } + + #[test] + fn check_empty_css() { + let events = load_css_events(&[]); + assert_eq!(events.len(), 0); + } + + #[test] + fn check_invalid_css() { + let events = load_css_events(b"*"); + assert_eq!(events.len(), 0); + } } diff --git a/src/librustdoc/visit_ast.rs b/src/librustdoc/visit_ast.rs index c94149d31020a..781e62c3b274c 100644 --- a/src/librustdoc/visit_ast.rs +++ b/src/librustdoc/visit_ast.rs @@ -337,7 +337,7 @@ impl<'a, 'tcx> RustdocVisitor<'a, 'tcx> { if !self.view_item_stack.insert(res_hir_id) { return false } - let ret = match tcx.hir().get_by_hir_id(res_hir_id) { + let ret = match tcx.hir().get(res_hir_id) { Node::Item(&hir::Item { node: hir::ItemKind::Mod(ref m), .. }) if glob => { let prev = mem::replace(&mut self.inlining, true); for i in &m.item_ids { diff --git a/src/test/run-pass-fulldeps/auxiliary/issue-40001-plugin.rs b/src/test/run-pass-fulldeps/auxiliary/issue-40001-plugin.rs index 76554eaba9c92..64b795af9267f 100644 --- a/src/test/run-pass-fulldeps/auxiliary/issue-40001-plugin.rs +++ b/src/test/run-pass-fulldeps/auxiliary/issue-40001-plugin.rs @@ -43,7 +43,7 @@ impl<'a, 'tcx> LateLintPass<'a, 'tcx> for MissingWhitelistedAttrPass { span: source_map::Span, id: hir::HirId) { - let item = match cx.tcx.hir().get_by_hir_id(id) { + let item = match cx.tcx.hir().get(id) { Node::Item(item) => item, _ => cx.tcx.hir().expect_item(cx.tcx.hir().get_parent_item(id)), }; diff --git a/src/test/ui/issues/issue-27697.rs b/src/test/ui/issues/issue-27697.rs new file mode 100644 index 0000000000000..83070012f5f04 --- /dev/null +++ b/src/test/ui/issues/issue-27697.rs @@ -0,0 +1,21 @@ +// run-pass + +use std::ops::Deref; + +trait MyTrait { + fn do_something(&self); + fn as_str(&self) -> &str; +} + +impl Deref for dyn MyTrait { + type Target = str; + fn deref(&self) -> &Self::Target { + self.as_str() + } +} + +fn trait_object_does_something(t: &dyn MyTrait) { + t.do_something() +} + +fn main() {}