Skip to main content

rustc_builtin_macros/
direct_const_arg.rs

1use 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}