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