From e78424846eb29a2d25389364a0b866992bfe4f8d Mon Sep 17 00:00:00 2001 From: Aleksey Kladov Date: Sun, 2 Jan 2022 17:32:15 +0300 Subject: [PATCH] enforce parsing invariant for patterns --- .../mbe/tt_conversion.rs | 2 +- crates/parser/src/grammar.rs | 13 +++++++++ crates/parser/src/lib.rs | 2 +- crates/parser/src/tests/top_entries.rs | 27 +++++++++++++++++++ 4 files changed, 42 insertions(+), 2 deletions(-) diff --git a/crates/hir_def/src/macro_expansion_tests/mbe/tt_conversion.rs b/crates/hir_def/src/macro_expansion_tests/mbe/tt_conversion.rs index 97c27c453b0..4c58ea9ba64 100644 --- a/crates/hir_def/src/macro_expansion_tests/mbe/tt_conversion.rs +++ b/crates/hir_def/src/macro_expansion_tests/mbe/tt_conversion.rs @@ -141,7 +141,7 @@ macro_rules! m1 { () => (Some(x) left overs) } macro_rules! m2 { () => ($) } fn main() { - let Some(x) = (); + let Some(x)left overs = (); let /* parse error: expected pattern */ $ = (); } diff --git a/crates/parser/src/grammar.rs b/crates/parser/src/grammar.rs index e1a265d817c..eee9a8c0cd5 100644 --- a/crates/parser/src/grammar.rs +++ b/crates/parser/src/grammar.rs @@ -109,6 +109,19 @@ pub(crate) mod entry { items::mod_contents(p, false); m.complete(p, MACRO_ITEMS); } + + pub(crate) fn pattern(p: &mut Parser) { + let m = p.start(); + patterns::pattern_single(p); + if p.at(EOF) { + m.abandon(p); + return; + } + while !p.at(EOF) { + p.bump_any(); + } + m.complete(p, ERROR); + } } } diff --git a/crates/parser/src/lib.rs b/crates/parser/src/lib.rs index c5014be6c33..5c0e997ea10 100644 --- a/crates/parser/src/lib.rs +++ b/crates/parser/src/lib.rs @@ -119,8 +119,8 @@ impl TopEntryPoint { TopEntryPoint::SourceFile => grammar::entry::top::source_file, TopEntryPoint::MacroStmts => grammar::entry::top::macro_stmts, TopEntryPoint::MacroItems => grammar::entry::top::macro_items, + TopEntryPoint::Pattern => grammar::entry::top::pattern, // FIXME - TopEntryPoint::Pattern => grammar::entry::prefix::pat, TopEntryPoint::Type => grammar::entry::prefix::ty, TopEntryPoint::Expr => grammar::entry::prefix::expr, TopEntryPoint::MetaItem => grammar::entry::prefix::meta_item, diff --git a/crates/parser/src/tests/top_entries.rs b/crates/parser/src/tests/top_entries.rs index fa25ffd0a26..48359150638 100644 --- a/crates/parser/src/tests/top_entries.rs +++ b/crates/parser/src/tests/top_entries.rs @@ -146,6 +146,33 @@ fn macro_pattern() { R_PAREN ")" "#]], ); + + check( + TopEntryPoint::Pattern, + "None leftover tokens", + expect![[r#" + ERROR + IDENT_PAT + NAME + IDENT "None" + WHITESPACE " " + IDENT "leftover" + WHITESPACE " " + IDENT "tokens" + "#]], + ); + + check( + TopEntryPoint::Pattern, + "@err", + expect![[r#" + ERROR + ERROR + AT "@" + IDENT "err" + error 0: expected pattern + "#]], + ); } #[track_caller]