use rustc::lint::*;
use rustc::hir;
-use rustc::hir::intravisit::{FnKind, Visitor, walk_expr, walk_fn, NestedVisitorMap};
+use rustc::hir::intravisit::{walk_expr, walk_fn, FnKind, NestedVisitorMap, Visitor};
use std::collections::HashMap;
use syntax::ast;
use syntax::codemap::Span;
-use syntax::symbol::InternedString;
-use utils::{in_macro, span_lint};
+use syntax::symbol::LocalInternedString;
+use crate::utils::{in_macro, span_lint};
/// **What it does:** Checks for unused labels.
///
/// if i > 4 { continue }
/// }
/// ```
-declare_lint! {
+declare_clippy_lint! {
pub UNUSED_LABEL,
- Warn,
+ complexity,
"unused labels"
}
pub struct UnusedLabel;
struct UnusedLabelVisitor<'a, 'tcx: 'a> {
- labels: HashMap<InternedString, Span>,
+ labels: HashMap<LocalInternedString, Span>,
cx: &'a LateContext<'a, 'tcx>,
}
decl: &'tcx hir::FnDecl,
body: &'tcx hir::Body,
span: Span,
- fn_id: ast::NodeId
+ fn_id: ast::NodeId,
) {
- if in_macro(cx, span) {
+ if in_macro(span) {
return;
}
let mut v = UnusedLabelVisitor {
- cx: cx,
+ cx,
labels: HashMap::new(),
};
walk_fn(&mut v, kind, decl, body.id(), span, fn_id);
impl<'a, 'tcx: 'a> Visitor<'tcx> for UnusedLabelVisitor<'a, 'tcx> {
fn visit_expr(&mut self, expr: &'tcx hir::Expr) {
match expr.node {
- hir::ExprBreak(Some(label), _) |
- hir::ExprAgain(Some(label)) => {
- self.labels.remove(&label.name.as_str());
+ hir::ExprBreak(destination, _) | hir::ExprContinue(destination) => if let Some(label) = destination.label {
+ self.labels.remove(&label.ident.as_str());
},
- hir::ExprLoop(_, Some(label), _) |
- hir::ExprWhile(_, _, Some(label)) => {
- self.labels.insert(label.node.as_str(), expr.span);
+ hir::ExprLoop(_, Some(label), _) | hir::ExprWhile(_, _, Some(label)) => {
+ self.labels.insert(label.ident.as_str(), expr.span);
},
_ => (),
}
walk_expr(self, expr);
}
fn nested_visit_map<'this>(&'this mut self) -> NestedVisitorMap<'this, 'tcx> {
- NestedVisitorMap::All(&self.cx.tcx.map)
+ NestedVisitorMap::All(&self.cx.tcx.hir)
}
}