1 use errors::DiagnosticBuilder;
3 use syntax::ast::{self, *};
4 use syntax::source_map::Spanned;
5 use syntax::ext::base::*;
6 use syntax::ext::build::AstBuilder;
7 use syntax::parse::token;
8 use syntax::print::pprust;
10 use syntax::symbol::Symbol;
11 use syntax::tokenstream::{TokenStream, TokenTree};
12 use syntax_pos::{Span, DUMMY_SP};
14 pub fn expand_assert<'cx>(
15 cx: &'cx mut ExtCtxt<'_>,
18 ) -> Box<dyn MacResult + 'cx> {
19 let Assert { cond_expr, custom_message } = match parse_assert(cx, sp, tts) {
23 return DummyResult::expr(sp);
27 let sp = sp.apply_mark(cx.current_expansion.mark);
28 let panic_call = Mac_ {
29 path: Path::from_ident(Ident::new(Symbol::intern("panic"), sp)),
30 tts: custom_message.unwrap_or_else(|| {
31 TokenStream::from(TokenTree::Token(
34 token::Lit::Str_(Name::intern(&format!(
35 "assertion failed: {}",
36 pprust::expr_to_string(&cond_expr).escape_debug()
42 delim: MacDelimiter::Parenthesis,
44 let if_expr = cx.expr_if(
46 cx.expr(sp, ExprKind::Unary(UnOp::Not, cond_expr)),
49 ExprKind::Mac(Spanned {
56 MacEager::expr(if_expr)
60 cond_expr: P<ast::Expr>,
61 custom_message: Option<TokenStream>,
68 ) -> Result<Assert, DiagnosticBuilder<'a>> {
69 let mut parser = cx.new_parser_from_tts(tts);
71 if parser.token == token::Eof {
72 let mut err = cx.struct_span_err(sp, "macro requires a boolean expression as an argument");
73 err.span_label(sp, "boolean expression required");
78 cond_expr: parser.parse_expr()?,
79 custom_message: if parser.eat(&token::Comma) {
80 let ts = parser.parse_tokens();