未验证 提交 dddb8d2e 编写于 作者: F flip1995

Implementation of tool lints

上级 ed29e86c
...@@ -2137,4 +2137,5 @@ trait Foo { } ...@@ -2137,4 +2137,5 @@ trait Foo { }
E0707, // multiple elided lifetimes used in arguments of `async fn` E0707, // multiple elided lifetimes used in arguments of `async fn`
E0708, // `async` non-`move` closures with arguments are not currently supported E0708, // `async` non-`move` closures with arguments are not currently supported
E0709, // multiple different lifetimes used in arguments of `async fn` E0709, // multiple different lifetimes used in arguments of `async fn`
E0710, // an unknown tool name found in scoped lint
} }
...@@ -22,6 +22,7 @@ ...@@ -22,6 +22,7 @@
use syntax::ast; use syntax::ast;
use syntax::attr; use syntax::attr;
use syntax::codemap::MultiSpan; use syntax::codemap::MultiSpan;
use syntax::feature_gate;
use syntax::symbol::Symbol; use syntax::symbol::Symbol;
use util::nodemap::FxHashMap; use util::nodemap::FxHashMap;
...@@ -221,6 +222,28 @@ pub fn push(&mut self, attrs: &[ast::Attribute]) -> BuilderPush { ...@@ -221,6 +222,28 @@ pub fn push(&mut self, attrs: &[ast::Attribute]) -> BuilderPush {
continue 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(); let name = word.name();
match store.check_lint_name(&name.as_str()) { match store.check_lint_name(&name.as_str()) {
CheckLintNameResult::Ok(ids) => { CheckLintNameResult::Ok(ids) => {
......
...@@ -90,6 +90,7 @@ pub fn is_known(attr: &Attribute) -> bool { ...@@ -90,6 +90,7 @@ pub fn is_known(attr: &Attribute) -> bool {
} }
const RUST_KNOWN_TOOL: &[&str] = &["clippy", "rustfmt"]; const RUST_KNOWN_TOOL: &[&str] = &["clippy", "rustfmt"];
const RUST_KNOWN_LINT_TOOL: &[&str] = &["clippy"];
pub fn is_known_tool(attr: &Attribute) -> bool { pub fn is_known_tool(attr: &Attribute) -> bool {
let tool_name = let tool_name =
...@@ -97,6 +98,12 @@ pub fn is_known_tool(attr: &Attribute) -> bool { ...@@ -97,6 +98,12 @@ pub fn is_known_tool(attr: &Attribute) -> bool {
RUST_KNOWN_TOOL.contains(&tool_name.as_str().as_ref()) 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 { impl NestedMetaItem {
/// Returns the MetaItem if self is a NestedMetaItemKind::MetaItem. /// Returns the MetaItem if self is a NestedMetaItemKind::MetaItem.
pub fn meta_item(&self) -> Option<&MetaItem> { pub fn meta_item(&self) -> Option<&MetaItem> {
...@@ -290,6 +297,10 @@ pub fn is_value_str(&self) -> bool { ...@@ -290,6 +297,10 @@ pub fn is_value_str(&self) -> bool {
pub fn is_meta_item_list(&self) -> bool { pub fn is_meta_item_list(&self) -> bool {
self.meta_item_list().is_some() self.meta_item_list().is_some()
} }
pub fn is_scoped(&self) -> bool {
self.ident.segments.len() > 1
}
} }
impl Attribute { impl Attribute {
......
...@@ -458,6 +458,8 @@ pub fn walk_feature_fields<F>(&self, mut f: F) ...@@ -458,6 +458,8 @@ pub fn walk_feature_fields<F>(&self, mut f: F)
// Scoped attributes // Scoped attributes
(active, tool_attributes, "1.25.0", Some(44690), None), (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) // allow irrefutable patterns in if-let and while-let statements (RFC 2086)
(active, irrefutable_let_patterns, "1.27.0", Some(44495), None), (active, irrefutable_let_patterns, "1.27.0", Some(44495), None),
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册