diff options
Diffstat (limited to 'crates/ra_syntax')
-rw-r--r-- | crates/ra_syntax/Cargo.toml | 2 | ||||
-rw-r--r-- | crates/ra_syntax/src/ast.rs | 18 | ||||
-rw-r--r-- | crates/ra_syntax/src/grammar/expressions.rs | 2 | ||||
-rw-r--r-- | crates/ra_syntax/tests/data/parser/ok/0043_complex_assignment.rs | 8 | ||||
-rw-r--r-- | crates/ra_syntax/tests/data/parser/ok/0043_complex_assignment.txt | 109 |
5 files changed, 135 insertions, 4 deletions
diff --git a/crates/ra_syntax/Cargo.toml b/crates/ra_syntax/Cargo.toml index c50dc6c67..0ec8492aa 100644 --- a/crates/ra_syntax/Cargo.toml +++ b/crates/ra_syntax/Cargo.toml | |||
@@ -13,7 +13,7 @@ unicode-xid = "0.1.0" | |||
13 | itertools = "0.8.0" | 13 | itertools = "0.8.0" |
14 | drop_bomb = "0.1.4" | 14 | drop_bomb = "0.1.4" |
15 | parking_lot = "0.7.0" | 15 | parking_lot = "0.7.0" |
16 | rowan = "0.3.2" | 16 | rowan = "0.3.3" |
17 | 17 | ||
18 | # ideally, `serde` should be enabled by `ra_lsp_serder`, but we enable it here | 18 | # ideally, `serde` should be enabled by `ra_lsp_serder`, but we enable it here |
19 | # to reduce number of compilations | 19 | # to reduce number of compilations |
diff --git a/crates/ra_syntax/src/ast.rs b/crates/ra_syntax/src/ast.rs index d59890d95..3d22a88f3 100644 --- a/crates/ra_syntax/src/ast.rs +++ b/crates/ra_syntax/src/ast.rs | |||
@@ -302,13 +302,27 @@ impl LetStmt { | |||
302 | } | 302 | } |
303 | } | 303 | } |
304 | 304 | ||
305 | #[derive(Debug, Clone, PartialEq, Eq)] | ||
306 | pub enum ElseBranchFlavor<'a> { | ||
307 | Block(&'a Block), | ||
308 | IfExpr(&'a IfExpr), | ||
309 | } | ||
310 | |||
305 | impl IfExpr { | 311 | impl IfExpr { |
306 | pub fn then_branch(&self) -> Option<&Block> { | 312 | pub fn then_branch(&self) -> Option<&Block> { |
307 | self.blocks().nth(0) | 313 | self.blocks().nth(0) |
308 | } | 314 | } |
309 | pub fn else_branch(&self) -> Option<&Block> { | 315 | pub fn else_branch(&self) -> Option<ElseBranchFlavor> { |
310 | self.blocks().nth(1) | 316 | let res = match self.blocks().nth(1) { |
317 | Some(block) => ElseBranchFlavor::Block(block), | ||
318 | None => { | ||
319 | let elif: &IfExpr = child_opt(self)?; | ||
320 | ElseBranchFlavor::IfExpr(elif) | ||
321 | } | ||
322 | }; | ||
323 | Some(res) | ||
311 | } | 324 | } |
325 | |||
312 | fn blocks(&self) -> AstChildren<Block> { | 326 | fn blocks(&self) -> AstChildren<Block> { |
313 | children(self) | 327 | children(self) |
314 | } | 328 | } |
diff --git a/crates/ra_syntax/src/grammar/expressions.rs b/crates/ra_syntax/src/grammar/expressions.rs index 7ee32fa7c..1604d9b5a 100644 --- a/crates/ra_syntax/src/grammar/expressions.rs +++ b/crates/ra_syntax/src/grammar/expressions.rs | |||
@@ -423,7 +423,7 @@ fn path_expr(p: &mut Parser, r: Restrictions) -> (CompletedMarker, BlockLike) { | |||
423 | match p.current() { | 423 | match p.current() { |
424 | L_CURLY if !r.forbid_structs => { | 424 | L_CURLY if !r.forbid_structs => { |
425 | named_field_list(p); | 425 | named_field_list(p); |
426 | (m.complete(p, STRUCT_LIT), BlockLike::Block) | 426 | (m.complete(p, STRUCT_LIT), BlockLike::NotBlock) |
427 | } | 427 | } |
428 | EXCL => { | 428 | EXCL => { |
429 | let block_like = items::macro_call_after_excl(p); | 429 | let block_like = items::macro_call_after_excl(p); |
diff --git a/crates/ra_syntax/tests/data/parser/ok/0043_complex_assignment.rs b/crates/ra_syntax/tests/data/parser/ok/0043_complex_assignment.rs new file mode 100644 index 000000000..7e4a28bf7 --- /dev/null +++ b/crates/ra_syntax/tests/data/parser/ok/0043_complex_assignment.rs | |||
@@ -0,0 +1,8 @@ | |||
1 | // https://github.com/rust-analyzer/rust-analyzer/issues/674 | ||
2 | |||
3 | struct Repr { raw: [u8; 1] } | ||
4 | |||
5 | fn abc() { | ||
6 | Repr { raw: [0] }.raw[0] = 0; | ||
7 | Repr{raw:[0]}(); | ||
8 | } | ||
diff --git a/crates/ra_syntax/tests/data/parser/ok/0043_complex_assignment.txt b/crates/ra_syntax/tests/data/parser/ok/0043_complex_assignment.txt new file mode 100644 index 000000000..2279c7966 --- /dev/null +++ b/crates/ra_syntax/tests/data/parser/ok/0043_complex_assignment.txt | |||
@@ -0,0 +1,109 @@ | |||
1 | SOURCE_FILE@[0; 160) | ||
2 | COMMENT@[0; 60) | ||
3 | WHITESPACE@[60; 62) | ||
4 | STRUCT_DEF@[62; 90) | ||
5 | STRUCT_KW@[62; 68) | ||
6 | WHITESPACE@[68; 69) | ||
7 | NAME@[69; 73) | ||
8 | IDENT@[69; 73) "Repr" | ||
9 | WHITESPACE@[73; 74) | ||
10 | NAMED_FIELD_DEF_LIST@[74; 90) | ||
11 | L_CURLY@[74; 75) | ||
12 | WHITESPACE@[75; 76) | ||
13 | NAMED_FIELD_DEF@[76; 88) | ||
14 | NAME@[76; 79) | ||
15 | IDENT@[76; 79) "raw" | ||
16 | COLON@[79; 80) | ||
17 | WHITESPACE@[80; 81) | ||
18 | ARRAY_TYPE@[81; 88) | ||
19 | L_BRACK@[81; 82) | ||
20 | PATH_TYPE@[82; 84) | ||
21 | PATH@[82; 84) | ||
22 | PATH_SEGMENT@[82; 84) | ||
23 | NAME_REF@[82; 84) | ||
24 | IDENT@[82; 84) "u8" | ||
25 | SEMI@[84; 85) | ||
26 | WHITESPACE@[85; 86) | ||
27 | LITERAL@[86; 87) | ||
28 | INT_NUMBER@[86; 87) "1" | ||
29 | R_BRACK@[87; 88) | ||
30 | WHITESPACE@[88; 89) | ||
31 | R_CURLY@[89; 90) | ||
32 | WHITESPACE@[90; 92) | ||
33 | FN_DEF@[92; 159) | ||
34 | FN_KW@[92; 94) | ||
35 | WHITESPACE@[94; 95) | ||
36 | NAME@[95; 98) | ||
37 | IDENT@[95; 98) "abc" | ||
38 | PARAM_LIST@[98; 100) | ||
39 | L_PAREN@[98; 99) | ||
40 | R_PAREN@[99; 100) | ||
41 | WHITESPACE@[100; 101) | ||
42 | BLOCK@[101; 159) | ||
43 | L_CURLY@[101; 102) | ||
44 | WHITESPACE@[102; 107) | ||
45 | EXPR_STMT@[107; 136) | ||
46 | BIN_EXPR@[107; 135) | ||
47 | INDEX_EXPR@[107; 131) | ||
48 | FIELD_EXPR@[107; 128) | ||
49 | STRUCT_LIT@[107; 124) | ||
50 | PATH@[107; 111) | ||
51 | PATH_SEGMENT@[107; 111) | ||
52 | NAME_REF@[107; 111) | ||
53 | IDENT@[107; 111) "Repr" | ||
54 | WHITESPACE@[111; 112) | ||
55 | NAMED_FIELD_LIST@[112; 124) | ||
56 | L_CURLY@[112; 113) | ||
57 | WHITESPACE@[113; 114) | ||
58 | NAMED_FIELD@[114; 122) | ||
59 | NAME_REF@[114; 117) | ||
60 | IDENT@[114; 117) "raw" | ||
61 | COLON@[117; 118) | ||
62 | WHITESPACE@[118; 119) | ||
63 | ARRAY_EXPR@[119; 122) | ||
64 | L_BRACK@[119; 120) | ||
65 | LITERAL@[120; 121) | ||
66 | INT_NUMBER@[120; 121) "0" | ||
67 | R_BRACK@[121; 122) | ||
68 | WHITESPACE@[122; 123) | ||
69 | R_CURLY@[123; 124) | ||
70 | DOT@[124; 125) | ||
71 | NAME_REF@[125; 128) | ||
72 | IDENT@[125; 128) "raw" | ||
73 | L_BRACK@[128; 129) | ||
74 | LITERAL@[129; 130) | ||
75 | INT_NUMBER@[129; 130) "0" | ||
76 | R_BRACK@[130; 131) | ||
77 | WHITESPACE@[131; 132) | ||
78 | EQ@[132; 133) | ||
79 | WHITESPACE@[133; 134) | ||
80 | LITERAL@[134; 135) | ||
81 | INT_NUMBER@[134; 135) "0" | ||
82 | SEMI@[135; 136) | ||
83 | WHITESPACE@[136; 141) | ||
84 | EXPR_STMT@[141; 157) | ||
85 | CALL_EXPR@[141; 156) | ||
86 | STRUCT_LIT@[141; 154) | ||
87 | PATH@[141; 145) | ||
88 | PATH_SEGMENT@[141; 145) | ||
89 | NAME_REF@[141; 145) | ||
90 | IDENT@[141; 145) "Repr" | ||
91 | NAMED_FIELD_LIST@[145; 154) | ||
92 | L_CURLY@[145; 146) | ||
93 | NAMED_FIELD@[146; 153) | ||
94 | NAME_REF@[146; 149) | ||
95 | IDENT@[146; 149) "raw" | ||
96 | COLON@[149; 150) | ||
97 | ARRAY_EXPR@[150; 153) | ||
98 | L_BRACK@[150; 151) | ||
99 | LITERAL@[151; 152) | ||
100 | INT_NUMBER@[151; 152) "0" | ||
101 | R_BRACK@[152; 153) | ||
102 | R_CURLY@[153; 154) | ||
103 | ARG_LIST@[154; 156) | ||
104 | L_PAREN@[154; 155) | ||
105 | R_PAREN@[155; 156) | ||
106 | SEMI@[156; 157) | ||
107 | WHITESPACE@[157; 158) | ||
108 | R_CURLY@[158; 159) | ||
109 | WHITESPACE@[159; 160) | ||