diff --git a/clippy_lints/src/attrs.rs b/clippy_lints/src/attrs.rs index 086716c1f46..7a36049178b 100644 --- a/clippy_lints/src/attrs.rs +++ b/clippy_lints/src/attrs.rs @@ -4,7 +4,7 @@ use reexport::*; use rustc::lint::*; use rustc::hir::*; use semver::Version; -use syntax::ast::{Attribute, Lit, LitKind, MetaItemKind}; +use syntax::ast::{Attribute, Lit, LitKind, MetaItemKind, NestedMetaItem, NestedMetaItemKind}; use syntax::codemap::Span; use utils::{in_macro, match_path, span_lint, span_lint_and_then, snippet_opt}; use utils::paths; @@ -89,11 +89,13 @@ impl LateLintPass for AttrPass { return; } for item in items { - if let MetaItemKind::NameValue(ref name, ref lit) = item.node { - if name == &"since" { - check_semver(cx, item.span, lit); - } - } + if_let_chain! {[ + let NestedMetaItemKind::MetaItem(ref mi) = item.node, + let MetaItemKind::NameValue(ref name, ref lit) = mi.node, + name == &"since", + ], { + check_semver(cx, item.span, lit); + }} } } } @@ -111,11 +113,9 @@ impl LateLintPass for AttrPass { "allow" | "warn" | "deny" | "forbid" => { // whitelist `unused_imports` for lint in lint_list { - if let MetaItemKind::Word(ref word) = lint.node { - if word == "unused_imports" { - if let ItemUse(_) = item.node { - return; - } + if is_word(lint, "unused_imports") { + if let ItemUse(_) = item.node { + return; } } } @@ -214,10 +214,7 @@ fn check_attrs(cx: &LateContext, span: Span, name: &Name, attrs: &[Attribute]) { if values.len() != 1 || inline != &"inline" { continue; } - if let MetaItemKind::Word(ref always) = values[0].node { - if always != &"always" { - continue; - } + if is_word(&values[0], "always") { span_lint(cx, INLINE_ALWAYS, attr.span, @@ -239,3 +236,13 @@ fn check_semver(cx: &LateContext, span: Span, lit: &Lit) { span, "the since field must contain a semver-compliant version"); } + +fn is_word(nmi: &NestedMetaItem, expected: &str) -> bool { + if let NestedMetaItemKind::MetaItem(ref mi) = nmi.node { + if let MetaItemKind::Word(ref word) = mi.node { + return word == expected; + } + } + + false +} diff --git a/clippy_lints/src/missing_doc.rs b/clippy_lints/src/missing_doc.rs index 0871f5ab575..454f591756b 100644 --- a/clippy_lints/src/missing_doc.rs +++ b/clippy_lints/src/missing_doc.rs @@ -21,7 +21,7 @@ use rustc::hir; use rustc::lint::*; use rustc::ty; use syntax::ast; -use syntax::attr::{self, AttrMetaMethods}; +use syntax::attr; use syntax::codemap::Span; use utils::in_macro; @@ -99,7 +99,7 @@ impl LateLintPass for MissingDoc { let doc_hidden = self.doc_hidden() || attrs.iter().any(|attr| { attr.check_name("doc") && match attr.meta_item_list() { None => false, - Some(l) => attr::contains_name(&l[..], "hidden"), + Some(l) => attr::list_contains_name(&l[..], "hidden"), } }); self.doc_hidden_stack.push(doc_hidden); @@ -123,6 +123,7 @@ impl LateLintPass for MissingDoc { hir::ItemStruct(..) => "a struct", hir::ItemTrait(..) => "a trait", hir::ItemTy(..) => "a type alias", + hir::ItemUnion(..) => "a union", hir::ItemDefaultImpl(..) | hir::ItemExternCrate(..) | hir::ItemForeignMod(..) | diff --git a/clippy_lints/src/unsafe_removed_from_name.rs b/clippy_lints/src/unsafe_removed_from_name.rs index 8d5e01db570..488ca5c8a62 100644 --- a/clippy_lints/src/unsafe_removed_from_name.rs +++ b/clippy_lints/src/unsafe_removed_from_name.rs @@ -51,8 +51,8 @@ impl LateLintPass for UnsafeNameRemoval { ViewPath_::ViewPathList(_, ref path_list_items) => { for path_list_item in path_list_items.iter() { let plid = path_list_item.node; - if let (Some(name), Some(rename)) = (plid.name(), plid.rename()) { - unsafe_to_safe_check(name, rename, cx, &item.span); + if let Some(rename) = plid.rename { + unsafe_to_safe_check(plid.name, rename, cx, &item.span); }; } } diff --git a/clippy_lints/src/utils/conf.rs b/clippy_lints/src/utils/conf.rs index 748d144daa0..f9a93ed3f6e 100644 --- a/clippy_lints/src/utils/conf.rs +++ b/clippy_lints/src/utils/conf.rs @@ -4,13 +4,13 @@ use std::{fmt, fs, io}; use std::io::Read; -use syntax::{ast, codemap, ptr}; +use syntax::{ast, codemap}; use syntax::parse::token; use toml; /// Get the configuration file from arguments. -pub fn file(args: &[ptr::P]) -> Result, (&'static str, codemap::Span)> { - for arg in args { +pub fn file(args: &[codemap::Spanned]) -> Result, (&'static str, codemap::Span)> { + for arg in args.iter().filter_map(|a| a.meta_item()) { match arg.node { ast::MetaItemKind::Word(ref name) | ast::MetaItemKind::List(ref name, _) => {