mirror of
https://github.com/rust-lang/rust.git
synced 2025-02-23 04:14:28 +00:00
Rewrite ...
as ..=
as a MachineApplicable 2018 idiom lint
This commit is contained in:
parent
8315b11b63
commit
c148714549
@ -1020,9 +1020,12 @@ impl<'a> ast_visit::Visitor<'a> for EarlyContext<'a> {
|
|||||||
}
|
}
|
||||||
|
|
||||||
fn visit_pat(&mut self, p: &'a ast::Pat) {
|
fn visit_pat(&mut self, p: &'a ast::Pat) {
|
||||||
run_lints!(self, check_pat, p);
|
let mut visit_subpats = true;
|
||||||
|
run_lints!(self, check_pat, p, &mut visit_subpats);
|
||||||
self.check_id(p.id);
|
self.check_id(p.id);
|
||||||
ast_visit::walk_pat(self, p);
|
if visit_subpats {
|
||||||
|
ast_visit::walk_pat(self, p);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
fn visit_expr(&mut self, e: &'a ast::Expr) {
|
fn visit_expr(&mut self, e: &'a ast::Expr) {
|
||||||
|
@ -341,7 +341,7 @@ pub trait EarlyLintPass: LintPass {
|
|||||||
fn check_block_post(&mut self, _: &EarlyContext<'_>, _: &ast::Block) { }
|
fn check_block_post(&mut self, _: &EarlyContext<'_>, _: &ast::Block) { }
|
||||||
fn check_stmt(&mut self, _: &EarlyContext<'_>, _: &ast::Stmt) { }
|
fn check_stmt(&mut self, _: &EarlyContext<'_>, _: &ast::Stmt) { }
|
||||||
fn check_arm(&mut self, _: &EarlyContext<'_>, _: &ast::Arm) { }
|
fn check_arm(&mut self, _: &EarlyContext<'_>, _: &ast::Arm) { }
|
||||||
fn check_pat(&mut self, _: &EarlyContext<'_>, _: &ast::Pat) { }
|
fn check_pat(&mut self, _: &EarlyContext<'_>, _: &ast::Pat, _: &mut bool) { }
|
||||||
fn check_expr(&mut self, _: &EarlyContext<'_>, _: &ast::Expr) { }
|
fn check_expr(&mut self, _: &EarlyContext<'_>, _: &ast::Expr) { }
|
||||||
fn check_expr_post(&mut self, _: &EarlyContext<'_>, _: &ast::Expr) { }
|
fn check_expr_post(&mut self, _: &EarlyContext<'_>, _: &ast::Expr) { }
|
||||||
fn check_ty(&mut self, _: &EarlyContext<'_>, _: &ast::Ty) { }
|
fn check_ty(&mut self, _: &EarlyContext<'_>, _: &ast::Ty) { }
|
||||||
|
@ -40,6 +40,8 @@ use rustc::util::nodemap::FxHashSet;
|
|||||||
|
|
||||||
use syntax::tokenstream::{TokenTree, TokenStream};
|
use syntax::tokenstream::{TokenTree, TokenStream};
|
||||||
use syntax::ast;
|
use syntax::ast;
|
||||||
|
use syntax::ptr::P;
|
||||||
|
use syntax::ast::Expr;
|
||||||
use syntax::attr;
|
use syntax::attr;
|
||||||
use syntax::source_map::Spanned;
|
use syntax::source_map::Spanned;
|
||||||
use syntax::edition::Edition;
|
use syntax::edition::Edition;
|
||||||
@ -47,6 +49,7 @@ use syntax::feature_gate::{AttributeGate, AttributeType, Stability, deprecated_a
|
|||||||
use syntax_pos::{BytePos, Span, SyntaxContext};
|
use syntax_pos::{BytePos, Span, SyntaxContext};
|
||||||
use syntax::symbol::keywords;
|
use syntax::symbol::keywords;
|
||||||
use syntax::errors::{Applicability, DiagnosticBuilder};
|
use syntax::errors::{Applicability, DiagnosticBuilder};
|
||||||
|
use syntax::print::pprust::expr_to_string;
|
||||||
|
|
||||||
use rustc::hir::{self, GenericParamKind, PatKind};
|
use rustc::hir::{self, GenericParamKind, PatKind};
|
||||||
use rustc::hir::intravisit::FnKind;
|
use rustc::hir::intravisit::FnKind;
|
||||||
@ -1407,21 +1410,42 @@ impl LintPass for EllipsisInclusiveRangePatterns {
|
|||||||
}
|
}
|
||||||
|
|
||||||
impl EarlyLintPass for EllipsisInclusiveRangePatterns {
|
impl EarlyLintPass for EllipsisInclusiveRangePatterns {
|
||||||
fn check_pat(&mut self, cx: &EarlyContext, pat: &ast::Pat) {
|
fn check_pat(&mut self, cx: &EarlyContext, pat: &ast::Pat, visit_subpats: &mut bool) {
|
||||||
use self::ast::{PatKind, RangeEnd, RangeSyntax};
|
use self::ast::{PatKind, RangeEnd, RangeSyntax::DotDotDot};
|
||||||
|
|
||||||
if let PatKind::Range(
|
/// If `pat` is a `...` pattern, return the start and end of the range, as well as the span
|
||||||
_, _, Spanned { span, node: RangeEnd::Included(RangeSyntax::DotDotDot) }
|
/// corresponding to the ellipsis.
|
||||||
) = pat.node {
|
fn matches_ellipsis_pat(pat: &ast::Pat) -> Option<(&P<Expr>, &P<Expr>, Span)> {
|
||||||
|
match &pat.node {
|
||||||
|
PatKind::Range(a, b, Spanned { span, node: RangeEnd::Included(DotDotDot), .. }) => {
|
||||||
|
Some((a, b, *span))
|
||||||
|
}
|
||||||
|
_ => None,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
let (parenthesise, endpoints) = match &pat.node {
|
||||||
|
PatKind::Ref(subpat, _) => (true, matches_ellipsis_pat(&subpat)),
|
||||||
|
_ => (false, matches_ellipsis_pat(pat)),
|
||||||
|
};
|
||||||
|
|
||||||
|
if let Some((start, end, join)) = endpoints {
|
||||||
let msg = "`...` range patterns are deprecated";
|
let msg = "`...` range patterns are deprecated";
|
||||||
|
let suggestion = "use `..=` for an inclusive range";
|
||||||
|
let (span, replacement) = if parenthesise {
|
||||||
|
*visit_subpats = false;
|
||||||
|
(pat.span, format!("&({}..={})", expr_to_string(&start), expr_to_string(&end)))
|
||||||
|
} else {
|
||||||
|
(join, "..=".to_owned())
|
||||||
|
};
|
||||||
let mut err = cx.struct_span_lint(ELLIPSIS_INCLUSIVE_RANGE_PATTERNS, span, msg);
|
let mut err = cx.struct_span_lint(ELLIPSIS_INCLUSIVE_RANGE_PATTERNS, span, msg);
|
||||||
err.span_suggestion_short_with_applicability(
|
err.span_suggestion_short_with_applicability(
|
||||||
span, "use `..=` for an inclusive range", "..=".to_owned(),
|
span,
|
||||||
// FIXME: outstanding problem with precedence in ref patterns:
|
suggestion,
|
||||||
// https://github.com/rust-lang/rust/issues/51043#issuecomment-392252285
|
replacement,
|
||||||
Applicability::MaybeIncorrect
|
Applicability::MachineApplicable,
|
||||||
);
|
);
|
||||||
err.emit()
|
err.emit();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -396,12 +396,12 @@ impl EarlyLintPass for UnusedParens {
|
|||||||
self.check_unused_parens_expr(cx, &value, msg, followed_by_block);
|
self.check_unused_parens_expr(cx, &value, msg, followed_by_block);
|
||||||
}
|
}
|
||||||
|
|
||||||
fn check_pat(&mut self, cx: &EarlyContext, p: &ast::Pat) {
|
fn check_pat(&mut self, cx: &EarlyContext, p: &ast::Pat, _: &mut bool) {
|
||||||
use ast::PatKind::{Paren, Range};
|
use ast::PatKind::{Paren, Range};
|
||||||
// The lint visitor will visit each subpattern of `p`. We do not want to lint any range
|
// The lint visitor will visit each subpattern of `p`. We do not want to lint any range
|
||||||
// pattern no matter where it occurs in the pattern. For something like `&(a..=b)`, there
|
// pattern no matter where it occurs in the pattern. For something like `&(a..=b)`, there
|
||||||
// is a recursive `check_pat` on `a` and `b`, but we will assume that if there are
|
// is a recursive `check_pat` on `a` and `b`, but we will assume that if there are
|
||||||
// unnecessry parens they serve a purpose of readability.
|
// unnecessary parens they serve a purpose of readability.
|
||||||
if let Paren(ref pat) = p.node {
|
if let Paren(ref pat) = p.node {
|
||||||
match pat.node {
|
match pat.node {
|
||||||
Range(..) => {}
|
Range(..) => {}
|
||||||
|
@ -20,4 +20,10 @@ fn main() {
|
|||||||
//~^ WARN `...` range patterns are deprecated
|
//~^ WARN `...` range patterns are deprecated
|
||||||
_ => {}
|
_ => {}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
match &despondency {
|
||||||
|
&(1..=2) => {}
|
||||||
|
//~^ WARN `...` range patterns are deprecated
|
||||||
|
_ => {}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@ -20,4 +20,10 @@ fn main() {
|
|||||||
//~^ WARN `...` range patterns are deprecated
|
//~^ WARN `...` range patterns are deprecated
|
||||||
_ => {}
|
_ => {}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
match &despondency {
|
||||||
|
&1...2 => {}
|
||||||
|
//~^ WARN `...` range patterns are deprecated
|
||||||
|
_ => {}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@ -10,3 +10,9 @@ note: lint level defined here
|
|||||||
LL | #![warn(ellipsis_inclusive_range_patterns)]
|
LL | #![warn(ellipsis_inclusive_range_patterns)]
|
||||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||||
|
|
||||||
|
warning: `...` range patterns are deprecated
|
||||||
|
--> $DIR/inclusive-range-pattern-syntax.rs:25:9
|
||||||
|
|
|
||||||
|
LL | &1...2 => {}
|
||||||
|
| ^^^^^^ help: use `..=` for an inclusive range
|
||||||
|
|
||||||
|
@ -11,10 +11,10 @@ LL | box 10..=15 => {}
|
|||||||
| ^^^^^^^ help: add parentheses to clarify the precedence: `(10 ..=15)`
|
| ^^^^^^^ help: add parentheses to clarify the precedence: `(10 ..=15)`
|
||||||
|
|
||||||
warning: `...` range patterns are deprecated
|
warning: `...` range patterns are deprecated
|
||||||
--> $DIR/range-inclusive-pattern-precedence.rs:24:11
|
--> $DIR/range-inclusive-pattern-precedence.rs:24:9
|
||||||
|
|
|
|
||||||
LL | &0...9 => {}
|
LL | &0...9 => {}
|
||||||
| ^^^ help: use `..=` for an inclusive range
|
| ^^^^^^ help: use `..=` for an inclusive range
|
||||||
|
|
|
|
||||||
note: lint level defined here
|
note: lint level defined here
|
||||||
--> $DIR/range-inclusive-pattern-precedence.rs:19:9
|
--> $DIR/range-inclusive-pattern-precedence.rs:19:9
|
||||||
|
Loading…
Reference in New Issue
Block a user