diff options
Diffstat (limited to 'src')
| -rw-r--r-- | src/librustc/hir/mod.rs | 13 | ||||
| -rw-r--r-- | src/librustc/lint/context.rs | 15 |
2 files changed, 27 insertions, 1 deletions
diff --git a/src/librustc/hir/mod.rs b/src/librustc/hir/mod.rs index ca5ffe83048..58f1b1f9a41 100644 --- a/src/librustc/hir/mod.rs +++ b/src/librustc/hir/mod.rs @@ -1854,6 +1854,19 @@ impl Item_ { _ => None, } } + + pub fn generics(&self) -> Option<&Generics> { + Some(match *self { + ItemFn(_, _, _, _, ref generics, _) | + ItemTy(_, ref generics) | + ItemEnum(_, ref generics) | + ItemStruct(_, ref generics) | + ItemUnion(_, ref generics) | + ItemTrait(_, ref generics, _, _) | + ItemImpl(_, _, _, ref generics, _, _, _)=> generics, + _ => return None + }) + } } /// A reference from an trait to one of its associated items. This diff --git a/src/librustc/lint/context.rs b/src/librustc/lint/context.rs index 4d1374b69b8..601e0316d4a 100644 --- a/src/librustc/lint/context.rs +++ b/src/librustc/lint/context.rs @@ -352,6 +352,9 @@ pub struct LateContext<'a, 'tcx: 'a> { lint_sess: LintSession<'tcx, LateLintPassObject>, last_ast_node_with_lint_attrs: ast::NodeId, + + /// Generic type parameters in scope for the item we are in. + pub generics: Option<&'tcx hir::Generics>, } /// Context for lint checking of the AST, after expansion, before lowering to @@ -646,13 +649,16 @@ impl<'a, 'tcx> hir_visit::Visitor<'tcx> for LateContext<'a, 'tcx> { } fn visit_item(&mut self, it: &'tcx hir::Item) { + let generics = self.generics.take(); + self.generics = it.node.generics(); self.with_lint_attrs(it.id, &it.attrs, |cx| { cx.with_param_env(it.id, |cx| { run_lints!(cx, check_item, late_passes, it); hir_visit::walk_item(cx, it); run_lints!(cx, check_item_post, late_passes, it); }); - }) + }); + self.generics = generics; } fn visit_foreign_item(&mut self, it: &'tcx hir::ForeignItem) { @@ -774,6 +780,8 @@ impl<'a, 'tcx> hir_visit::Visitor<'tcx> for LateContext<'a, 'tcx> { } fn visit_trait_item(&mut self, trait_item: &'tcx hir::TraitItem) { + let generics = self.generics.take(); + self.generics = Some(&trait_item.generics); self.with_lint_attrs(trait_item.id, &trait_item.attrs, |cx| { cx.with_param_env(trait_item.id, |cx| { run_lints!(cx, check_trait_item, late_passes, trait_item); @@ -781,9 +789,12 @@ impl<'a, 'tcx> hir_visit::Visitor<'tcx> for LateContext<'a, 'tcx> { run_lints!(cx, check_trait_item_post, late_passes, trait_item); }); }); + self.generics = generics; } fn visit_impl_item(&mut self, impl_item: &'tcx hir::ImplItem) { + let generics = self.generics.take(); + self.generics = Some(&impl_item.generics); self.with_lint_attrs(impl_item.id, &impl_item.attrs, |cx| { cx.with_param_env(impl_item.id, |cx| { run_lints!(cx, check_impl_item, late_passes, impl_item); @@ -791,6 +802,7 @@ impl<'a, 'tcx> hir_visit::Visitor<'tcx> for LateContext<'a, 'tcx> { run_lints!(cx, check_impl_item_post, late_passes, impl_item); }); }); + self.generics = generics; } fn visit_lifetime(&mut self, lt: &'tcx hir::Lifetime) { @@ -991,6 +1003,7 @@ pub fn check_crate<'a, 'tcx>(tcx: TyCtxt<'a, 'tcx, 'tcx>) { access_levels, lint_sess: LintSession::new(&tcx.sess.lint_store), last_ast_node_with_lint_attrs: ast::CRATE_NODE_ID, + generics: None, }; // Visit the whole crate. |
