Put leading | in patterns under OrPat

Previously it was one level above, and that caused problems with macros that expand to it, because macros expect to get only one top-level node.
This commit is contained in:
Chayim Refael Friedman 2024-10-27 05:08:49 +02:00
parent 6a67a4d3cd
commit e12a001b55
11 changed files with 87 additions and 31 deletions

View file

@ -21,7 +21,8 @@ const RANGE_PAT_END_FIRST: TokenSet =
expressions::LITERAL_FIRST.union(paths::PATH_FIRST).union(TokenSet::new(&[T![-], T![const]]));
pub(crate) fn pattern(p: &mut Parser<'_>) {
pattern_r(p, PAT_RECOVERY_SET);
let m = p.start();
pattern_r(p, m, false, PAT_RECOVERY_SET);
}
/// Parses a pattern list separated by pipes `|`.
@ -36,8 +37,9 @@ pub(crate) fn pattern_single(p: &mut Parser<'_>) {
/// Parses a pattern list separated by pipes `|`
/// using the given `recovery_set`.
pub(super) fn pattern_top_r(p: &mut Parser<'_>, recovery_set: TokenSet) {
p.eat(T![|]);
pattern_r(p, recovery_set);
let m = p.start();
let has_leading_pipe = p.eat(T![|]);
pattern_r(p, m, has_leading_pipe, recovery_set);
}
// test or_pattern
@ -51,11 +53,10 @@ pub(super) fn pattern_top_r(p: &mut Parser<'_>, recovery_set: TokenSet) {
// }
/// Parses a pattern list separated by pipes `|`, with no leading `|`,using the
/// given `recovery_set`.
fn pattern_r(p: &mut Parser<'_>, recovery_set: TokenSet) {
let m = p.start();
fn pattern_r(p: &mut Parser<'_>, m: Marker, has_leading_pipe: bool, recovery_set: TokenSet) {
pattern_single_r(p, recovery_set);
if !p.at(T![|]) {
if !p.at(T![|]) && !has_leading_pipe {
m.abandon(p);
return;
}

View file

@ -195,6 +195,38 @@ fn macro_pattern() {
error 0: expected pattern
"#]],
);
check(
TopEntryPoint::Pattern,
"| 42 | 43",
expect![[r#"
OR_PAT
PIPE "|"
WHITESPACE " "
LITERAL_PAT
LITERAL
INT_NUMBER "42"
WHITESPACE " "
PIPE "|"
WHITESPACE " "
LITERAL_PAT
LITERAL
INT_NUMBER "43"
"#]],
);
check(
TopEntryPoint::Pattern,
"| 42",
expect![[r#"
OR_PAT
PIPE "|"
WHITESPACE " "
LITERAL_PAT
LITERAL
INT_NUMBER "42"
"#]],
);
}
#[test]

View file

@ -102,9 +102,9 @@ SOURCE_FILE
COMMA ","
WHITESPACE "\n "
MATCH_ARM
PIPE "|"
WHITESPACE " "
OR_PAT
PIPE "|"
WHITESPACE " "
IDENT_PAT
NAME
IDENT "X"
@ -132,11 +132,12 @@ SOURCE_FILE
COMMA ","
WHITESPACE "\n "
MATCH_ARM
PIPE "|"
WHITESPACE " "
IDENT_PAT
NAME
IDENT "X"
OR_PAT
PIPE "|"
WHITESPACE " "
IDENT_PAT
NAME
IDENT "X"
WHITESPACE " "
FAT_ARROW "=>"
WHITESPACE " "

View file

@ -43,11 +43,12 @@ SOURCE_FILE
WHITESPACE " "
SLICE_PAT
L_BRACK "["
PIPE "|"
WHITESPACE " "
IDENT_PAT
NAME
IDENT "a"
OR_PAT
PIPE "|"
WHITESPACE " "
IDENT_PAT
NAME
IDENT "a"
COMMA ","
WHITESPACE " "
REST_PAT

View file

@ -91,9 +91,9 @@ SOURCE_FILE
WHITESPACE " "
TUPLE_PAT
L_PAREN "("
PIPE "|"
WHITESPACE " "
OR_PAT
PIPE "|"
WHITESPACE " "
IDENT_PAT
NAME
IDENT "a"
@ -105,11 +105,12 @@ SOURCE_FILE
IDENT "a"
COMMA ","
WHITESPACE " "
PIPE "|"
WHITESPACE " "
IDENT_PAT
NAME
IDENT "b"
OR_PAT
PIPE "|"
WHITESPACE " "
IDENT_PAT
NAME
IDENT "b"
R_PAREN ")"
WHITESPACE " "
EQ "="

View file

@ -110,11 +110,12 @@ SOURCE_FILE
NAME_REF
IDENT "S"
L_PAREN "("
PIPE "|"
WHITESPACE " "
IDENT_PAT
NAME
IDENT "a"
OR_PAT
PIPE "|"
WHITESPACE " "
IDENT_PAT
NAME
IDENT "a"
R_PAREN ")"
WHITESPACE " "
EQ "="