]> git.lizzy.rs Git - rust.git/commitdiff
Implementation of tool lints
authorflip1995 <9744647+flip1995@users.noreply.github.com>
Tue, 3 Jul 2018 11:50:48 +0000 (13:50 +0200)
committerflip1995 <9744647+flip1995@users.noreply.github.com>
Wed, 4 Jul 2018 10:16:46 +0000 (12:16 +0200)
src/librustc/diagnostics.rs
src/librustc/lint/levels.rs
src/libsyntax/attr/mod.rs
src/libsyntax/feature_gate.rs

index 5fecf2b15359fcce888cbae08506e00797d3f9ae..5ace8397d9f827bbf17b434ddb8f0edd10edd44a 100644 (file)
@@ -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
 }
index 3393a2bf89d4b41408108d3a636a88fdf75c6b2f..6761b7b74924fb5f7b779f13b686e33faf415866 100644 (file)
@@ -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) => {
index 4e27d6c15258bedef5e7e59e773f36533eac7ce4..f8db62083c7fd8dd89a0f476ba44eb37d020a68b 100644 (file)
@@ -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 {
index 2ae0e669fd031a3c0282c22f9f87c7b3ca63befd..d0837063514b2ceed655266f55da25a50f10e952 100644 (file)
@@ -458,6 +458,8 @@ pub fn walk_feature_fields<F>(&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),