diff options
Diffstat (limited to 'crates/ra_mbe')
-rw-r--r-- | crates/ra_mbe/src/syntax_bridge.rs | 36 | ||||
-rw-r--r-- | crates/ra_mbe/src/tests.rs | 20 |
2 files changed, 29 insertions, 27 deletions
diff --git a/crates/ra_mbe/src/syntax_bridge.rs b/crates/ra_mbe/src/syntax_bridge.rs index 8e8ae2b29..9fb5cb058 100644 --- a/crates/ra_mbe/src/syntax_bridge.rs +++ b/crates/ra_mbe/src/syntax_bridge.rs | |||
@@ -137,21 +137,23 @@ impl TokenMap { | |||
137 | token_id: tt::TokenId, | 137 | token_id: tt::TokenId, |
138 | open_relative_range: TextRange, | 138 | open_relative_range: TextRange, |
139 | close_relative_range: TextRange, | 139 | close_relative_range: TextRange, |
140 | ) { | 140 | ) -> usize { |
141 | let res = self.entries.len(); | ||
141 | self.entries | 142 | self.entries |
142 | .push((token_id, TokenTextRange::Delimiter(open_relative_range, close_relative_range))); | 143 | .push((token_id, TokenTextRange::Delimiter(open_relative_range, close_relative_range))); |
144 | res | ||
143 | } | 145 | } |
144 | 146 | ||
145 | fn update_close_delim(&mut self, token_id: tt::TokenId, close_relative_range: TextRange) { | 147 | fn update_close_delim(&mut self, idx: usize, close_relative_range: TextRange) { |
146 | if let Some(entry) = self.entries.iter_mut().find(|(tid, _)| *tid == token_id) { | 148 | let (_, token_text_range) = &mut self.entries[idx]; |
147 | if let TokenTextRange::Delimiter(dim, _) = entry.1 { | 149 | if let TokenTextRange::Delimiter(dim, _) = token_text_range { |
148 | entry.1 = TokenTextRange::Delimiter(dim, close_relative_range); | 150 | *token_text_range = TokenTextRange::Delimiter(*dim, close_relative_range); |
149 | } | ||
150 | } | 151 | } |
151 | } | 152 | } |
152 | 153 | ||
153 | fn remove_delim(&mut self, token_id: tt::TokenId) { | 154 | fn remove_delim(&mut self, idx: usize) { |
154 | self.entries.retain(|(tid, _)| *tid != token_id); | 155 | // FIXME: This could be accidently quadratic |
156 | self.entries.remove(idx); | ||
155 | } | 157 | } |
156 | } | 158 | } |
157 | 159 | ||
@@ -238,24 +240,24 @@ impl TokenIdAlloc { | |||
238 | token_id | 240 | token_id |
239 | } | 241 | } |
240 | 242 | ||
241 | fn open_delim(&mut self, open_abs_range: TextRange) -> tt::TokenId { | 243 | fn open_delim(&mut self, open_abs_range: TextRange) -> (tt::TokenId, usize) { |
242 | let token_id = tt::TokenId(self.next_id); | 244 | let token_id = tt::TokenId(self.next_id); |
243 | self.next_id += 1; | 245 | self.next_id += 1; |
244 | self.map.insert_delim( | 246 | let idx = self.map.insert_delim( |
245 | token_id, | 247 | token_id, |
246 | open_abs_range - self.global_offset, | 248 | open_abs_range - self.global_offset, |
247 | open_abs_range - self.global_offset, | 249 | open_abs_range - self.global_offset, |
248 | ); | 250 | ); |
249 | token_id | 251 | (token_id, idx) |
250 | } | 252 | } |
251 | 253 | ||
252 | fn close_delim(&mut self, id: tt::TokenId, close_abs_range: Option<TextRange>) { | 254 | fn close_delim(&mut self, idx: usize, close_abs_range: Option<TextRange>) { |
253 | match close_abs_range { | 255 | match close_abs_range { |
254 | None => { | 256 | None => { |
255 | self.map.remove_delim(id); | 257 | self.map.remove_delim(idx); |
256 | } | 258 | } |
257 | Some(close) => { | 259 | Some(close) => { |
258 | self.map.update_close_delim(id, close - self.global_offset); | 260 | self.map.update_close_delim(idx, close - self.global_offset); |
259 | } | 261 | } |
260 | } | 262 | } |
261 | } | 263 | } |
@@ -322,7 +324,7 @@ trait TokenConvertor { | |||
322 | 324 | ||
323 | if let Some((kind, closed)) = delim { | 325 | if let Some((kind, closed)) = delim { |
324 | let mut subtree = tt::Subtree::default(); | 326 | let mut subtree = tt::Subtree::default(); |
325 | let id = self.id_alloc().open_delim(range); | 327 | let (id, idx) = self.id_alloc().open_delim(range); |
326 | subtree.delimiter = Some(tt::Delimiter { kind, id }); | 328 | subtree.delimiter = Some(tt::Delimiter { kind, id }); |
327 | 329 | ||
328 | while self.peek().map(|it| it.kind() != closed).unwrap_or(false) { | 330 | while self.peek().map(|it| it.kind() != closed).unwrap_or(false) { |
@@ -331,7 +333,7 @@ trait TokenConvertor { | |||
331 | let last_range = match self.bump() { | 333 | let last_range = match self.bump() { |
332 | None => { | 334 | None => { |
333 | // For error resilience, we insert an char punct for the opening delim here | 335 | // For error resilience, we insert an char punct for the opening delim here |
334 | self.id_alloc().close_delim(id, None); | 336 | self.id_alloc().close_delim(idx, None); |
335 | let leaf: tt::Leaf = tt::Punct { | 337 | let leaf: tt::Leaf = tt::Punct { |
336 | id: self.id_alloc().alloc(range), | 338 | id: self.id_alloc().alloc(range), |
337 | char: token.to_char().unwrap(), | 339 | char: token.to_char().unwrap(), |
@@ -344,7 +346,7 @@ trait TokenConvertor { | |||
344 | } | 346 | } |
345 | Some(it) => it.1, | 347 | Some(it) => it.1, |
346 | }; | 348 | }; |
347 | self.id_alloc().close_delim(id, Some(last_range)); | 349 | self.id_alloc().close_delim(idx, Some(last_range)); |
348 | subtree.into() | 350 | subtree.into() |
349 | } else { | 351 | } else { |
350 | let spacing = match self.peek() { | 352 | let spacing = match self.peek() { |
diff --git a/crates/ra_mbe/src/tests.rs b/crates/ra_mbe/src/tests.rs index 1ef6f6eed..5d1274d21 100644 --- a/crates/ra_mbe/src/tests.rs +++ b/crates/ra_mbe/src/tests.rs | |||
@@ -252,7 +252,7 @@ fn test_expr_order() { | |||
252 | STAR@[11; 12) "*" | 252 | STAR@[11; 12) "*" |
253 | LITERAL@[12; 13) | 253 | LITERAL@[12; 13) |
254 | INT_NUMBER@[12; 13) "2" | 254 | INT_NUMBER@[12; 13) "2" |
255 | SEMI@[13; 14) ";" | 255 | SEMICOLON@[13; 14) ";" |
256 | R_CURLY@[14; 15) "}""#, | 256 | R_CURLY@[14; 15) "}""#, |
257 | ); | 257 | ); |
258 | } | 258 | } |
@@ -605,7 +605,7 @@ fn test_tt_to_stmts() { | |||
605 | EQ@[4; 5) "=" | 605 | EQ@[4; 5) "=" |
606 | LITERAL@[5; 6) | 606 | LITERAL@[5; 6) |
607 | INT_NUMBER@[5; 6) "0" | 607 | INT_NUMBER@[5; 6) "0" |
608 | SEMI@[6; 7) ";" | 608 | SEMICOLON@[6; 7) ";" |
609 | EXPR_STMT@[7; 14) | 609 | EXPR_STMT@[7; 14) |
610 | BIN_EXPR@[7; 13) | 610 | BIN_EXPR@[7; 13) |
611 | PATH_EXPR@[7; 8) | 611 | PATH_EXPR@[7; 8) |
@@ -620,7 +620,7 @@ fn test_tt_to_stmts() { | |||
620 | PLUS@[11; 12) "+" | 620 | PLUS@[11; 12) "+" |
621 | LITERAL@[12; 13) | 621 | LITERAL@[12; 13) |
622 | INT_NUMBER@[12; 13) "1" | 622 | INT_NUMBER@[12; 13) "1" |
623 | SEMI@[13; 14) ";" | 623 | SEMICOLON@[13; 14) ";" |
624 | EXPR_STMT@[14; 15) | 624 | EXPR_STMT@[14; 15) |
625 | PATH_EXPR@[14; 15) | 625 | PATH_EXPR@[14; 15) |
626 | PATH@[14; 15) | 626 | PATH@[14; 15) |
@@ -953,7 +953,7 @@ fn test_tt_composite2() { | |||
953 | PATH_SEGMENT@[0; 3) | 953 | PATH_SEGMENT@[0; 3) |
954 | NAME_REF@[0; 3) | 954 | NAME_REF@[0; 3) |
955 | IDENT@[0; 3) "abs" | 955 | IDENT@[0; 3) "abs" |
956 | EXCL@[3; 4) "!" | 956 | BANG@[3; 4) "!" |
957 | TOKEN_TREE@[4; 10) | 957 | TOKEN_TREE@[4; 10) |
958 | L_PAREN@[4; 5) "(" | 958 | L_PAREN@[4; 5) "(" |
959 | EQ@[5; 6) "=" | 959 | EQ@[5; 6) "=" |
@@ -1073,14 +1073,14 @@ fn test_vec() { | |||
1073 | PATH_SEGMENT@[9; 12) | 1073 | PATH_SEGMENT@[9; 12) |
1074 | NAME_REF@[9; 12) | 1074 | NAME_REF@[9; 12) |
1075 | IDENT@[9; 12) "Vec" | 1075 | IDENT@[9; 12) "Vec" |
1076 | COLONCOLON@[12; 14) "::" | 1076 | COLON2@[12; 14) "::" |
1077 | PATH_SEGMENT@[14; 17) | 1077 | PATH_SEGMENT@[14; 17) |
1078 | NAME_REF@[14; 17) | 1078 | NAME_REF@[14; 17) |
1079 | IDENT@[14; 17) "new" | 1079 | IDENT@[14; 17) "new" |
1080 | ARG_LIST@[17; 19) | 1080 | ARG_LIST@[17; 19) |
1081 | L_PAREN@[17; 18) "(" | 1081 | L_PAREN@[17; 18) "(" |
1082 | R_PAREN@[18; 19) ")" | 1082 | R_PAREN@[18; 19) ")" |
1083 | SEMI@[19; 20) ";" | 1083 | SEMICOLON@[19; 20) ";" |
1084 | EXPR_STMT@[20; 33) | 1084 | EXPR_STMT@[20; 33) |
1085 | METHOD_CALL_EXPR@[20; 32) | 1085 | METHOD_CALL_EXPR@[20; 32) |
1086 | PATH_EXPR@[20; 21) | 1086 | PATH_EXPR@[20; 21) |
@@ -1096,7 +1096,7 @@ fn test_vec() { | |||
1096 | LITERAL@[27; 31) | 1096 | LITERAL@[27; 31) |
1097 | INT_NUMBER@[27; 31) "1u32" | 1097 | INT_NUMBER@[27; 31) "1u32" |
1098 | R_PAREN@[31; 32) ")" | 1098 | R_PAREN@[31; 32) ")" |
1099 | SEMI@[32; 33) ";" | 1099 | SEMICOLON@[32; 33) ";" |
1100 | EXPR_STMT@[33; 43) | 1100 | EXPR_STMT@[33; 43) |
1101 | METHOD_CALL_EXPR@[33; 42) | 1101 | METHOD_CALL_EXPR@[33; 42) |
1102 | PATH_EXPR@[33; 34) | 1102 | PATH_EXPR@[33; 34) |
@@ -1112,7 +1112,7 @@ fn test_vec() { | |||
1112 | LITERAL@[40; 41) | 1112 | LITERAL@[40; 41) |
1113 | INT_NUMBER@[40; 41) "2" | 1113 | INT_NUMBER@[40; 41) "2" |
1114 | R_PAREN@[41; 42) ")" | 1114 | R_PAREN@[41; 42) ")" |
1115 | SEMI@[42; 43) ";" | 1115 | SEMICOLON@[42; 43) ";" |
1116 | PATH_EXPR@[43; 44) | 1116 | PATH_EXPR@[43; 44) |
1117 | PATH@[43; 44) | 1117 | PATH@[43; 44) |
1118 | PATH_SEGMENT@[43; 44) | 1118 | PATH_SEGMENT@[43; 44) |
@@ -1760,7 +1760,7 @@ fn test_no_space_after_semi_colon() { | |||
1760 | MOD_KW@[21; 24) "mod" | 1760 | MOD_KW@[21; 24) "mod" |
1761 | NAME@[24; 25) | 1761 | NAME@[24; 25) |
1762 | IDENT@[24; 25) "m" | 1762 | IDENT@[24; 25) "m" |
1763 | SEMI@[25; 26) ";" | 1763 | SEMICOLON@[25; 26) ";" |
1764 | MODULE@[26; 52) | 1764 | MODULE@[26; 52) |
1765 | ATTR@[26; 47) | 1765 | ATTR@[26; 47) |
1766 | POUND@[26; 27) "#" | 1766 | POUND@[26; 27) "#" |
@@ -1779,7 +1779,7 @@ fn test_no_space_after_semi_colon() { | |||
1779 | MOD_KW@[47; 50) "mod" | 1779 | MOD_KW@[47; 50) "mod" |
1780 | NAME@[50; 51) | 1780 | NAME@[50; 51) |
1781 | IDENT@[50; 51) "f" | 1781 | IDENT@[50; 51) "f" |
1782 | SEMI@[51; 52) ";""###, | 1782 | SEMICOLON@[51; 52) ";""###, |
1783 | ); | 1783 | ); |
1784 | } | 1784 | } |
1785 | 1785 | ||