diff --git a/clippy_lints/src/assign_ops.rs b/clippy_lints/src/assign_ops.rs index 7e6b8cf98c2..71ebb996fc5 100644 --- a/clippy_lints/src/assign_ops.rs +++ b/clippy_lints/src/assign_ops.rs @@ -143,12 +143,12 @@ macro_rules! ops { return; // useless if the trait doesn't exist }; // check that we are not inside an `impl AssignOp` of this exact operation - let parent_fn = cx.tcx.map.get_parent(e.id); - let parent_impl = cx.tcx.map.get_parent(parent_fn); + let parent_fn = cx.tcx.hir.get_parent(e.id); + let parent_impl = cx.tcx.hir.get_parent(parent_fn); // the crate node is the only one that is not in the map if_let_chain!{[ parent_impl != ast::CRATE_NODE_ID, - let hir::map::Node::NodeItem(item) = cx.tcx.map.get(parent_impl), + let hir::map::Node::NodeItem(item) = cx.tcx.hir.get(parent_impl), let hir::Item_::ItemImpl(_, _, _, Some(ref trait_ref), _, _) = item.node, trait_ref.path.def.def_id() == trait_id ], { return; }} diff --git a/clippy_lints/src/attrs.rs b/clippy_lints/src/attrs.rs index e908aa02c40..30115c60572 100644 --- a/clippy_lints/src/attrs.rs +++ b/clippy_lints/src/attrs.rs @@ -158,7 +158,7 @@ fn check_trait_item(&mut self, cx: &LateContext<'a, 'tcx>, item: &'tcx TraitItem fn is_relevant_item(tcx: ty::TyCtxt, item: &Item) -> bool { if let ItemFn(_, _, _, _, _, eid) = item.node { - is_relevant_expr(tcx, tcx.body_tables(eid), &tcx.map.body(eid).value) + is_relevant_expr(tcx, tcx.body_tables(eid), &tcx.hir.body(eid).value) } else { false } @@ -166,7 +166,7 @@ fn is_relevant_item(tcx: ty::TyCtxt, item: &Item) -> bool { fn is_relevant_impl(tcx: ty::TyCtxt, item: &ImplItem) -> bool { match item.node { - ImplItemKind::Method(_, eid) => is_relevant_expr(tcx, tcx.body_tables(eid), &tcx.map.body(eid).value), + ImplItemKind::Method(_, eid) => is_relevant_expr(tcx, tcx.body_tables(eid), &tcx.hir.body(eid).value), _ => false, } } @@ -175,13 +175,13 @@ fn is_relevant_trait(tcx: ty::TyCtxt, item: &TraitItem) -> bool { match item.node { TraitItemKind::Method(_, TraitMethod::Required(_)) => true, TraitItemKind::Method(_, TraitMethod::Provided(eid)) => { - is_relevant_expr(tcx, tcx.body_tables(eid), &tcx.map.body(eid).value) + is_relevant_expr(tcx, tcx.body_tables(eid), &tcx.hir.body(eid).value) }, _ => false, } } -fn is_relevant_block(tcx: ty::TyCtxt, tables: &ty::Tables, block: &Block) -> bool { +fn is_relevant_block(tcx: ty::TyCtxt, tables: &ty::TypeckTables, block: &Block) -> bool { for stmt in &block.stmts { match stmt.node { StmtDecl(_, _) => return true, @@ -194,7 +194,7 @@ fn is_relevant_block(tcx: ty::TyCtxt, tables: &ty::Tables, block: &Block) -> boo block.expr.as_ref().map_or(false, |e| is_relevant_expr(tcx, tables, e)) } -fn is_relevant_expr(tcx: ty::TyCtxt, tables: &ty::Tables, expr: &Expr) -> bool { +fn is_relevant_expr(tcx: ty::TyCtxt, tables: &ty::TypeckTables, expr: &Expr) -> bool { match expr.node { ExprBlock(ref block) => is_relevant_block(tcx, tables, block), ExprRet(Some(ref e)) => is_relevant_expr(tcx, tables, e), diff --git a/clippy_lints/src/block_in_if_condition.rs b/clippy_lints/src/block_in_if_condition.rs index 6a02e69a881..5fd8020e1a8 100644 --- a/clippy_lints/src/block_in_if_condition.rs +++ b/clippy_lints/src/block_in_if_condition.rs @@ -57,7 +57,7 @@ struct ExVisitor<'a, 'tcx: 'a> { impl<'a, 'tcx: 'a> Visitor<'tcx> for ExVisitor<'a, 'tcx> { fn visit_expr(&mut self, expr: &'tcx Expr) { if let ExprClosure(_, _, eid, _) = expr.node { - let body = self.cx.tcx.map.body(eid); + let body = self.cx.tcx.hir.body(eid); let ex = &body.value; if matches!(ex.node, ExprBlock(_)) { self.found_block = Some(ex); @@ -67,7 +67,7 @@ fn visit_expr(&mut self, expr: &'tcx Expr) { walk_expr(self, expr); } fn nested_visit_map<'this>(&'this mut self) -> NestedVisitorMap<'this, 'tcx> { - NestedVisitorMap::All(&self.cx.tcx.map) + NestedVisitorMap::All(&self.cx.tcx.hir) } } diff --git a/clippy_lints/src/consts.rs b/clippy_lints/src/consts.rs index 7ea6c7e4b21..f6c9619dcf0 100644 --- a/clippy_lints/src/consts.rs +++ b/clippy_lints/src/consts.rs @@ -263,7 +263,7 @@ fn expr(&mut self, e: &Expr) -> Option { ExprRepeat(ref value, number_id) => { if let Some(lcx) = self.lcx { self.binop_apply(value, - &lcx.tcx.map.body(number_id).value, + &lcx.tcx.hir.body(number_id).value, |v, n| Some(Constant::Repeat(Box::new(v), n.as_u64() as usize))) } else { None diff --git a/clippy_lints/src/cyclomatic_complexity.rs b/clippy_lints/src/cyclomatic_complexity.rs index 0a452f8ae13..9d6056de343 100644 --- a/clippy_lints/src/cyclomatic_complexity.rs +++ b/clippy_lints/src/cyclomatic_complexity.rs @@ -99,7 +99,7 @@ fn check_fn( span: Span, node_id: NodeId ) { - let def_id = cx.tcx.map.local_def_id(node_id); + let def_id = cx.tcx.hir.local_def_id(node_id); if !cx.tcx.has_attr(def_id, "test") { self.check(cx, &body.value, span); } diff --git a/clippy_lints/src/derive.rs b/clippy_lints/src/derive.rs index cf5b0208426..b2a8d26000d 100644 --- a/clippy_lints/src/derive.rs +++ b/clippy_lints/src/derive.rs @@ -73,7 +73,7 @@ fn get_lints(&self) -> LintArray { impl<'a, 'tcx> LateLintPass<'a, 'tcx> for Derive { fn check_item(&mut self, cx: &LateContext<'a, 'tcx>, item: &'tcx Item) { if let ItemImpl(_, _, _, Some(ref trait_ref), _, _) = item.node { - let ty = cx.tcx.item_type(cx.tcx.map.local_def_id(item.id)); + let ty = cx.tcx.item_type(cx.tcx.hir.local_def_id(item.id)); let is_automatically_derived = is_automatically_derived(&*item.attrs); check_hash_peq(cx, item.span, trait_ref, ty, is_automatically_derived); @@ -122,9 +122,9 @@ fn check_hash_peq<'a, 'tcx>( cx, DERIVE_HASH_XOR_EQ, span, mess, |db| { - if let Some(node_id) = cx.tcx.map.as_local_node_id(impl_id) { + if let Some(node_id) = cx.tcx.hir.as_local_node_id(impl_id) { db.span_note( - cx.tcx.map.span(node_id), + cx.tcx.hir.span(node_id), "`PartialEq` implemented here" ); } diff --git a/clippy_lints/src/entry.rs b/clippy_lints/src/entry.rs index 50bd62a855a..8c8165592b5 100644 --- a/clippy_lints/src/entry.rs +++ b/clippy_lints/src/entry.rs @@ -148,6 +148,6 @@ fn visit_expr(&mut self, expr: &'tcx Expr) { } } fn nested_visit_map<'this>(&'this mut self) -> NestedVisitorMap<'this, 'tcx> { - NestedVisitorMap::All(&self.cx.tcx.map) + NestedVisitorMap::All(&self.cx.tcx.hir) } } diff --git a/clippy_lints/src/enum_clike.rs b/clippy_lints/src/enum_clike.rs index a73f68fcb58..e924ae79df9 100644 --- a/clippy_lints/src/enum_clike.rs +++ b/clippy_lints/src/enum_clike.rs @@ -45,7 +45,7 @@ fn check_item(&mut self, cx: &LateContext<'a, 'tcx>, item: &'tcx Item) { if let Some(body_id) = variant.disr_expr { use rustc_const_eval::*; let constcx = ConstContext::new(cx.tcx, body_id); - let bad = match constcx.eval(&cx.tcx.map.body(body_id).value, EvalHint::ExprTypeChecked) { + let bad = match constcx.eval(&cx.tcx.hir.body(body_id).value, EvalHint::ExprTypeChecked) { Ok(ConstVal::Integral(Usize(Us64(i)))) => i as u32 as u64 != i, Ok(ConstVal::Integral(Isize(Is64(i)))) => i as i32 as i64 != i, _ => false, diff --git a/clippy_lints/src/escape.rs b/clippy_lints/src/escape.rs index 2e9f6af5bd8..0db45efeb38 100644 --- a/clippy_lints/src/escape.rs +++ b/clippy_lints/src/escape.rs @@ -40,16 +40,13 @@ pub struct Pass { } fn is_non_trait_box(ty: ty::Ty) -> bool { - match ty.sty { - ty::TyBox(inner) => !inner.is_trait(), - _ => false, - } + ty.is_box() && !ty.boxed_ty().is_trait() } struct EscapeDelegate<'a, 'tcx: 'a> { set: NodeSet, tcx: ty::TyCtxt<'a, 'tcx, 'tcx>, - tables: &'a ty::Tables<'tcx>, + tables: &'a ty::TypeckTables<'tcx>, target: TargetDataLayout, too_large_for_stack: u64, } @@ -89,7 +86,7 @@ fn check_fn( for node in v.set { span_lint(cx, BOXED_LOCAL, - cx.tcx.map.span(node), + cx.tcx.hir.span(node), "local variable doesn't need to be boxed here"); } } @@ -108,7 +105,7 @@ fn consume(&mut self, _: NodeId, _: Span, cmt: cmt<'tcx>, mode: ConsumeMode) { } fn matched_pat(&mut self, _: &Pat, _: cmt<'tcx>, _: MatchMode) {} fn consume_pat(&mut self, consume_pat: &Pat, cmt: cmt<'tcx>, _: ConsumeMode) { - let map = &self.tcx.map; + let map = &self.tcx.hir; if map.is_argument(consume_pat.id) { // Skip closure arguments if let Some(NodeExpr(..)) = map.find(map.get_parent_node(consume_pat.id)) { @@ -180,7 +177,7 @@ fn borrow( self.tables .adjustments .get(&self.tcx - .map + .hir .get_parent_node(borrow_id)) .map(|a| &a.kind) { if autoderefs <= 1 { @@ -204,16 +201,16 @@ impl<'a, 'tcx: 'a> EscapeDelegate<'a, 'tcx> { fn is_large_box(&self, ty: ty::Ty<'tcx>) -> bool { // Large types need to be boxed to avoid stack // overflows. - match ty.sty { - ty::TyBox(inner) => { - self.tcx.infer_ctxt((), Reveal::All).enter(|infcx| if let Ok(layout) = inner.layout(&infcx) { - let size = layout.size(&self.target); - size.bytes() > self.too_large_for_stack - } else { - false - }) - }, - _ => false, + if ty.is_box() { + let inner = ty.boxed_ty(); + self.tcx.infer_ctxt((), Reveal::All).enter(|infcx| if let Ok(layout) = inner.layout(&infcx) { + let size = layout.size(&self.target); + size.bytes() > self.too_large_for_stack + } else { + false + }) + } else { + false } } } diff --git a/clippy_lints/src/eta_reduction.rs b/clippy_lints/src/eta_reduction.rs index 769ff99d550..40678e324b0 100644 --- a/clippy_lints/src/eta_reduction.rs +++ b/clippy_lints/src/eta_reduction.rs @@ -49,7 +49,7 @@ fn check_expr(&mut self, cx: &LateContext<'a, 'tcx>, expr: &'tcx Expr) { fn check_closure(cx: &LateContext, expr: &Expr) { if let ExprClosure(_, ref decl, eid, _) = expr.node { - let body = cx.tcx.map.body(eid); + let body = cx.tcx.hir.body(eid); let ex = &body.value; if let ExprCall(ref caller, ref args) = ex.node { if args.len() != decl.inputs.len() { diff --git a/clippy_lints/src/eval_order_dependence.rs b/clippy_lints/src/eval_order_dependence.rs index c54b77a037c..798bd6cf1f7 100644 --- a/clippy_lints/src/eval_order_dependence.rs +++ b/clippy_lints/src/eval_order_dependence.rs @@ -156,7 +156,7 @@ fn visit_block(&mut self, _: &'tcx Block) { // don't continue over blocks, LateLintPass already does that } fn nested_visit_map<'this>(&'this mut self) -> NestedVisitorMap<'this, 'tcx> { - NestedVisitorMap::All(&self.cx.tcx.map) + NestedVisitorMap::All(&self.cx.tcx.hir) } } @@ -176,7 +176,7 @@ fn nested_visit_map<'this>(&'this mut self) -> NestedVisitorMap<'this, 'tcx> { /// /// When such a read is found, the lint is triggered. fn check_for_unsequenced_reads(vis: &mut ReadVisitor) { - let map = &vis.cx.tcx.map; + let map = &vis.cx.tcx.hir; let mut cur_id = vis.write_expr.id; loop { let parent_id = map.get_parent_node(cur_id); @@ -342,7 +342,7 @@ fn visit_expr(&mut self, expr: &'tcx Expr) { walk_expr(self, expr); } fn nested_visit_map<'this>(&'this mut self) -> NestedVisitorMap<'this, 'tcx> { - NestedVisitorMap::All(&self.cx.tcx.map) + NestedVisitorMap::All(&self.cx.tcx.hir) } } diff --git a/clippy_lints/src/format.rs b/clippy_lints/src/format.rs index 6281d34dd93..69ef78a3056 100644 --- a/clippy_lints/src/format.rs +++ b/clippy_lints/src/format.rs @@ -78,10 +78,10 @@ pub fn get_argument_fmtstr_parts<'a, 'b>(cx: &LateContext<'a, 'b>, expr: &'a Exp block.stmts.len() == 1, let StmtDecl(ref decl, _) = block.stmts[0].node, let DeclItem(ref decl) = decl.node, - let Some(NodeItem(decl)) = cx.tcx.map.find(decl.id), + let Some(NodeItem(decl)) = cx.tcx.hir.find(decl.id), &*decl.name.as_str() == "__STATIC_FMTSTR", let ItemStatic(_, _, ref expr) = decl.node, - let ExprAddrOf(_, ref expr) = cx.tcx.map.body(*expr).value.node, // &["…", "…", …] + let ExprAddrOf(_, ref expr) = cx.tcx.hir.body(*expr).value.node, // &["…", "…", …] let ExprArray(ref exprs) = expr.node, ], { let mut result = Vec::new(); diff --git a/clippy_lints/src/functions.rs b/clippy_lints/src/functions.rs index 86548854272..6d630c7cc88 100644 --- a/clippy_lints/src/functions.rs +++ b/clippy_lints/src/functions.rs @@ -80,7 +80,7 @@ fn check_fn( ) { use rustc::hir::map::Node::*; - let is_impl = if let Some(NodeItem(item)) = cx.tcx.map.find(cx.tcx.map.get_parent_node(nodeid)) { + let is_impl = if let Some(NodeItem(item)) = cx.tcx.hir.find(cx.tcx.hir.get_parent_node(nodeid)) { matches!(item.node, hir::ItemImpl(_, _, _, Some(_), _, _) | hir::ItemDefaultImpl(..)) } else { false @@ -113,7 +113,7 @@ fn check_trait_item(&mut self, cx: &LateContext<'a, 'tcx>, item: &'tcx hir::Trai } if let hir::TraitMethod::Provided(eid) = *eid { - let body = cx.tcx.map.body(eid); + let body = cx.tcx.hir.body(eid); self.check_raw_ptr(cx, sig.unsafety, &sig.decl, body, item.id); } } @@ -200,7 +200,7 @@ fn visit_expr(&mut self, expr: &'tcx hir::Expr) { hir::intravisit::walk_expr(self, expr); } fn nested_visit_map<'this>(&'this mut self) -> intravisit::NestedVisitorMap<'this, 'tcx> { - intravisit::NestedVisitorMap::All(&self.cx.tcx.map) + intravisit::NestedVisitorMap::All(&self.cx.tcx.hir) } } diff --git a/clippy_lints/src/large_enum_variant.rs b/clippy_lints/src/large_enum_variant.rs index ca812067878..36c5e7a288a 100644 --- a/clippy_lints/src/large_enum_variant.rs +++ b/clippy_lints/src/large_enum_variant.rs @@ -46,7 +46,7 @@ fn get_lints(&self) -> LintArray { impl<'a, 'tcx> LateLintPass<'a, 'tcx> for LargeEnumVariant { fn check_item(&mut self, cx: &LateContext, item: &Item) { - let did = cx.tcx.map.local_def_id(item.id); + let did = cx.tcx.hir.local_def_id(item.id); if let ItemEnum(ref def, _) = item.node { let ty = cx.tcx.item_type(did); let adt = ty.ty_adt_def().expect("already checked whether this is an enum"); diff --git a/clippy_lints/src/len_zero.rs b/clippy_lints/src/len_zero.rs index 6f4d69cbd5a..8a2f37e5aa1 100644 --- a/clippy_lints/src/len_zero.rs +++ b/clippy_lints/src/len_zero.rs @@ -93,7 +93,7 @@ fn is_named_self(cx: &LateContext, item: &TraitItemRef, name: &str) -> bool { if let AssociatedItemKind::Method { has_self } = item.kind { has_self && { - let did = cx.tcx.map.local_def_id(item.id.node_id); + let did = cx.tcx.hir.local_def_id(item.id.node_id); let impl_ty = cx.tcx.item_type(did); impl_ty.fn_args().skip_binder().len() == 1 } @@ -120,7 +120,7 @@ fn is_named_self(cx: &LateContext, item: &ImplItemRef, name: &str) -> bool { if let AssociatedItemKind::Method { has_self } = item.kind { has_self && { - let did = cx.tcx.map.local_def_id(item.id.node_id); + let did = cx.tcx.hir.local_def_id(item.id.node_id); let impl_ty = cx.tcx.item_type(did); impl_ty.fn_args().skip_binder().len() == 1 } @@ -141,7 +141,7 @@ fn is_named_self(cx: &LateContext, item: &ImplItemRef, name: &str) -> bool { if let Some(i) = impl_items.iter().find(|i| is_named_self(cx, i, "len")) { if cx.access_levels.is_exported(i.id.node_id) { - let def_id = cx.tcx.map.local_def_id(item.id); + let def_id = cx.tcx.hir.local_def_id(item.id); let ty = cx.tcx.item_type(def_id); span_lint(cx, diff --git a/clippy_lints/src/let_if_seq.rs b/clippy_lints/src/let_if_seq.rs index 618869021ee..cfc8d4bbd68 100644 --- a/clippy_lints/src/let_if_seq.rs +++ b/clippy_lints/src/let_if_seq.rs @@ -145,7 +145,7 @@ fn visit_expr(&mut self, expr: &'tcx hir::Expr) { hir::intravisit::walk_expr(self, expr); } fn nested_visit_map<'this>(&'this mut self) -> hir::intravisit::NestedVisitorMap<'this, 'tcx> { - hir::intravisit::NestedVisitorMap::All(&self.cx.tcx.map) + hir::intravisit::NestedVisitorMap::All(&self.cx.tcx.hir) } } diff --git a/clippy_lints/src/lib.rs b/clippy_lints/src/lib.rs index fb524df1a8f..bbdd62a3013 100644 --- a/clippy_lints/src/lib.rs +++ b/clippy_lints/src/lib.rs @@ -8,7 +8,6 @@ #![feature(rustc_private)] #![feature(slice_patterns)] #![feature(stmt_expr_attributes)] -#![feature(repeat_str)] #![feature(conservative_impl_trait)] #![feature(collections_bound)] diff --git a/clippy_lints/src/lifetimes.rs b/clippy_lints/src/lifetimes.rs index 720cf29247c..2051c883670 100644 --- a/clippy_lints/src/lifetimes.rs +++ b/clippy_lints/src/lifetimes.rs @@ -230,6 +230,8 @@ fn record(&mut self, lifetime: &Option) { if let Some(ref lt) = *lifetime { if &*lt.name.as_str() == "'static" { self.lts.push(RefLt::Static); + } else if lt.is_elided() { + self.lts.push(RefLt::Unnamed); } else { self.lts.push(RefLt::Named(lt.name)); } @@ -275,7 +277,7 @@ fn visit_lifetime(&mut self, lifetime: &'tcx Lifetime) { fn visit_ty(&mut self, ty: &'tcx Ty) { match ty.node { - TyRptr(None, _) => { + TyRptr(ref lt, _) if lt.is_elided() => { self.record(&None); }, TyPath(ref path) => { @@ -288,6 +290,15 @@ fn visit_ty(&mut self, ty: &'tcx Ty) { } } }, + TyTraitObject(ref bounds, ref lt) => { + if !lt.is_elided() { + self.record(&Some(*lt)); + } + for bound in bounds { + self.visit_poly_trait_ref(bound, TraitBoundModifier::None); + } + return; + }, _ => (), } walk_ty(self, ty); diff --git a/clippy_lints/src/loops.rs b/clippy_lints/src/loops.rs index f3dd2d4b8e3..c863b11e0b8 100644 --- a/clippy_lints/src/loops.rs +++ b/clippy_lints/src/loops.rs @@ -677,7 +677,7 @@ fn check_for_loop_explicit_counter<'a, 'tcx>( // For each candidate, check the parent block to see if // it's initialized to zero at the start of the loop. - let map = &cx.tcx.map; + let map = &cx.tcx.hir; let parent_scope = map.get_enclosing_scope(expr.id).and_then(|id| map.get_enclosing_scope(id)); if let Some(parent_id) = parent_scope { if let NodeBlock(block) = map.get(parent_id) { @@ -794,7 +794,7 @@ fn visit_expr(&mut self, expr: &'tcx Expr) { walk_expr(self, expr); } fn nested_visit_map<'this>(&'this mut self) -> NestedVisitorMap<'this, 'tcx> { - NestedVisitorMap::All(&self.cx.tcx.map) + NestedVisitorMap::All(&self.cx.tcx.hir) } } @@ -822,7 +822,7 @@ fn visit_expr(&mut self, expr: &'tcx Expr) { match def { Def::Local(..) | Def::Upvar(..) => { let def_id = def.def_id(); - let node_id = self.cx.tcx.map.as_local_node_id(def_id).unwrap(); + let node_id = self.cx.tcx.hir.as_local_node_id(def_id).unwrap(); let extent = self.cx.tcx.region_maps.var_scope(node_id); self.indexed.insert(seqvar.segments[0].name, Some(extent)); @@ -844,7 +844,7 @@ fn visit_expr(&mut self, expr: &'tcx Expr) { walk_expr(self, expr); } fn nested_visit_map<'this>(&'this mut self) -> NestedVisitorMap<'this, 'tcx> { - NestedVisitorMap::All(&self.cx.tcx.map) + NestedVisitorMap::All(&self.cx.tcx.hir) } } @@ -886,7 +886,7 @@ fn visit_expr(&mut self, expr: &'tcx Expr) { walk_expr(self, expr); } fn nested_visit_map<'this>(&'this mut self) -> NestedVisitorMap<'this, 'tcx> { - NestedVisitorMap::All(&self.cx.tcx.map) + NestedVisitorMap::All(&self.cx.tcx.hir) } } @@ -1029,7 +1029,7 @@ fn visit_expr(&mut self, expr: &'tcx Expr) { walk_expr(self, expr); } fn nested_visit_map<'this>(&'this mut self) -> NestedVisitorMap<'this, 'tcx> { - NestedVisitorMap::All(&self.cx.tcx.map) + NestedVisitorMap::All(&self.cx.tcx.hir) } } @@ -1116,7 +1116,7 @@ fn visit_expr(&mut self, expr: &'tcx Expr) { walk_expr(self, expr); } fn nested_visit_map<'this>(&'this mut self) -> NestedVisitorMap<'this, 'tcx> { - NestedVisitorMap::All(&self.cx.tcx.map) + NestedVisitorMap::All(&self.cx.tcx.hir) } } @@ -1124,7 +1124,7 @@ fn var_def_id(cx: &LateContext, expr: &Expr) -> Option { if let ExprPath(ref qpath) = expr.node { let path_res = cx.tables.qpath_def(qpath, expr.id); if let Def::Local(def_id) = path_res { - let node_id = cx.tcx.map.as_local_node_id(def_id).expect("That DefId should be valid"); + let node_id = cx.tcx.hir.as_local_node_id(def_id).expect("That DefId should be valid"); return Some(node_id); } } diff --git a/clippy_lints/src/map_clone.rs b/clippy_lints/src/map_clone.rs index 9dff7e8c8ff..087ae8c31b9 100644 --- a/clippy_lints/src/map_clone.rs +++ b/clippy_lints/src/map_clone.rs @@ -31,7 +31,7 @@ fn check_expr(&mut self, cx: &LateContext<'a, 'tcx>, expr: &'tcx Expr) { if &*name.node.as_str() == "map" && args.len() == 2 { match args[1].node { ExprClosure(_, ref decl, closure_eid, _) => { - let body = cx.tcx.map.body(closure_eid); + let body = cx.tcx.hir.body(closure_eid); let closure_expr = remove_blocks(&body.value); if_let_chain! {[ // nothing special in the argument, besides reference bindings diff --git a/clippy_lints/src/methods.rs b/clippy_lints/src/methods.rs index 8c77a21e88c..c3198d1dd78 100644 --- a/clippy_lints/src/methods.rs +++ b/clippy_lints/src/methods.rs @@ -614,12 +614,12 @@ fn check_impl_item(&mut self, cx: &LateContext<'a, 'tcx>, implitem: &'tcx hir::I return; } let name = implitem.name; - let parent = cx.tcx.map.get_parent(implitem.id); - let item = cx.tcx.map.expect_item(parent); + let parent = cx.tcx.hir.get_parent(implitem.id); + let item = cx.tcx.hir.expect_item(parent); if_let_chain! {[ let hir::ImplItemKind::Method(ref sig, id) = implitem.node, let Some(first_arg_ty) = sig.decl.inputs.get(0), - let Some(first_arg) = iter_input_pats(&sig.decl, cx.tcx.map.body(id)).next(), + let Some(first_arg) = iter_input_pats(&sig.decl, cx.tcx.hir.body(id)).next(), let hir::ItemImpl(_, _, _, None, ref self_ty, _) = item.node, ], { // check missing trait implementations @@ -635,7 +635,7 @@ fn check_impl_item(&mut self, cx: &LateContext<'a, 'tcx>, implitem: &'tcx hir::I } // check conventions w.r.t. conversion method names and predicates - let ty = cx.tcx.item_type(cx.tcx.map.local_def_id(item.id)); + let ty = cx.tcx.item_type(cx.tcx.hir.local_def_id(item.id)); let is_copy = is_copy(cx, ty, item.id); for &(ref conv, self_kinds) in &CONVENTIONS { if_let_chain! {[ @@ -798,7 +798,7 @@ fn check_general_case( /// Checks for the `CLONE_ON_COPY` lint. fn lint_clone_on_copy(cx: &LateContext, expr: &hir::Expr, arg: &hir::Expr, arg_ty: ty::Ty) { let ty = cx.tables.expr_ty(expr); - let parent = cx.tcx.map.get_parent(expr.id); + let parent = cx.tcx.hir.get_parent(expr.id); let parameter_environment = ty::ParameterEnvironment::for_item(cx.tcx, parent); if let ty::TyRef(_, ty::TypeAndMut { ty: inner, .. }) = arg_ty.sty { if let ty::TyRef(..) = inner.sty { @@ -951,8 +951,7 @@ fn may_slice(cx: &LateContext, ty: ty::Ty) -> bool { ty::TySlice(_) => true, ty::TyAdt(..) => match_type(cx, ty, &paths::VEC), ty::TyArray(_, size) => size < 32, - ty::TyRef(_, ty::TypeAndMut { ty: inner, .. }) | - ty::TyBox(inner) => may_slice(cx, inner), + ty::TyRef(_, ty::TypeAndMut { ty: inner, .. }) => may_slice(cx, inner), _ => false, } } @@ -966,8 +965,7 @@ fn may_slice(cx: &LateContext, ty: ty::Ty) -> bool { } else { match ty.sty { ty::TySlice(_) => sugg::Sugg::hir_opt(cx, expr), - ty::TyRef(_, ty::TypeAndMut { ty: inner, .. }) | - ty::TyBox(inner) => { + ty::TyRef(_, ty::TypeAndMut { ty: inner, .. }) => { if may_slice(cx, inner) { sugg::Sugg::hir_opt(cx, expr) } else { diff --git a/clippy_lints/src/misc.rs b/clippy_lints/src/misc.rs index 777ded8c2da..d397d425111 100644 --- a/clippy_lints/src/misc.rs +++ b/clippy_lints/src/misc.rs @@ -477,7 +477,7 @@ fn non_macro_local(cx: &LateContext, def: &def::Def) -> bool { match *def { def::Def::Local(id) | def::Def::Upvar(id, _, _) => { - if let Some(span) = cx.tcx.map.span_if_local(id) { + if let Some(span) = cx.tcx.hir.span_if_local(id) { !in_macro(cx, span) } else { true diff --git a/clippy_lints/src/missing_doc.rs b/clippy_lints/src/missing_doc.rs index d5be44e8c2b..348e66a679e 100644 --- a/clippy_lints/src/missing_doc.rs +++ b/clippy_lints/src/missing_doc.rs @@ -146,7 +146,7 @@ fn check_trait_item(&mut self, cx: &LateContext<'a, 'tcx>, trait_item: &'tcx hir fn check_impl_item(&mut self, cx: &LateContext<'a, 'tcx>, impl_item: &'tcx hir::ImplItem) { // If the method is an impl for a trait, don't doc. - let def_id = cx.tcx.map.local_def_id(impl_item.id); + let def_id = cx.tcx.hir.local_def_id(impl_item.id); match cx.tcx.associated_item(def_id).container { ty::TraitContainer(_) => return, ty::ImplContainer(cid) => { diff --git a/clippy_lints/src/mut_mut.rs b/clippy_lints/src/mut_mut.rs index 4c217e19725..d5e4a0fdb26 100644 --- a/clippy_lints/src/mut_mut.rs +++ b/clippy_lints/src/mut_mut.rs @@ -91,6 +91,6 @@ fn visit_ty(&mut self, ty: &'tcx hir::Ty) { intravisit::walk_ty(self, ty); } fn nested_visit_map<'this>(&'this mut self) -> intravisit::NestedVisitorMap<'this, 'tcx> { - intravisit::NestedVisitorMap::All(&self.cx.tcx.map) + intravisit::NestedVisitorMap::All(&self.cx.tcx.hir) } } diff --git a/clippy_lints/src/new_without_default.rs b/clippy_lints/src/new_without_default.rs index 5477204b79c..e4e98c26038 100644 --- a/clippy_lints/src/new_without_default.rs +++ b/clippy_lints/src/new_without_default.rs @@ -110,7 +110,7 @@ fn check_fn( } if decl.inputs.is_empty() && &*name.as_str() == "new" && cx.access_levels.is_reachable(id) { let self_ty = cx.tcx - .item_type(cx.tcx.map.local_def_id(cx.tcx.map.get_parent(id))); + .item_type(cx.tcx.hir.local_def_id(cx.tcx.hir.get_parent(id))); if_let_chain!{[ self_ty.walk_shallow().next().is_none(), // implements_trait does not work with generics same_tys(cx, self_ty, return_ty(cx, id), id), @@ -160,7 +160,7 @@ fn can_derive_default<'t, 'c>(ty: ty::Ty<'t>, cx: &LateContext<'c, 't>, default_ return None; } } - cx.tcx.map.span_if_local(adt_def.did) + cx.tcx.hir.span_if_local(adt_def.did) }, _ => None, } diff --git a/clippy_lints/src/print.rs b/clippy_lints/src/print.rs index ad7d720fc51..0776b660b41 100644 --- a/clippy_lints/src/print.rs +++ b/clippy_lints/src/print.rs @@ -135,7 +135,7 @@ fn check_expr(&mut self, cx: &LateContext<'a, 'tcx>, expr: &'tcx Expr) { } fn is_in_debug_impl(cx: &LateContext, expr: &Expr) -> bool { - let map = &cx.tcx.map; + let map = &cx.tcx.hir; // `fmt` method if let Some(NodeImplItem(item)) = map.find(map.get_parent(expr.id)) { diff --git a/clippy_lints/src/ptr.rs b/clippy_lints/src/ptr.rs index 78fdc06708a..590e3d587d4 100644 --- a/clippy_lints/src/ptr.rs +++ b/clippy_lints/src/ptr.rs @@ -63,7 +63,7 @@ fn check_item(&mut self, cx: &LateContext<'a, 'tcx>, item: &'tcx Item) { fn check_impl_item(&mut self, cx: &LateContext<'a, 'tcx>, item: &'tcx ImplItem) { if let ImplItemKind::Method(ref sig, _) = item.node { - if let Some(NodeItem(it)) = cx.tcx.map.find(cx.tcx.map.get_parent(item.id)) { + if let Some(NodeItem(it)) = cx.tcx.hir.find(cx.tcx.hir.get_parent(item.id)) { if let ItemImpl(_, _, _, Some(_), _, _) = it.node { return; // ignore trait impls } @@ -91,7 +91,7 @@ fn check_expr(&mut self, cx: &LateContext<'a, 'tcx>, expr: &'tcx Expr) { } fn check_fn(cx: &LateContext, decl: &FnDecl, fn_id: NodeId) { - let fn_def_id = cx.tcx.map.local_def_id(fn_id); + let fn_def_id = cx.tcx.hir.local_def_id(fn_id); let fn_ty = cx.tcx.item_type(fn_def_id).fn_sig().skip_binder(); for (arg, ty) in decl.inputs.iter().zip(fn_ty.inputs()) { diff --git a/clippy_lints/src/shadow.rs b/clippy_lints/src/shadow.rs index 9fc089bef43..62ef155c321 100644 --- a/clippy_lints/src/shadow.rs +++ b/clippy_lints/src/shadow.rs @@ -338,7 +338,7 @@ fn check_ty<'a, 'tcx>(cx: &LateContext<'a, 'tcx>, ty: &'tcx Ty, bindings: &mut V TySlice(ref sty) => check_ty(cx, sty, bindings), TyArray(ref fty, body_id) => { check_ty(cx, fty, bindings); - check_expr(cx, &cx.tcx.map.body(body_id).value, bindings); + check_expr(cx, &cx.tcx.hir.body(body_id).value, bindings); }, TyPtr(MutTy { ty: ref mty, .. }) | TyRptr(_, MutTy { ty: ref mty, .. }) => check_ty(cx, mty, bindings), @@ -347,7 +347,7 @@ fn check_ty<'a, 'tcx>(cx: &LateContext<'a, 'tcx>, ty: &'tcx Ty, bindings: &mut V check_ty(cx, t, bindings) } }, - TyTypeof(body_id) => check_expr(cx, &cx.tcx.map.body(body_id).value, bindings), + TyTypeof(body_id) => check_expr(cx, &cx.tcx.hir.body(body_id).value, bindings), _ => (), } } @@ -382,7 +382,7 @@ fn visit_name(&mut self, _: Span, name: Name) { } } fn nested_visit_map<'this>(&'this mut self) -> NestedVisitorMap<'this, 'tcx> { - NestedVisitorMap::All(&self.cx.tcx.map) + NestedVisitorMap::All(&self.cx.tcx.hir) } } diff --git a/clippy_lints/src/types.rs b/clippy_lints/src/types.rs index bae4363659a..ccdcb94d212 100644 --- a/clippy_lints/src/types.rs +++ b/clippy_lints/src/types.rs @@ -72,7 +72,7 @@ fn get_lints(&self) -> LintArray { impl<'a, 'tcx> LateLintPass<'a, 'tcx> for TypePass { fn check_fn(&mut self, cx: &LateContext, _: FnKind, decl: &FnDecl, _: &Body, _: Span, id: NodeId) { // skip trait implementations, see #605 - if let Some(map::NodeItem(item)) = cx.tcx.map.find(cx.tcx.map.get_parent(id)) { + if let Some(map::NodeItem(item)) = cx.tcx.hir.find(cx.tcx.hir.get_parent(id)) { if let ItemImpl(_, _, _, Some(..), _, _) = item.node { return; } @@ -702,13 +702,10 @@ fn visit_ty(&mut self, ty: &'tcx Ty) { // function types bring a lot of overhead TyBareFn(..) => (50 * self.nest, 1), - TyTraitObject(ref bounds) => { - let has_lifetimes = bounds.iter() - .any(|bound| match *bound { - TraitTyParamBound(ref poly_trait, ..) => !poly_trait.bound_lifetimes.is_empty(), - RegionTyParamBound(..) => true, - }); - if has_lifetimes { + TyTraitObject(ref param_bounds, _) => { + let has_lifetime_parameters = param_bounds.iter() + .any(|bound| !bound.bound_lifetimes.is_empty()); + if has_lifetime_parameters { // complex trait bounds like A<'a, 'b> (50 * self.nest, 1) } else { @@ -725,7 +722,7 @@ fn visit_ty(&mut self, ty: &'tcx Ty) { self.nest -= sub_nest; } fn nested_visit_map<'this>(&'this mut self) -> NestedVisitorMap<'this, 'tcx> { - NestedVisitorMap::All(&self.cx.tcx.map) + NestedVisitorMap::All(&self.cx.tcx.hir) } } diff --git a/clippy_lints/src/unused_label.rs b/clippy_lints/src/unused_label.rs index 5136a821c54..c74554d5083 100644 --- a/clippy_lints/src/unused_label.rs +++ b/clippy_lints/src/unused_label.rs @@ -83,6 +83,6 @@ fn visit_expr(&mut self, expr: &'tcx hir::Expr) { walk_expr(self, expr); } fn nested_visit_map<'this>(&'this mut self) -> NestedVisitorMap<'this, 'tcx> { - NestedVisitorMap::All(&self.cx.tcx.map) + NestedVisitorMap::All(&self.cx.tcx.hir) } } diff --git a/clippy_lints/src/utils/hir.rs b/clippy_lints/src/utils/hir.rs index 3bce1b3d7e5..2c5c19b2185 100644 --- a/clippy_lints/src/utils/hir.rs +++ b/clippy_lints/src/utils/hir.rs @@ -114,7 +114,7 @@ pub fn eq_expr(&self, left: &Expr, right: &Expr) -> bool { }, (&ExprRepeat(ref le, ll_id), &ExprRepeat(ref re, rl_id)) => { self.eq_expr(le, re) && - self.eq_expr(&self.cx.tcx.map.body(ll_id).value, &self.cx.tcx.map.body(rl_id).value) + self.eq_expr(&self.cx.tcx.hir.body(ll_id).value, &self.cx.tcx.hir.body(rl_id).value) }, (&ExprRet(ref l), &ExprRet(ref r)) => both(l, r, |l, r| self.eq_expr(l, r)), (&ExprPath(ref l), &ExprPath(ref r)) => self.eq_qpath(l, r), @@ -217,7 +217,7 @@ fn eq_ty(&self, left: &Ty, right: &Ty) -> bool { (&TySlice(ref l_vec), &TySlice(ref r_vec)) => self.eq_ty(l_vec, r_vec), (&TyArray(ref lt, ll_id), &TyArray(ref rt, rl_id)) => { self.eq_ty(lt, rt) && - self.eq_expr(&self.cx.tcx.map.body(ll_id).value, &self.cx.tcx.map.body(rl_id).value) + self.eq_expr(&self.cx.tcx.hir.body(ll_id).value, &self.cx.tcx.hir.body(rl_id).value) }, (&TyPtr(ref l_mut), &TyPtr(ref r_mut)) => l_mut.mutbl == r_mut.mutbl && self.eq_ty(&*l_mut.ty, &*r_mut.ty), (&TyRptr(_, ref l_rmut), &TyRptr(_, ref r_rmut)) => { @@ -370,7 +370,7 @@ pub fn hash_expr(&mut self, e: &Expr) { let c: fn(_, _, _, _) -> _ = ExprClosure; c.hash(&mut self.s); cap.hash(&mut self.s); - self.hash_expr(&self.cx.tcx.map.body(eid).value); + self.hash_expr(&self.cx.tcx.hir.body(eid).value); }, ExprField(ref e, ref f) => { let c: fn(_, _) -> _ = ExprField; @@ -435,7 +435,7 @@ pub fn hash_expr(&mut self, e: &Expr) { let c: fn(_, _) -> _ = ExprRepeat; c.hash(&mut self.s); self.hash_expr(e); - self.hash_expr(&self.cx.tcx.map.body(l_id).value); + self.hash_expr(&self.cx.tcx.hir.body(l_id).value); }, ExprRet(ref e) => { let c: fn(_) -> _ = ExprRet; diff --git a/clippy_lints/src/utils/inspector.rs b/clippy_lints/src/utils/inspector.rs index e08a7d3bfdb..66c1ba89353 100644 --- a/clippy_lints/src/utils/inspector.rs +++ b/clippy_lints/src/utils/inspector.rs @@ -65,7 +65,7 @@ fn check_impl_item(&mut self, cx: &LateContext<'a, 'tcx>, item: &'tcx hir::ImplI match item.node { hir::ImplItemKind::Const(_, body_id) => { println!("associated constant"); - print_expr(cx, &cx.tcx.map.body(body_id).value, 1); + print_expr(cx, &cx.tcx.hir.body(body_id).value, 1); }, hir::ImplItemKind::Method(..) => println!("method"), hir::ImplItemKind::Type(_) => println!("associated type"), @@ -332,13 +332,13 @@ fn print_expr(cx: &LateContext, expr: &hir::Expr, indent: usize) { println!("{}value:", ind); print_expr(cx, val, indent + 1); println!("{}repeat count:", ind); - print_expr(cx, &cx.tcx.map.body(body_id).value, indent + 1); + print_expr(cx, &cx.tcx.hir.body(body_id).value, indent + 1); }, } } fn print_item(cx: &LateContext, item: &hir::Item) { - let did = cx.tcx.map.local_def_id(item.id); + let did = cx.tcx.hir.local_def_id(item.id); println!("item `{}`", item.name); match item.vis { hir::Visibility::Public => println!("public"), diff --git a/clippy_lints/src/utils/internal_lints.rs b/clippy_lints/src/utils/internal_lints.rs index ea7a654ed1f..41e9d777363 100644 --- a/clippy_lints/src/utils/internal_lints.rs +++ b/clippy_lints/src/utils/internal_lints.rs @@ -114,7 +114,7 @@ fn check_item(&mut self, cx: &LateContext<'a, 'tcx>, item: &'tcx Item) { output: &mut self.registered_lints, cx: cx, }; - collector.visit_expr(&cx.tcx.map.body(body_id).value); + collector.visit_expr(&cx.tcx.hir.body(body_id).value); } } } @@ -142,7 +142,10 @@ fn check_crate_post(&mut self, cx: &LateContext<'a, 'tcx>, _: &'tcx Crate) { fn is_lint_ref_type(ty: &Ty) -> bool { - if let TyRptr(Some(_), MutTy { ty: ref inner, mutbl: MutImmutable }) = ty.node { + if let TyRptr(ref lt, MutTy { ty: ref inner, mutbl: MutImmutable }) = ty.node { + if lt.is_elided() { + return false; + } if let TyPath(ref path) = inner.node { return match_path(path, &paths::LINT); } @@ -175,6 +178,6 @@ fn visit_path(&mut self, path: &'tcx Path, _: NodeId) { } } fn nested_visit_map<'this>(&'this mut self) -> NestedVisitorMap<'this, 'tcx> { - NestedVisitorMap::All(&self.cx.tcx.map) + NestedVisitorMap::All(&self.cx.tcx.hir) } } diff --git a/clippy_lints/src/utils/mod.rs b/clippy_lints/src/utils/mod.rs index ef9c6b9c38a..1211b77ddb8 100644 --- a/clippy_lints/src/utils/mod.rs +++ b/clippy_lints/src/utils/mod.rs @@ -362,8 +362,8 @@ pub fn method_chain_args<'a>(expr: &'a Expr, methods: &[&str]) -> Option Option { - let parent_id = cx.tcx.map.get_parent(expr.id); - match cx.tcx.map.find(parent_id) { + let parent_id = cx.tcx.hir.get_parent(expr.id); + match cx.tcx.hir.find(parent_id) { Some(Node::NodeItem(&Item { ref name, .. })) | Some(Node::NodeTraitItem(&TraitItem { ref name, .. })) | Some(Node::NodeImplItem(&ImplItem { ref name, .. })) => Some(*name), @@ -458,7 +458,7 @@ fn trim_multiline_inner(s: Cow, ignore_first: bool, ch: char) -> Cow { /// Get a parent expressions if any – this is useful to constrain a lint. pub fn get_parent_expr<'c>(cx: &'c LateContext, e: &Expr) -> Option<&'c Expr> { - let map = &cx.tcx.map; + let map = &cx.tcx.hir; let node_id: NodeId = e.id; let parent_id: NodeId = map.get_parent_node(node_id); if node_id == parent_id { @@ -472,14 +472,14 @@ pub fn get_parent_expr<'c>(cx: &'c LateContext, e: &Expr) -> Option<&'c Expr> { } pub fn get_enclosing_block<'a, 'tcx: 'a>(cx: &LateContext<'a, 'tcx>, node: NodeId) -> Option<&'tcx Block> { - let map = &cx.tcx.map; + let map = &cx.tcx.hir; let enclosing_node = map.get_enclosing_scope(node) .and_then(|enclosing_id| map.find(enclosing_id)); if let Some(node) = enclosing_node { match node { Node::NodeBlock(block) => Some(block), Node::NodeItem(&Item { node: ItemFn(_, _, _, _, _, eid), .. }) => { - match cx.tcx.map.body(eid).value.node { + match cx.tcx.hir.body(eid).value.node { ExprBlock(ref block) => Some(block), _ => None, } @@ -762,7 +762,7 @@ pub fn camel_case_from(s: &str) -> usize { /// Convenience function to get the return type of a function pub fn return_ty<'a, 'tcx>(cx: &LateContext<'a, 'tcx>, fn_item: NodeId) -> ty::Ty<'tcx> { let parameter_env = ty::ParameterEnvironment::for_item(cx.tcx, fn_item); - let fn_def_id = cx.tcx.map.local_def_id(fn_item); + let fn_def_id = cx.tcx.hir.local_def_id(fn_item); let fn_sig = cx.tcx.item_type(fn_def_id).fn_sig(); let fn_sig = cx.tcx.liberate_late_bound_regions(parameter_env.free_id_outlive, fn_sig); fn_sig.output() diff --git a/clippy_lints/src/vec.rs b/clippy_lints/src/vec.rs index d518921b743..a8d2701ccfa 100644 --- a/clippy_lints/src/vec.rs +++ b/clippy_lints/src/vec.rs @@ -48,7 +48,7 @@ fn check_expr(&mut self, cx: &LateContext<'a, 'tcx>, expr: &'tcx Expr) { if_let_chain!{[ let Some((_, arg, _)) = higher::for_loop(expr), let Some(vec_args) = higher::vec_macro(cx, arg), - is_copy(cx, vec_type(cx.tables.expr_ty_adjusted(arg)), cx.tcx.map.get_parent(expr.id)), + is_copy(cx, vec_type(cx.tables.expr_ty_adjusted(arg)), cx.tcx.hir.get_parent(expr.id)), ], { // report the error around the `vec!` not inside `:` let span = cx.sess().codemap().source_callsite(arg.span);