+use matches::matches;
use rustc::hir::*;
use rustc::hir::map::*;
use rustc::hir::intravisit::FnKind;
use rustc::lint::*;
+use rustc::{declare_lint, lint_array};
+use if_chain::if_chain;
use rustc::ty::{self, RegionKind, TypeFoldable};
use rustc::traits;
use rustc::middle::expr_use_visitor as euv;
use syntax::ast::NodeId;
use syntax_pos::Span;
use syntax::errors::DiagnosticBuilder;
-use utils::{get_trait_def_id, implements_trait, in_macro, is_copy, is_self, match_type, multispan_sugg, paths,
+use crate::utils::{get_trait_def_id, implements_trait, in_macro, is_copy, is_self, match_type, multispan_sugg, paths,
snippet, snippet_opt, span_lint_and_then};
-use utils::ptr::get_spans;
+use crate::utils::ptr::get_spans;
use std::collections::{HashMap, HashSet};
use std::borrow::Cow;
}
match kind {
- FnKind::ItemFn(.., abi, _, attrs) => {
- if abi != Abi::Rust {
+ FnKind::ItemFn(.., header, _, attrs) => {
+ if header.abi != Abi::Rust {
return;
}
for a in attrs {
// Exclude non-inherent impls
if let Some(NodeItem(item)) = cx.tcx.hir.find(cx.tcx.hir.get_parent_node(node_id)) {
- if matches!(item.node, ItemImpl(_, _, _, _, Some(_), _, _) |
- ItemTrait(..))
+ if matches!(item.node, ItemKind::Impl(_, _, _, _, Some(_), _, _) |
+ ItemKind::Trait(..))
{
return;
}
// Ignore `self`s.
if idx == 0 {
- if let PatKind::Binding(_, _, name, ..) = arg.pat.node {
- if name.node.as_str() == "self" {
+ if let PatKind::Binding(_, _, ident, ..) = arg.pat.node {
+ if ident.as_str() == "self" {
continue;
}
}
if match_type(cx, ty, &paths::VEC);
if let Some(clone_spans) =
get_spans(cx, Some(body.id()), idx, &[("clone", ".to_owned()")]);
- if let TyPath(QPath::Resolved(_, ref path)) = input.node;
+ if let TyKind::Path(QPath::Resolved(_, ref path)) = input.node;
if let Some(elem_ty) = path.segments.iter()
- .find(|seg| seg.name == "Vec")
- .and_then(|ps| ps.parameters.as_ref())
- .map(|params| ¶ms.types[0]);
+ .find(|seg| seg.ident.name == "Vec")
+ .and_then(|ps| ps.args.as_ref())
+ .map(|params| params.args.iter().find_map(|arg| match arg {
+ GenericArg::Type(ty) => Some(ty),
+ GenericArg::Lifetime(_) => None,
+ }).unwrap());
then {
let slice_ty = format!("&[{}]", snippet(cx, elem_ty.span, "_"));
db.span_suggestion(input.span,
match node {
map::Node::NodeExpr(e) => {
// `match` and `if let`
- if let ExprMatch(ref c, ..) = e.node {
+ if let ExprKind::Match(ref c, ..) = e.node {
self.spans_need_deref
.entry(vid)
.or_insert_with(HashSet::new)
map::Node::NodeStmt(s) => {
// `let <pat> = x;`
if_chain! {
- if let StmtDecl(ref decl, _) = s.node;
- if let DeclLocal(ref local) = decl.node;
+ if let StmtKind::Decl(ref decl, _) = s.node;
+ if let DeclKind::Local(ref local) = decl.node;
then {
self.spans_need_deref
.entry(vid)