diff options
| author | Jonas Schievink <jonas.schievink@ferrous-systems.com> | 2022-01-17 16:52:53 +0100 |
|---|---|---|
| committer | Jonas Schievink <jonas.schievink@ferrous-systems.com> | 2022-01-17 16:52:53 +0100 |
| commit | 8a7f0d920ee09a43309188d9ad79d57b2b93e2be (patch) | |
| tree | 719600baa3f8ebac9742c40da0c713cd52127e88 | |
| parent | 9700addc82111200a2150b9a796f62dd8e600ddf (diff) | |
| download | rust-8a7f0d920ee09a43309188d9ad79d57b2b93e2be.tar.gz rust-8a7f0d920ee09a43309188d9ad79d57b2b93e2be.zip | |
Allow macros to expand to or-patterns
| -rw-r--r-- | crates/hir/src/diagnostics.rs | 1 | ||||
| -rw-r--r-- | crates/hir/src/lib.rs | 7 | ||||
| -rw-r--r-- | crates/ide_diagnostics/src/handlers/missing_match_arms.rs | 30 | ||||
| -rw-r--r-- | crates/parser/src/grammar.rs | 2 |
4 files changed, 33 insertions, 7 deletions
diff --git a/crates/hir/src/diagnostics.rs b/crates/hir/src/diagnostics.rs index 83c6f2c3b8a..16b9a9ea459 100644 --- a/crates/hir/src/diagnostics.rs +++ b/crates/hir/src/diagnostics.rs @@ -164,7 +164,6 @@ pub struct MissingOkOrSomeInTailExpr { pub struct MissingMatchArms { pub file: HirFileId, pub match_expr: AstPtr<ast::Expr>, - pub arms: AstPtr<ast::MatchArmList>, } #[derive(Debug)] diff --git a/crates/hir/src/lib.rs b/crates/hir/src/lib.rs index 4b4eb38336c..d3577552361 100644 --- a/crates/hir/src/lib.rs +++ b/crates/hir/src/lib.rs @@ -1266,17 +1266,14 @@ impl DefWithBody { if let ast::Expr::MatchExpr(match_expr) = &source_ptr.value.to_node(&root) { - if let (Some(match_expr), Some(arms)) = - (match_expr.expr(), match_expr.match_arm_list()) - { + if let Some(match_expr) = match_expr.expr() { acc.push( MissingMatchArms { file: source_ptr.file_id, match_expr: AstPtr::new(&match_expr), - arms: AstPtr::new(&arms), } .into(), - ) + ); } } } diff --git a/crates/ide_diagnostics/src/handlers/missing_match_arms.rs b/crates/ide_diagnostics/src/handlers/missing_match_arms.rs index 6e2764e59ff..6bdcd41a790 100644 --- a/crates/ide_diagnostics/src/handlers/missing_match_arms.rs +++ b/crates/ide_diagnostics/src/handlers/missing_match_arms.rs @@ -900,6 +900,36 @@ fn foo() { ); } + #[test] + fn macro_or_pat() { + check_diagnostics_no_bails( + r#" +macro_rules! m { + () => { + Enum::Type1 | Enum::Type2 + }; +} + +enum Enum { + Type1, + Type2, + Type3, +} + +fn f(ty: Enum) { + match ty { + //^^ error: missing match arm + m!() => (), + } + + match ty { + m!() | Enum::Type3 => () + } +} +"#, + ); + } + mod false_negatives { //! The implementation of match checking here is a work in progress. As we roll this out, we //! prefer false negatives to false positives (ideally there would be no false positives). This diff --git a/crates/parser/src/grammar.rs b/crates/parser/src/grammar.rs index 0240a6f14f6..4efbf9a606e 100644 --- a/crates/parser/src/grammar.rs +++ b/crates/parser/src/grammar.rs @@ -112,7 +112,7 @@ pub(crate) mod entry { pub(crate) fn pattern(p: &mut Parser) { let m = p.start(); - patterns::pattern_single(p); + patterns::pattern_top(p); if p.at(EOF) { m.abandon(p); return; |
