Skip to content

Commit 2266ecf

Browse files
committed
Auto merge of rust-lang#15356 - Veykril:eager-missing-tt, r=Veykril
fix: Fix bad unwrap in eager_macro_recur Some logic changed so this path can be hit now with a missing token tree.
2 parents f442c4a + 3db437c commit 2266ecf

File tree

1 file changed

+31
-27
lines changed

1 file changed

+31
-27
lines changed

crates/hir-expand/src/eager.rs

Lines changed: 31 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -205,17 +205,19 @@ fn eager_macro_recur(
205205
let ExpandResult { value, err: err2 } =
206206
db.parse_macro_expansion(call_id.as_macro_file());
207207

208-
let call_tt_start =
209-
call.token_tree().unwrap().syntax().text_range().start();
210-
let call_start = apply_offset(call.syntax().text_range().start(), offset);
211-
if let Some((_, arg_map, _)) = db.macro_arg(call_id).value.as_deref() {
212-
mapping.extend(arg_map.entries().filter_map(|(tid, range)| {
213-
value
214-
.1
215-
.first_range_by_token(tid, syntax::SyntaxKind::TOMBSTONE)
216-
.map(|r| (r + call_start, range + call_tt_start))
217-
}));
218-
};
208+
if let Some(tt) = call.token_tree() {
209+
let call_tt_start = tt.syntax().text_range().start();
210+
let call_start =
211+
apply_offset(call.syntax().text_range().start(), offset);
212+
if let Some((_, arg_map, _)) = db.macro_arg(call_id).value.as_deref() {
213+
mapping.extend(arg_map.entries().filter_map(|(tid, range)| {
214+
value
215+
.1
216+
.first_range_by_token(tid, syntax::SyntaxKind::TOMBSTONE)
217+
.map(|r| (r + call_start, range + call_tt_start))
218+
}));
219+
}
220+
}
219221

220222
ExpandResult {
221223
value: Some(value.0.syntax_node().clone_for_update()),
@@ -250,22 +252,24 @@ fn eager_macro_recur(
250252
)?;
251253
let err = err.or(error);
252254

253-
let call_tt_start = call.token_tree().unwrap().syntax().text_range().start();
254-
let call_start = apply_offset(call.syntax().text_range().start(), offset);
255-
if let Some((_tt, arg_map, _)) = parse
256-
.file_id
257-
.macro_file()
258-
.and_then(|id| db.macro_arg(id.macro_call_id).value)
259-
.as_deref()
260-
{
261-
mapping.extend(arg_map.entries().filter_map(|(tid, range)| {
262-
tm.first_range_by_token(
263-
decl_mac.as_ref().map(|it| it.map_id_down(tid)).unwrap_or(tid),
264-
syntax::SyntaxKind::TOMBSTONE,
265-
)
266-
.map(|r| (r + call_start, range + call_tt_start))
267-
}));
268-
};
255+
if let Some(tt) = call.token_tree() {
256+
let call_tt_start = tt.syntax().text_range().start();
257+
let call_start = apply_offset(call.syntax().text_range().start(), offset);
258+
if let Some((_tt, arg_map, _)) = parse
259+
.file_id
260+
.macro_file()
261+
.and_then(|id| db.macro_arg(id.macro_call_id).value)
262+
.as_deref()
263+
{
264+
mapping.extend(arg_map.entries().filter_map(|(tid, range)| {
265+
tm.first_range_by_token(
266+
decl_mac.as_ref().map(|it| it.map_id_down(tid)).unwrap_or(tid),
267+
syntax::SyntaxKind::TOMBSTONE,
268+
)
269+
.map(|r| (r + call_start, range + call_tt_start))
270+
}));
271+
}
272+
}
269273
// FIXME: Do we need to re-use _m here?
270274
ExpandResult { value: value.map(|(n, _m)| n), err }
271275
}

0 commit comments

Comments
 (0)