Skip to main content

rustc_builtin_macros/
test_binder_constraints.rs

1use rustc_ast::tokenstream::TokenStream;
2use rustc_ast::{AttrVec, VisibilityKind, ast, token};
3use rustc_expand::base::{DummyResult, ExpandResult, ExtCtxt, MacEager, MacroExpanderResult};
4use rustc_span::Span;
5use smallvec::SmallVec;
6
7use crate::diagnostics;
8
9pub(crate) fn expand<'cx>(
10    cx: &'cx mut ExtCtxt<'_>,
11    span: Span,
12    tts: TokenStream,
13) -> MacroExpanderResult<'cx> {
14    let name = "test_binder_constraints!";
15    let mut p = cx.new_parser_from_tts(tts);
16    if p.token == token::Eof {
17        cx.dcx().emit_err(diagnostics::OnlyOneArgument { span, name });
18    };
19    let item = match p.parse_test_binder_constraints() {
20        Ok(expr) => expr,
21        Err(diag) => {
22            let guar = diag.emit();
23            return ExpandResult::Ready(DummyResult::any(span, guar));
24        }
25    };
26    if p.token != token::Eof {
27        cx.dcx().emit_err(diagnostics::OnlyOneArgument { span: p.token.span, name });
28    }
29    let item = Box::new(ast::Item {
30        attrs: AttrVec::default(),
31        id: ast::DUMMY_NODE_ID,
32        span,
33        vis: ast::Visibility { kind: VisibilityKind::Inherited, span: span.shrink_to_lo() },
34        kind: ast::ItemKind::TestBinderConstraints(item),
35        tokens: None,
36    });
37    rustc_expand::base::ExpandResult::Ready(Box::new(MacEager {
38        expr: None,
39        items: Some(SmallVec::from_buf([item])),
40        ty: None,
41    }))
42}