Unnamed repository; edit this file 'description' to name the repository.
Diffstat (limited to 'crates/parser/src/grammar/patterns.rs')
-rw-r--r--crates/parser/src/grammar/patterns.rs14
1 files changed, 14 insertions, 0 deletions
diff --git a/crates/parser/src/grammar/patterns.rs b/crates/parser/src/grammar/patterns.rs
index 5726f085a0..29fa11720a 100644
--- a/crates/parser/src/grammar/patterns.rs
+++ b/crates/parser/src/grammar/patterns.rs
@@ -12,6 +12,7 @@ pub(super) const PATTERN_FIRST: TokenSet =
T![_],
T![-],
T![.],
+ T![!],
]));
const PAT_TOP_FIRST: TokenSet = PATTERN_FIRST.union(TokenSet::new(&[T![|]]));
@@ -256,6 +257,7 @@ fn atom_pat(p: &mut Parser<'_>, recovery_set: TokenSet) -> Option<CompletedMarke
T![&] => ref_pat(p),
T!['('] => tuple_pat(p),
T!['['] => slice_pat(p),
+ T![!] => not_null_pat(p),
_ => {
p.err_recover("expected pattern", recovery_set);
@@ -435,6 +437,18 @@ fn ref_pat(p: &mut Parser<'_>) -> CompletedMarker {
m.complete(p, REF_PAT)
}
+// test not_null_pat
+// fn main() {
+// let (!a | !&0) = ();
+// }
+fn not_null_pat(p: &mut Parser<'_>) -> CompletedMarker {
+ assert!(p.at(T![!]));
+ let m = p.start();
+ p.bump(T![!]);
+ pattern_single(p);
+ m.complete(p, NOT_NULL)
+}
+
// test tuple_pat
// fn main() {
// let (a, b, ..) = ();