rustc_builtin_macros/
test_binder_constraints.rs1use 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}