aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/algo/walk.rs1
-rw-r--r--src/grammar/expressions/mod.rs14
-rw-r--r--tests/data/parser/inline/0074_expr_binding_power.rs3
-rw-r--r--tests/data/parser/inline/0074_expr_binding_power.txt102
4 files changed, 74 insertions, 46 deletions
diff --git a/src/algo/walk.rs b/src/algo/walk.rs
index ad0f2d8fb..a50ec2a09 100644
--- a/src/algo/walk.rs
+++ b/src/algo/walk.rs
@@ -6,6 +6,7 @@ pub fn preorder<'a>(root: SyntaxNodeRef<'a>) -> impl Iterator<Item = SyntaxNodeR
6 WalkEvent::Exit(_) => None, 6 WalkEvent::Exit(_) => None,
7 }) 7 })
8} 8}
9
9#[derive(Debug, Copy, Clone)] 10#[derive(Debug, Copy, Clone)]
10pub enum WalkEvent<'a> { 11pub enum WalkEvent<'a> {
11 Enter(SyntaxNodeRef<'a>), 12 Enter(SyntaxNodeRef<'a>),
diff --git a/src/grammar/expressions/mod.rs b/src/grammar/expressions/mod.rs
index cedbc235f..6831aef66 100644
--- a/src/grammar/expressions/mod.rs
+++ b/src/grammar/expressions/mod.rs
@@ -35,13 +35,15 @@ struct Restrictions {
35 35
36// test expr_binding_power 36// test expr_binding_power
37// fn foo() { 37// fn foo() {
38// 1 + 2 * 3 == 1 * 2 + 3 38// 1 + 2 * 3 == 1 * 2 + 3;
39// *x = 1 + 1;
39// } 40// }
40fn bp_of(op: SyntaxKind) -> u8 { 41fn bp_of(op: SyntaxKind) -> u8 {
41 match op { 42 match op {
42 EQEQ | NEQ => 1, 43 EQ => 1,
43 MINUS | PLUS => 2, 44 EQEQ | NEQ => 2,
44 STAR | SLASH => 3, 45 MINUS | PLUS => 3,
46 STAR | SLASH => 4,
45 _ => 0 47 _ => 0
46 } 48 }
47} 49}
@@ -106,7 +108,7 @@ fn unary_expr(p: &mut Parser, r: Restrictions) -> Option<CompletedMarker> {
106 return Some(postfix_expr(p, lhs)) 108 return Some(postfix_expr(p, lhs))
107 } 109 }
108 }; 110 };
109 expr(p); 111 unary_expr(p, r);
110 Some(m.complete(p, kind)) 112 Some(m.complete(p, kind))
111} 113}
112 114
@@ -247,7 +249,7 @@ fn struct_lit(p: &mut Parser) {
247 249
248fn bin_expr(p: &mut Parser, r: Restrictions, lhs: CompletedMarker, bp: u8) -> CompletedMarker { 250fn bin_expr(p: &mut Parser, r: Restrictions, lhs: CompletedMarker, bp: u8) -> CompletedMarker {
249 assert!(match p.current() { 251 assert!(match p.current() {
250 MINUS | PLUS | STAR | SLASH | EQEQ | NEQ => true, 252 MINUS | PLUS | STAR | SLASH | EQEQ | NEQ | EQ => true,
251 _ => false, 253 _ => false,
252 }); 254 });
253 let m = lhs.precede(p); 255 let m = lhs.precede(p);
diff --git a/tests/data/parser/inline/0074_expr_binding_power.rs b/tests/data/parser/inline/0074_expr_binding_power.rs
index db855fd02..87afb036e 100644
--- a/tests/data/parser/inline/0074_expr_binding_power.rs
+++ b/tests/data/parser/inline/0074_expr_binding_power.rs
@@ -1,3 +1,4 @@
1fn foo() { 1fn foo() {
2 1 + 2 * 3 == 1 * 2 + 3 2 1 + 2 * 3 == 1 * 2 + 3;
3 *x = 1 + 1;
3} 4}
diff --git a/tests/data/parser/inline/0074_expr_binding_power.txt b/tests/data/parser/inline/0074_expr_binding_power.txt
index 05aad25e9..384fd4354 100644
--- a/tests/data/parser/inline/0074_expr_binding_power.txt
+++ b/tests/data/parser/inline/0074_expr_binding_power.txt
@@ -1,5 +1,5 @@
1FILE@[0; 40) 1FILE@[0; 57)
2 FN_ITEM@[0; 40) 2 FN_ITEM@[0; 57)
3 FN_KW@[0; 2) 3 FN_KW@[0; 2)
4 NAME@[2; 6) 4 NAME@[2; 6)
5 WHITESPACE@[2; 3) 5 WHITESPACE@[2; 3)
@@ -8,41 +8,65 @@ FILE@[0; 40)
8 L_PAREN@[6; 7) 8 L_PAREN@[6; 7)
9 R_PAREN@[7; 8) 9 R_PAREN@[7; 8)
10 WHITESPACE@[8; 9) 10 WHITESPACE@[8; 9)
11 BLOCK_EXPR@[9; 40) 11 BLOCK_EXPR@[9; 57)
12 L_CURLY@[9; 10) 12 L_CURLY@[9; 10)
13 BIN_EXPR@[10; 38) 13 EXPR_STMT@[10; 43)
14 BIN_EXPR@[10; 25) 14 BIN_EXPR@[10; 37)
15 LITERAL@[10; 17) 15 BIN_EXPR@[10; 25)
16 WHITESPACE@[10; 15) 16 LITERAL@[10; 17)
17 INT_NUMBER@[15; 16) "1" 17 WHITESPACE@[10; 15)
18 WHITESPACE@[16; 17) 18 INT_NUMBER@[15; 16) "1"
19 PLUS@[17; 18) 19 WHITESPACE@[16; 17)
20 BIN_EXPR@[18; 25) 20 PLUS@[17; 18)
21 LITERAL@[18; 21) 21 BIN_EXPR@[18; 25)
22 WHITESPACE@[18; 19) 22 LITERAL@[18; 21)
23 INT_NUMBER@[19; 20) "2" 23 WHITESPACE@[18; 19)
24 WHITESPACE@[20; 21) 24 INT_NUMBER@[19; 20) "2"
25 STAR@[21; 22) 25 WHITESPACE@[20; 21)
26 LITERAL@[22; 25) 26 STAR@[21; 22)
27 WHITESPACE@[22; 23) 27 LITERAL@[22; 25)
28 INT_NUMBER@[23; 24) "3" 28 WHITESPACE@[22; 23)
29 WHITESPACE@[24; 25) 29 INT_NUMBER@[23; 24) "3"
30 EQEQ@[25; 27) 30 WHITESPACE@[24; 25)
31 BIN_EXPR@[27; 38) 31 EQEQ@[25; 27)
32 BIN_EXPR@[27; 34) 32 BIN_EXPR@[27; 37)
33 LITERAL@[27; 30) 33 BIN_EXPR@[27; 34)
34 WHITESPACE@[27; 28) 34 LITERAL@[27; 30)
35 INT_NUMBER@[28; 29) "1" 35 WHITESPACE@[27; 28)
36 WHITESPACE@[29; 30) 36 INT_NUMBER@[28; 29) "1"
37 STAR@[30; 31) 37 WHITESPACE@[29; 30)
38 LITERAL@[31; 34) 38 STAR@[30; 31)
39 WHITESPACE@[31; 32) 39 LITERAL@[31; 34)
40 INT_NUMBER@[32; 33) "2" 40 WHITESPACE@[31; 32)
41 WHITESPACE@[33; 34) 41 INT_NUMBER@[32; 33) "2"
42 PLUS@[34; 35) 42 WHITESPACE@[33; 34)
43 LITERAL@[35; 38) 43 PLUS@[34; 35)
44 WHITESPACE@[35; 36) 44 LITERAL@[35; 37)
45 INT_NUMBER@[36; 37) "3" 45 WHITESPACE@[35; 36)
46 WHITESPACE@[37; 38) 46 INT_NUMBER@[36; 37) "3"
47 R_CURLY@[38; 39) 47 SEMI@[37; 38)
48 WHITESPACE@[39; 40) 48 WHITESPACE@[38; 43)
49 EXPR_STMT@[43; 55)
50 BIN_EXPR@[43; 53)
51 DEREF_EXPR@[43; 46)
52 STAR@[43; 44)
53 PATH_EXPR@[44; 46)
54 PATH@[44; 46)
55 PATH_SEGMENT@[44; 46)
56 NAME_REF@[44; 46)
57 IDENT@[44; 45) "x"
58 WHITESPACE@[45; 46)
59 EQ@[46; 47)
60 BIN_EXPR@[47; 53)
61 LITERAL@[47; 50)
62 WHITESPACE@[47; 48)
63 INT_NUMBER@[48; 49) "1"
64 WHITESPACE@[49; 50)
65 PLUS@[50; 51)
66 LITERAL@[51; 53)
67 WHITESPACE@[51; 52)
68 INT_NUMBER@[52; 53) "1"
69 SEMI@[53; 54)
70 WHITESPACE@[54; 55)
71 R_CURLY@[55; 56)
72 WHITESPACE@[56; 57)