Unnamed repository; edit this file 'description' to name the repository.
Diffstat (limited to 'crates/hir-expand/src/builtin/fn_macro.rs')
-rw-r--r--crates/hir-expand/src/builtin/fn_macro.rs30
1 files changed, 27 insertions, 3 deletions
diff --git a/crates/hir-expand/src/builtin/fn_macro.rs b/crates/hir-expand/src/builtin/fn_macro.rs
index 949b22b0ad..2de7290a21 100644
--- a/crates/hir-expand/src/builtin/fn_macro.rs
+++ b/crates/hir-expand/src/builtin/fn_macro.rs
@@ -381,16 +381,40 @@ fn cfg_select_expand(
);
}
}
- let expand_to_if_active = match iter.next() {
- Some(tt::TtElement::Subtree(_, tt)) => tt.remaining(),
- _ => {
+ let expand_to_if_active = match iter.peek() {
+ Some(tt::TtElement::Subtree(sub, tt)) if sub.delimiter.kind == DelimiterKind::Brace => {
+ iter.next();
+ tt.remaining()
+ }
+ None | Some(TtElement::Leaf(tt::Leaf::Punct(tt::Punct { char: ',', .. }))) => {
let err_span = iter.peek().map(|it| it.first_span()).unwrap_or(span);
+ iter.next();
return ExpandResult::new(
tt::TopSubtree::empty(tt::DelimSpan::from_single(span)),
ExpandError::other(err_span, "expected a token tree after `=>`"),
);
}
+ Some(_) => {
+ let expr = expect_fragment(
+ db,
+ &mut iter,
+ parser::PrefixEntryPoint::Expr,
+ tt.top_subtree().delimiter.delim_span(),
+ );
+ if let Some(err) = expr.err {
+ return ExpandResult::new(
+ tt::TopSubtree::empty(tt::DelimSpan::from_single(span)),
+ err.into(),
+ );
+ }
+ expr.value
+ }
};
+ if let Some(TtElement::Leaf(tt::Leaf::Punct(p))) = iter.peek()
+ && p.char == ','
+ {
+ iter.next();
+ }
if expand_to.is_none() && active {
expand_to = Some(expand_to_if_active);