Skip to content

Commit 6bcaa1d

Browse files
committed
Fix text range bug and reorder
1 parent 622c843 commit 6bcaa1d

File tree

1 file changed

+19
-14
lines changed

1 file changed

+19
-14
lines changed

crates/ra_mbe/src/syntax_bridge.rs

Lines changed: 19 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -237,12 +237,16 @@ impl TokenIdAlloc {
237237
fn open_delim(&mut self, open_abs_range: TextRange) -> tt::TokenId {
238238
let token_id = tt::TokenId(self.next_id);
239239
self.next_id += 1;
240-
self.map.insert_delim(token_id, open_abs_range, open_abs_range);
240+
self.map.insert_delim(
241+
token_id,
242+
open_abs_range - self.global_offset,
243+
open_abs_range - self.global_offset,
244+
);
241245
token_id
242246
}
243247

244248
fn close_delim(&mut self, id: tt::TokenId, close_abs_range: TextRange) {
245-
self.map.update_close_delim(id, close_abs_range);
249+
self.map.update_close_delim(id, close_abs_range - self.global_offset);
246250
}
247251
}
248252

@@ -297,6 +301,7 @@ trait TokenConvertor {
297301
}
298302

299303
result.push(if k.is_punct() {
304+
assert_eq!(range.len().to_usize(), 1);
300305
let delim = match k {
301306
T!['('] => Some((tt::DelimiterKind::Parenthesis, T![')'])),
302307
T!['{'] => Some((tt::DelimiterKind::Brace, T!['}'])),
@@ -461,25 +466,25 @@ impl TokenConvertor for Convertor {
461466
}
462467

463468
fn bump(&mut self) -> Option<(Self::Token, TextRange)> {
464-
let curr = self.current.clone()?;
465-
if !curr.text_range().is_subrange(&self.range) {
466-
return None;
467-
}
468-
469469
if let Some((punct, offset)) = self.punct_offset.clone() {
470470
if offset.to_usize() + 1 < punct.text().len() {
471471
let offset = offset + TextUnit::from_usize(1);
472472
let range = punct.text_range();
473-
self.punct_offset = Some((punct, offset));
473+
self.punct_offset = Some((punct.clone(), offset));
474474
let range = TextRange::offset_len(range.start() + offset, TextUnit::from_usize(1));
475-
return Some((SynToken::Punch(curr, offset), range));
475+
return Some((SynToken::Punch(punct, offset), range));
476476
}
477477
}
478478

479+
let curr = self.current.clone()?;
480+
if !curr.text_range().is_subrange(&self.range) {
481+
return None;
482+
}
479483
self.current = curr.next_token();
480484

481485
let token = if curr.kind().is_punct() {
482486
let range = curr.text_range();
487+
let range = TextRange::offset_len(range.start(), TextUnit::from_usize(1));
483488
self.punct_offset = Some((curr.clone(), TextUnit::from_usize(0)));
484489
(SynToken::Punch(curr, TextUnit::from_usize(0)), range)
485490
} else {
@@ -492,18 +497,18 @@ impl TokenConvertor for Convertor {
492497
}
493498

494499
fn peek(&self) -> Option<Self::Token> {
495-
let curr = self.current.clone()?;
496-
if !curr.text_range().is_subrange(&self.range) {
497-
return None;
498-
}
499-
500500
if let Some((punct, mut offset)) = self.punct_offset.clone() {
501501
offset = offset + TextUnit::from_usize(1);
502502
if offset.to_usize() < punct.text().len() {
503503
return Some(SynToken::Punch(punct, offset));
504504
}
505505
}
506506

507+
let curr = self.current.clone()?;
508+
if !curr.text_range().is_subrange(&self.range) {
509+
return None;
510+
}
511+
507512
let token = if curr.kind().is_punct() {
508513
SynToken::Punch(curr, TextUnit::from_usize(0))
509514
} else {

0 commit comments

Comments
 (0)