Skip to content

Commit

Permalink
Remove visit_subpats from check_pat in favor of state in EllipsisIncl…
Browse files Browse the repository at this point in the history
…usiveRangePatterns
  • Loading branch information
Tomas Koutsky committed Apr 22, 2019
1 parent 6d59933 commit 1dc13b5
Show file tree
Hide file tree
Showing 5 changed files with 37 additions and 11 deletions.
8 changes: 3 additions & 5 deletions src/librustc/lint/context.rs
Expand Up @@ -1164,12 +1164,10 @@ impl<'a, T: EarlyLintPass> ast_visit::Visitor<'a> for EarlyContextAndPass<'a, T>
}

fn visit_pat(&mut self, p: &'a ast::Pat) {
let mut visit_subpats = true;
run_early_pass!(self, check_pat, p, &mut visit_subpats);
run_early_pass!(self, check_pat, p);
self.check_id(p.id);
if visit_subpats {
ast_visit::walk_pat(self, p);
}
ast_visit::walk_pat(self, p);
run_early_pass!(self, check_pat_post, p);
}

fn visit_expr(&mut self, e: &'a ast::Expr) {
Expand Down
3 changes: 2 additions & 1 deletion src/librustc/lint/mod.rs
Expand Up @@ -371,7 +371,8 @@ macro_rules! early_lint_methods {
fn check_block_post(a: &ast::Block);
fn check_stmt(a: &ast::Stmt);
fn check_arm(a: &ast::Arm);
fn check_pat(a: &ast::Pat, b: &mut bool); // FIXME: &mut bool looks just broken
fn check_pat(a: &ast::Pat);
fn check_pat_post(a: &ast::Pat);
fn check_expr(a: &ast::Expr);
fn check_expr_post(a: &ast::Expr);
fn check_ty(a: &ast::Ty);
Expand Down
33 changes: 30 additions & 3 deletions src/librustc_lint/builtin.rs
Expand Up @@ -1285,10 +1285,29 @@ declare_lint! {
"`...` range patterns are deprecated"
}

declare_lint_pass!(EllipsisInclusiveRangePatterns => [ELLIPSIS_INCLUSIVE_RANGE_PATTERNS]);
pub struct EllipsisInclusiveRangePatterns {
/// If `Some(_)`, suppress all subsequent pattern
/// warnings for better diagnostics.
node_id: Option<ast::NodeId>,
}

impl_lint_pass!(EllipsisInclusiveRangePatterns => [ELLIPSIS_INCLUSIVE_RANGE_PATTERNS]);

impl EllipsisInclusiveRangePatterns {
pub fn new() -> Self {
Self {
node_id: None,
}
}
}

impl EarlyLintPass for EllipsisInclusiveRangePatterns {
fn check_pat(&mut self, cx: &EarlyContext<'_>, pat: &ast::Pat, visit_subpats: &mut bool) {
fn check_pat(&mut self, cx: &EarlyContext<'_>, pat: &ast::Pat) {
if self.node_id.is_some() {
// Don't recursively warn about patterns inside range endpoints.
return
}

use self::ast::{PatKind, RangeEnd, RangeSyntax::DotDotDot};

/// If `pat` is a `...` pattern, return the start and end of the range, as well as the span
Expand All @@ -1311,7 +1330,7 @@ impl EarlyLintPass for EllipsisInclusiveRangePatterns {
let msg = "`...` range patterns are deprecated";
let suggestion = "use `..=` for an inclusive range";
if parenthesise {
*visit_subpats = false;
self.node_id = Some(pat.id);
let mut err = cx.struct_span_lint(ELLIPSIS_INCLUSIVE_RANGE_PATTERNS, pat.span, msg);
err.span_suggestion(
pat.span,
Expand All @@ -1332,6 +1351,14 @@ impl EarlyLintPass for EllipsisInclusiveRangePatterns {
};
}
}

fn check_pat_post(&mut self, _cx: &EarlyContext<'_>, pat: &ast::Pat) {
if let Some(node_id) = self.node_id {
if pat.id == node_id {
self.node_id = None
}
}
}
}

declare_lint! {
Expand Down
2 changes: 1 addition & 1 deletion src/librustc_lint/lib.rs
Expand Up @@ -94,7 +94,7 @@ macro_rules! early_lint_passes {
UnusedImportBraces: UnusedImportBraces,
UnsafeCode: UnsafeCode,
AnonymousParameters: AnonymousParameters,
EllipsisInclusiveRangePatterns: EllipsisInclusiveRangePatterns,
EllipsisInclusiveRangePatterns: EllipsisInclusiveRangePatterns::new(),
NonCamelCaseTypes: NonCamelCaseTypes,
DeprecatedAttr: DeprecatedAttr::new(),
]);
Expand Down
2 changes: 1 addition & 1 deletion src/librustc_lint/unused.rs
Expand Up @@ -407,7 +407,7 @@ impl EarlyLintPass for UnusedParens {
self.check_unused_parens_expr(cx, &value, msg, followed_by_block);
}

fn check_pat(&mut self, cx: &EarlyContext<'_>, p: &ast::Pat, _: &mut bool) {
fn check_pat(&mut self, cx: &EarlyContext<'_>, p: &ast::Pat) {
use ast::PatKind::{Paren, 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
Expand Down

0 comments on commit 1dc13b5

Please sign in to comment.