rustc_builtin_macros/
direct_const_arg.rs1use rustc_ast::ast;
2use rustc_ast::tokenstream::TokenStream;
3use rustc_expand::base::{self, DummyResult, ExpandResult, ExtCtxt, MacroExpanderResult};
4use rustc_span::Span;
5
6use crate::util::get_single_expr_from_tts;
7
8pub(crate) fn expand<'cx>(
9 cx: &'cx mut ExtCtxt<'_>,
10 span: Span,
11 tts: TokenStream,
12) -> MacroExpanderResult<'cx> {
13 let ExpandResult::Ready(expr) = get_single_expr_from_tts(cx, span, tts, "direct_const_arg!")
14 else {
15 return ExpandResult::Retry(());
16 };
17 let expr = match expr {
18 Ok(expr) => expr,
19 Err(err) => return ExpandResult::Ready(DummyResult::any(span, err)),
20 };
21
22 let id = ast::DUMMY_NODE_ID;
23 ExpandResult::Ready(Box::new(base::MacEager {
24 expr: Some(Box::new(ast::Expr {
25 id,
26 kind: ast::ExprKind::DirectConstArg(expr.clone()),
27 span,
28 attrs: Default::default(),
29 tokens: None,
30 })),
31 ty: Some(Box::new(ast::Ty { id, kind: ast::TyKind::DirectConstArg(expr), span })),
32 ..Default::default()
33 }))
34}