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.rs56
1 files changed, 40 insertions, 16 deletions
diff --git a/crates/hir-expand/src/builtin/fn_macro.rs b/crates/hir-expand/src/builtin/fn_macro.rs
index 6e4b96b050..b3572a1cef 100644
--- a/crates/hir-expand/src/builtin/fn_macro.rs
+++ b/crates/hir-expand/src/builtin/fn_macro.rs
@@ -5,10 +5,7 @@ use std::borrow::Cow;
use base_db::AnchoredPath;
use cfg::CfgExpr;
use either::Either;
-use intern::{
- Symbol,
- sym::{self},
-};
+use intern::{Symbol, sym};
use itertools::Itertools;
use mbe::{DelimiterKind, expect_fragment};
use span::{Edition, FileId, Span};
@@ -384,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);
@@ -753,7 +774,7 @@ fn relative_file(
if res == call_site && !allow_recursion {
Err(ExpandError::other(err_span, format!("recursive inclusion of `{path_str}`")))
} else {
- Ok(EditionedFileId::new(db, res, lookup.krate.data(db).edition, lookup.krate))
+ Ok(EditionedFileId::new(db, res, lookup.krate.data(db).edition))
}
}
@@ -830,15 +851,18 @@ fn include_bytes_expand(
span: Span,
) -> ExpandResult<tt::TopSubtree> {
// FIXME: actually read the file here if the user asked for macro expansion
- let res = tt::TopSubtree::invisible_from_leaves(
+ let underscore = sym::underscore;
+ let zero = tt::Literal {
+ text_and_suffix: sym::_0_u8,
span,
- [tt::Leaf::Literal(tt::Literal {
- text_and_suffix: Symbol::empty(),
- span,
- kind: tt::LitKind::ByteStrRaw(1),
- suffix_len: 0,
- })],
- );
+ kind: tt::LitKind::Integer,
+ suffix_len: 3,
+ };
+ // We don't use a real length since we can't know the file length, so we use an underscore
+ // to infer it.
+ let res = quote! {span =>
+ &[#zero; #underscore]
+ };
ExpandResult::ok(res)
}