Skip to main content

rustc_builtin_macros/
test_binder_constraints.rs

1use rustc_ast::tokenstream::TokenStream;
2use rustc_ast::{AttrVec, 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_err();
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 = cx.item(span, AttrVec::default(), ast::ItemKind::TestBinderConstraints(item));
30    ExpandResult::Ready(Box::new(MacEager {
31        expr: None,
32        items: Some(SmallVec::from_buf([item])),
33        ty: None,
34    }))
35}