Skip to content

Commit adc5463

Browse files
committed
Add open delim when delim not match
1 parent 6bcaa1d commit adc5463

File tree

2 files changed

+28
-5
lines changed

2 files changed

+28
-5
lines changed

crates/ra_mbe/src/syntax_bridge.rs

Lines changed: 27 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -149,6 +149,10 @@ impl TokenMap {
149149
}
150150
}
151151
}
152+
153+
fn remove_delim(&mut self, token_id: tt::TokenId) {
154+
self.entries.retain(|(tid, _)| *tid != token_id);
155+
}
152156
}
153157

154158
/// Returns the textual content of a doc comment block as a quoted string
@@ -245,8 +249,15 @@ impl TokenIdAlloc {
245249
token_id
246250
}
247251

248-
fn close_delim(&mut self, id: tt::TokenId, close_abs_range: TextRange) {
249-
self.map.update_close_delim(id, close_abs_range - self.global_offset);
252+
fn close_delim(&mut self, id: tt::TokenId, close_abs_range: Option<TextRange>) {
253+
match close_abs_range {
254+
None => {
255+
self.map.remove_delim(id);
256+
}
257+
Some(close) => {
258+
self.map.update_close_delim(id, close - self.global_offset);
259+
}
260+
}
250261
}
251262
}
252263

@@ -318,10 +329,22 @@ trait TokenConvertor {
318329
self.collect_leaf(&mut subtree.token_trees);
319330
}
320331
let last_range = match self.bump() {
321-
None => return,
332+
None => {
333+
// For error resilience, we insert an char punct for the opening delim here
334+
self.id_alloc().close_delim(id, None);
335+
let leaf: tt::Leaf = tt::Punct {
336+
id: self.id_alloc().alloc(range),
337+
char: token.to_char().unwrap(),
338+
spacing: tt::Spacing::Alone,
339+
}
340+
.into();
341+
result.push(leaf.into());
342+
result.extend(subtree.token_trees);
343+
return;
344+
}
322345
Some(it) => it.1,
323346
};
324-
self.id_alloc().close_delim(id, last_range);
347+
self.id_alloc().close_delim(id, Some(last_range));
325348
subtree.into()
326349
} else {
327350
let spacing = match self.peek() {

crates/ra_mbe/src/tests.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1694,5 +1694,5 @@ fn test_expand_bad_literal() {
16941694
macro_rules! foo { ($i:literal) => {}; }
16951695
"#,
16961696
)
1697-
.assert_expand_err(r#"foo!(&k");"#, &ExpandError::ConversionError);
1697+
.assert_expand_err(r#"foo!(&k");"#, &ExpandError::BindingError("".into()));
16981698
}

0 commit comments

Comments
 (0)