1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
use crate::{
Parser, SyntaxKind, T,
grammar::stmt::{StatementKind, stmt},
};
pub fn block(p: &mut Parser) {
p.start(SyntaxKind::Block);
p.expect(T!['{']);
while !p.at(T!['}']) {
if stmt(p) == StatementKind::End {
break;
}
}
p.expect(T!['}']);
p.finish();
}
#[cfg(test)]
mod tests {
use expect_test::expect;
use crate::grammar::tests::check;
use super::*;
#[test]
fn test_block() {
check(
block,
"{let x = 5;}",
expect![[r#"
Block@0..12
OpenBrace@0..1 "{"
LetStmt@1..11
Let@1..4 "let"
Whitespace@4..5 " "
NamedBinding@5..6
Ident@5..6 "x"
Whitespace@6..7 " "
Assign@7..8 "="
Whitespace@8..9 " "
LiteralExpr@9..10
Integer@9..10 "5"
Semicolon@10..11 ";"
CloseBrace@11..12 "}"
"#]],
expect![],
);
check(
block,
"{42}",
expect![[r#"
Block@0..4
OpenBrace@0..1 "{"
LiteralExpr@1..3
Integer@1..3 "42"
CloseBrace@3..4 "}"
"#]],
expect![],
);
check(
block,
"{let x = 5; 42}",
expect![[r#"
Block@0..15
OpenBrace@0..1 "{"
LetStmt@1..11
Let@1..4 "let"
Whitespace@4..5 " "
NamedBinding@5..6
Ident@5..6 "x"
Whitespace@6..7 " "
Assign@7..8 "="
Whitespace@8..9 " "
LiteralExpr@9..10
Integer@9..10 "5"
Semicolon@10..11 ";"
Whitespace@11..12 " "
LiteralExpr@12..14
Integer@12..14 "42"
CloseBrace@14..15 "}"
"#]],
expect![],
);
}
}