diff options
| author | est31 <MTest31@outlook.com> | 2017-05-12 08:10:52 +0200 |
|---|---|---|
| committer | est31 <MTest31@outlook.com> | 2017-05-13 16:02:29 +0200 |
| commit | d14d194f61bfd775411c2450e1d939bbb06542b9 (patch) | |
| tree | 32a833a4a79f662d1aac206706d9623d042e457a | |
| parent | db82c57cb7ff7f4f629ceeaefdbc693d2886fda7 (diff) | |
| download | rust-d14d194f61bfd775411c2450e1d939bbb06542b9.tar.gz rust-d14d194f61bfd775411c2450e1d939bbb06542b9.zip | |
Support #[allow] etc logic on a per macro level
This commit extends the current unused macro linter to support directives like #[allow(unused_macros)] or #[deny(unused_macros)] directly next to the macro definition, or in one of the modules the macro is inside. Before, we only supported such directives at a per crate level, due to the crate's NodeId being passed to session.add_lint. We also had to implement handling of the macro's NodeId in the lint visitor.
| -rw-r--r-- | src/librustc/lint/context.rs | 8 | ||||
| -rw-r--r-- | src/librustc_plugin/registry.rs | 3 | ||||
| -rw-r--r-- | src/librustc_resolve/macros.rs | 13 | ||||
| -rw-r--r-- | src/libsyntax/ext/base.rs | 2 | ||||
| -rw-r--r-- | src/libsyntax/ext/expand.rs | 2 | ||||
| -rw-r--r-- | src/libsyntax/ext/tt/macro_rules.rs | 6 |
6 files changed, 22 insertions, 12 deletions
diff --git a/src/librustc/lint/context.rs b/src/librustc/lint/context.rs index 6f3e84247f7..172b74d5393 100644 --- a/src/librustc/lint/context.rs +++ b/src/librustc/lint/context.rs @@ -49,6 +49,7 @@ use hir; use hir::def_id::LOCAL_CRATE; use hir::intravisit as hir_visit; use syntax::visit as ast_visit; +use syntax::tokenstream::ThinTokenStream; /// Information about the registered lints. /// @@ -1125,6 +1126,13 @@ impl<'a> ast_visit::Visitor<'a> for EarlyContext<'a> { fn visit_attribute(&mut self, attr: &'a ast::Attribute) { run_lints!(self, check_attribute, early_passes, attr); } + + fn visit_mac_def(&mut self, _mac: &'a ThinTokenStream, id: ast::NodeId) { + let lints = self.sess.lints.borrow_mut().take(id); + for early_lint in lints { + self.early_lint(&early_lint); + } + } } enum CheckLintNameResult { diff --git a/src/librustc_plugin/registry.rs b/src/librustc_plugin/registry.rs index cdde56f5f63..3027489d65b 100644 --- a/src/librustc_plugin/registry.rs +++ b/src/librustc_plugin/registry.rs @@ -103,7 +103,8 @@ impl<'a> Registry<'a> { } self.syntax_exts.push((name, match extension { NormalTT(ext, _, allow_internal_unstable) => { - NormalTT(ext, Some(self.krate_span), allow_internal_unstable) + let nid = ast::CRATE_NODE_ID; + NormalTT(ext, Some((nid, self.krate_span)), allow_internal_unstable) } IdentTT(ext, _, allow_internal_unstable) => { IdentTT(ext, Some(self.krate_span), allow_internal_unstable) diff --git a/src/librustc_resolve/macros.rs b/src/librustc_resolve/macros.rs index 29ca163b0b4..f6155c6cafd 100644 --- a/src/librustc_resolve/macros.rs +++ b/src/librustc_resolve/macros.rs @@ -305,17 +305,14 @@ impl<'a> base::Resolver for Resolver<'a> { fn check_unused_macros(&self) { for (did, _) in self.unused_macros.iter().filter(|&(_, b)| *b) { - let span = match *self.macro_map[did] { - SyntaxExtension::NormalTT(_, sp, _) => sp, - SyntaxExtension::IdentTT(_, sp, _) => sp, + let id_span = match *self.macro_map[did] { + SyntaxExtension::NormalTT(_, isp, _) => isp, _ => None }; - if let Some(span) = span { + if let Some((id, span)) = id_span { let lint = lint::builtin::UNUSED_MACROS; - let msg = "unused macro".to_string(); - // We are using CRATE_NODE_ID here even though its inaccurate, as we - // sadly don't have the NodeId of the macro definition. - self.session.add_lint(lint, ast::CRATE_NODE_ID, span, msg); + let msg = "unused macro definition".to_string(); + self.session.add_lint(lint, id, span, msg); } else { bug!("attempted to create unused macro error, but span not available"); } diff --git a/src/libsyntax/ext/base.rs b/src/libsyntax/ext/base.rs index b0253ec3905..86202f77dbf 100644 --- a/src/libsyntax/ext/base.rs +++ b/src/libsyntax/ext/base.rs @@ -535,7 +535,7 @@ pub enum SyntaxExtension { /// /// The `bool` dictates whether the contents of the macro can /// directly use `#[unstable]` things (true == yes). - NormalTT(Box<TTMacroExpander>, Option<Span>, bool), + NormalTT(Box<TTMacroExpander>, Option<(ast::NodeId, Span)>, bool), /// A function-like syntax extension that has an extra ident before /// the block. diff --git a/src/libsyntax/ext/expand.rs b/src/libsyntax/ext/expand.rs index a8aa103f80a..75dd09f2311 100644 --- a/src/libsyntax/ext/expand.rs +++ b/src/libsyntax/ext/expand.rs @@ -469,7 +469,7 @@ impl<'a, 'b> MacroExpander<'a, 'b> { call_site: span, callee: NameAndSpan { format: MacroBang(Symbol::intern(&format!("{}", path))), - span: exp_span, + span: exp_span.map(|(_, s)| s), allow_internal_unstable: allow_internal_unstable, }, }); diff --git a/src/libsyntax/ext/tt/macro_rules.rs b/src/libsyntax/ext/tt/macro_rules.rs index f959ccc989e..0c787dcbecb 100644 --- a/src/libsyntax/ext/tt/macro_rules.rs +++ b/src/libsyntax/ext/tt/macro_rules.rs @@ -252,7 +252,11 @@ pub fn compile(sess: &ParseSess, features: &RefCell<Features>, def: &ast::Item) valid: valid, }); - NormalTT(exp, Some(def.span), attr::contains_name(&def.attrs, "allow_internal_unstable")) + NormalTT( + exp, + Some((def.id, def.span)), + attr::contains_name(&def.attrs, "allow_internal_unstable") + ) } fn check_lhs_nt_follows(sess: &ParseSess, |
