mirror of
https://github.com/rust-lang/rust.git
synced 2024-12-13 00:56:14 +00:00
Fix match on vec items: match on vec[..]
- Added new tests - Fixed false positive when matching on full range, which will never panic
This commit is contained in:
parent
991efa6375
commit
e7138e0629
@ -1,4 +1,4 @@
|
|||||||
use crate::utils::{is_type_diagnostic_item, snippet, span_lint_and_sugg, walk_ptrs_ty};
|
use crate::utils::{is_type_diagnostic_item, match_type, snippet, span_lint_and_sugg, walk_ptrs_ty};
|
||||||
use if_chain::if_chain;
|
use if_chain::if_chain;
|
||||||
use rustc_errors::Applicability;
|
use rustc_errors::Applicability;
|
||||||
use rustc_hir::{Expr, ExprKind, MatchSource};
|
use rustc_hir::{Expr, ExprKind, MatchSource};
|
||||||
@ -75,10 +75,9 @@ impl<'a, 'tcx> LateLintPass<'a, 'tcx> for MatchOnVecItems {
|
|||||||
|
|
||||||
fn is_vec_indexing<'a, 'tcx>(cx: &LateContext<'a, 'tcx>, expr: &'tcx Expr<'tcx>) -> Option<&'tcx Expr<'tcx>> {
|
fn is_vec_indexing<'a, 'tcx>(cx: &LateContext<'a, 'tcx>, expr: &'tcx Expr<'tcx>) -> Option<&'tcx Expr<'tcx>> {
|
||||||
if_chain! {
|
if_chain! {
|
||||||
if let ExprKind::Index(ref array, _) = expr.kind;
|
if let ExprKind::Index(ref array, ref index) = expr.kind;
|
||||||
let ty = cx.tables.expr_ty(array);
|
if is_vector(cx, array);
|
||||||
let ty = walk_ptrs_ty(ty);
|
if !is_full_range(cx, index);
|
||||||
if is_type_diagnostic_item(cx, ty, sym!(vec_type));
|
|
||||||
|
|
||||||
then {
|
then {
|
||||||
return Some(expr);
|
return Some(expr);
|
||||||
@ -87,3 +86,15 @@ fn is_vec_indexing<'a, 'tcx>(cx: &LateContext<'a, 'tcx>, expr: &'tcx Expr<'tcx>)
|
|||||||
|
|
||||||
None
|
None
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fn is_vector(cx: &LateContext<'_, '_>, expr: &Expr<'_>) -> bool {
|
||||||
|
let ty = cx.tables.expr_ty(expr);
|
||||||
|
let ty = walk_ptrs_ty(ty);
|
||||||
|
is_type_diagnostic_item(cx, ty, sym!(vec_type))
|
||||||
|
}
|
||||||
|
|
||||||
|
fn is_full_range(cx: &LateContext<'_, '_>, expr: &Expr<'_>) -> bool {
|
||||||
|
let ty = cx.tables.expr_ty(expr);
|
||||||
|
let ty = walk_ptrs_ty(ty);
|
||||||
|
match_type(cx, ty, &["core", "ops", "range", "RangeFull"])
|
||||||
|
}
|
||||||
|
@ -120,6 +120,27 @@ fn match_with_array() {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fn match_with_endless_range() {
|
||||||
|
let arr = vec![0, 1, 2, 3];
|
||||||
|
let range = ..;
|
||||||
|
|
||||||
|
// Ok
|
||||||
|
match arr[range] {
|
||||||
|
[0, 1] => println!("0 1"),
|
||||||
|
[1, 2] => println!("1 2"),
|
||||||
|
[0, 1, 2, 3] => println!("0, 1, 2, 3"),
|
||||||
|
_ => {},
|
||||||
|
}
|
||||||
|
|
||||||
|
// Ok
|
||||||
|
match arr[..] {
|
||||||
|
[0, 1] => println!("0 1"),
|
||||||
|
[1, 2] => println!("1 2"),
|
||||||
|
[0, 1, 2, 3] => println!("0, 1, 2, 3"),
|
||||||
|
_ => {},
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
fn main() {
|
fn main() {
|
||||||
match_with_wildcard();
|
match_with_wildcard();
|
||||||
match_without_wildcard();
|
match_without_wildcard();
|
||||||
@ -127,4 +148,5 @@ fn main() {
|
|||||||
match_vec_ref();
|
match_vec_ref();
|
||||||
match_with_get();
|
match_with_get();
|
||||||
match_with_array();
|
match_with_array();
|
||||||
|
match_with_endless_range();
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user