From: flip1995 <9744647+flip1995@users.noreply.github.com> Date: Tue, 3 Jul 2018 11:50:48 +0000 (+0200) Subject: Implementation of tool lints X-Git-Url: https://git.lizzy.rs/?a=commitdiff_plain;h=dddb8d2eba04610eca944a659c1906f78d210ab4;p=rust.git Implementation of tool lints --- diff --git a/src/librustc/diagnostics.rs b/src/librustc/diagnostics.rs index 5fecf2b1535..5ace8397d9f 100644 --- a/src/librustc/diagnostics.rs +++ b/src/librustc/diagnostics.rs @@ -2137,4 +2137,5 @@ trait Foo { } E0707, // multiple elided lifetimes used in arguments of `async fn` E0708, // `async` non-`move` closures with arguments are not currently supported E0709, // multiple different lifetimes used in arguments of `async fn` + E0710, // an unknown tool name found in scoped lint } diff --git a/src/librustc/lint/levels.rs b/src/librustc/lint/levels.rs index 3393a2bf89d..6761b7b7492 100644 --- a/src/librustc/lint/levels.rs +++ b/src/librustc/lint/levels.rs @@ -22,6 +22,7 @@ use syntax::ast; use syntax::attr; use syntax::codemap::MultiSpan; +use syntax::feature_gate; use syntax::symbol::Symbol; use util::nodemap::FxHashMap; @@ -221,6 +222,28 @@ pub fn push(&mut self, attrs: &[ast::Attribute]) -> BuilderPush { continue } }; + if word.is_scoped() { + if !self.sess.features_untracked().tool_lints { + feature_gate::emit_feature_err(&sess.parse_sess, + "tool_lints", + word.span, + feature_gate::GateIssue::Language, + &format!("scoped lint `{}` is experimental", + word.ident)); + } + + if !attr::is_known_lint_tool(word) { + span_err!( + sess, + word.span, + E0710, + "an unknown tool name found in scoped lint: `{}`.", + word.ident + ); + } + + continue + } let name = word.name(); match store.check_lint_name(&name.as_str()) { CheckLintNameResult::Ok(ids) => { diff --git a/src/libsyntax/attr/mod.rs b/src/libsyntax/attr/mod.rs index 4e27d6c1525..f8db62083c7 100644 --- a/src/libsyntax/attr/mod.rs +++ b/src/libsyntax/attr/mod.rs @@ -90,6 +90,7 @@ pub fn is_known(attr: &Attribute) -> bool { } const RUST_KNOWN_TOOL: &[&str] = &["clippy", "rustfmt"]; +const RUST_KNOWN_LINT_TOOL: &[&str] = &["clippy"]; pub fn is_known_tool(attr: &Attribute) -> bool { let tool_name = @@ -97,6 +98,12 @@ pub fn is_known_tool(attr: &Attribute) -> bool { RUST_KNOWN_TOOL.contains(&tool_name.as_str().as_ref()) } +pub fn is_known_lint_tool(m_item: &MetaItem) -> bool { + let tool_name = + m_item.ident.segments.iter().next().expect("empty path in meta item").ident.name; + RUST_KNOWN_LINT_TOOL.contains(&tool_name.as_str().as_ref()) +} + impl NestedMetaItem { /// Returns the MetaItem if self is a NestedMetaItemKind::MetaItem. pub fn meta_item(&self) -> Option<&MetaItem> { @@ -290,6 +297,10 @@ pub fn is_value_str(&self) -> bool { pub fn is_meta_item_list(&self) -> bool { self.meta_item_list().is_some() } + + pub fn is_scoped(&self) -> bool { + self.ident.segments.len() > 1 + } } impl Attribute { diff --git a/src/libsyntax/feature_gate.rs b/src/libsyntax/feature_gate.rs index 2ae0e669fd0..d0837063514 100644 --- a/src/libsyntax/feature_gate.rs +++ b/src/libsyntax/feature_gate.rs @@ -458,6 +458,8 @@ pub fn walk_feature_fields(&self, mut f: F) // Scoped attributes (active, tool_attributes, "1.25.0", Some(44690), None), + // Scoped lints + (active, tool_lints, "1.28.0", Some(44690), None), // allow irrefutable patterns in if-let and while-let statements (RFC 2086) (active, irrefutable_let_patterns, "1.27.0", Some(44495), None),