aboutsummaryrefslogtreecommitdiff
path: root/crates/ra_mbe/src
diff options
context:
space:
mode:
Diffstat (limited to 'crates/ra_mbe/src')
-rw-r--r--crates/ra_mbe/src/syntax_bridge.rs36
-rw-r--r--crates/ra_mbe/src/tests.rs20
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