Update lints for latest nightly.

This commit is contained in:
Sergio Benitez 2017-09-04 19:41:08 -07:00
parent 74805df1fc
commit 35589738a1
3 changed files with 26 additions and 17 deletions

View File

@ -8,8 +8,8 @@ use yansi::Color::{Red, Yellow, Blue, White};
use version_check::{supports_features, is_min_version, is_min_date}; use version_check::{supports_features, is_min_version, is_min_date};
// Specifies the minimum nightly version needed to compile Rocket's codegen. // Specifies the minimum nightly version needed to compile Rocket's codegen.
const MIN_DATE: &'static str = "2017-08-10"; const MIN_DATE: &'static str = "2017-09-01";
const MIN_VERSION: &'static str = "1.21.0-nightly"; const MIN_VERSION: &'static str = "1.22.0-nightly";
fn main() { fn main() {
let ok_channel = supports_features(); let ok_channel = supports_features();

View File

@ -37,13 +37,15 @@ struct InstanceInfo {
enum Receiver { enum Receiver {
Instance(DefId, Span), Instance(DefId, Span),
Call(NodeId, Span), Call(NodeId, Span),
Relative(Span),
} }
impl Receiver { impl Receiver {
/// Returns the span associated with the receiver. /// Returns the span associated with the receiver.
pub fn span(&self) -> Span { pub fn span(&self) -> Span {
use self::Receiver::*;
match *self { match *self {
Receiver::Instance(_, sp) | Receiver::Call(_, sp) => sp Instance(_, sp) | Call(_, sp) | Relative(sp) => sp
} }
} }
} }
@ -142,9 +144,9 @@ impl<'a, 'tcx> LateLintPass<'a, 'tcx> for RocketLint {
// the receiver in the type table we've constructed. If it's there, we use // the receiver in the type table we've constructed. If it's there, we use
// it, if not, we use the call as the receiver. // it, if not, we use the call as the receiver.
fn check_expr(&mut self, cx: &LateContext<'a, 'tcx>, expr: &'tcx Expr) { fn check_expr(&mut self, cx: &LateContext<'a, 'tcx>, expr: &'tcx Expr) {
/// Fetches the top-level `Receiver` instance given that a method call // Fetches the top-level `Receiver` instance given that a method call
/// was made to the receiver `rexpr`. Top-level here means "the // was made to the receiver `rexpr`. Top-level here means "the
/// original". We search the `instance_vars` table to retrieve it. // original". We search the `instance_vars` table to retrieve it.
let instance_for = |lint: &mut RocketLint, rexpr: &Expr| -> Option<Receiver> { let instance_for = |lint: &mut RocketLint, rexpr: &Expr| -> Option<Receiver> {
match rexpr.node { match rexpr.node {
ExprPath(QPath::Resolved(_, ref p)) => { ExprPath(QPath::Resolved(_, ref p)) => {
@ -152,8 +154,11 @@ impl<'a, 'tcx> LateLintPass<'a, 'tcx> for RocketLint {
.and_then(|id| lint.instance_vars.get(&id)) .and_then(|id| lint.instance_vars.get(&id))
.map(|recvr| recvr.clone()) .map(|recvr| recvr.clone())
} }
ExprPath(QPath::TypeRelative(_, _)) => {
Some(Receiver::Relative(rexpr.span))
}
ExprCall(ref c, ..) => Some(Receiver::Call(c.id, rexpr.span)), ExprCall(ref c, ..) => Some(Receiver::Call(c.id, rexpr.span)),
_ => unreachable!() _ => panic!("Unexpected node: {:?}", rexpr.node)
} }
}; };
@ -256,7 +261,8 @@ impl<'a, 'tcx> LateLintPass<'a, 'tcx> for RocketLint {
// Collect all of the `State` types and spans into `tys` and `spans`. // Collect all of the `State` types and spans into `tys` and `spans`.
let mut ty_and_spans: Vec<(Ty<'static>, Span)> = vec![]; let mut ty_and_spans: Vec<(Ty<'static>, Span)> = vec![];
if let Some(sig) = cx.tables.liberated_fn_sigs.get(&fn_id) { let fn_hir_id = cx.tcx.hir.node_to_hir_id(fn_id);
if let Some(sig) = cx.tables.liberated_fn_sigs().get(fn_hir_id) {
for (i, input_ty) in sig.inputs().iter().enumerate() { for (i, input_ty) in sig.inputs().iter().enumerate() {
let def_id = match input_ty.ty_to_def_id() { let def_id = match input_ty.ty_to_def_id() {
Some(id) => id, Some(id) => id,

View File

@ -46,8 +46,9 @@ pub fn match_def_path(tcx: ty::TyCtxt, def_id: DefId, path: &[&str]) -> bool {
/// Check if the method call given in `expr` belongs to given type. /// Check if the method call given in `expr` belongs to given type.
pub fn is_impl_method(cx: &LateContext, expr: &Expr, path: &[&str]) -> bool { pub fn is_impl_method(cx: &LateContext, expr: &Expr, path: &[&str]) -> bool {
cx.tables.type_dependent_defs let hir_id = cx.tcx.hir.node_to_hir_id(expr.id);
.get(&expr.id) cx.tables.type_dependent_defs()
.get(hir_id)
.and_then(|callee| cx.tcx.impl_of_method(callee.def_id())) .and_then(|callee| cx.tcx.impl_of_method(callee.def_id()))
.map(|trt_id| match_def_path(cx.tcx, trt_id, path)) .map(|trt_id| match_def_path(cx.tcx, trt_id, path))
.unwrap_or(false) .unwrap_or(false)
@ -82,7 +83,8 @@ pub fn rocket_method_call<'e>(method: &str,
pub fn is_rocket_start_call(cx: &LateContext, expr: &Expr) -> bool { pub fn is_rocket_start_call(cx: &LateContext, expr: &Expr) -> bool {
if let ExprCall(ref expr, ..) = expr.node { if let ExprCall(ref expr, ..) = expr.node {
if let ExprPath(ref qpath) = expr.node { if let ExprPath(ref qpath) = expr.node {
let def_id = cx.tables.qpath_def(qpath, expr.id).def_id(); let hir_id = cx.tcx.hir.node_to_hir_id(expr.id);
let def_id = cx.tables.qpath_def(qpath, hir_id).def_id();
if match_def_path(cx.tcx, def_id, ROCKET_IGNITE_FN) { if match_def_path(cx.tcx, def_id, ROCKET_IGNITE_FN) {
return true; return true;
} else if match_def_path(cx.tcx, def_id, ROCKET_IGNITE_STATIC) { } else if match_def_path(cx.tcx, def_id, ROCKET_IGNITE_STATIC) {
@ -116,7 +118,8 @@ pub fn extract_mount_fn_def_ids(cx: &LateContext, expr: &Expr) -> Vec<DefId> {
if let ExprAddrOf(_, ref expr) = args[0].node { if let ExprAddrOf(_, ref expr) = args[0].node {
// path to info_struct // path to info_struct
if let ExprPath(ref qpath) = expr.node { if let ExprPath(ref qpath) = expr.node {
let def = cx.tables.qpath_def(qpath, expr.id); let hir_id = cx.tcx.hir.node_to_hir_id(expr.id);
let def = cx.tables.qpath_def(qpath, hir_id);
output.push(def.def_id()); output.push(def.def_id());
} }
} }
@ -167,11 +170,11 @@ pub fn msg_and_help<'a, T: LintContext<'a>>(cx: &T,
note: &str, note: &str,
help_sp: Option<Span>, help_sp: Option<Span>,
help: &str) { help: &str) {
let mut b = cx.struct_span_lint(lint, msg_sp, msg); // Be conservative. If we don't know the receiver, don't emit the warning.
b.note(note);
if let Some(span) = help_sp { if let Some(span) = help_sp {
b.span_help(span, help); cx.struct_span_lint(lint, msg_sp, msg)
.note(note)
.span_help(span, help)
.emit()
} }
b.emit();
} }