diff options
Diffstat (limited to 'src/libsyntax/ext')
| -rw-r--r-- | src/libsyntax/ext/base.rs | 25 |
1 files changed, 15 insertions, 10 deletions
diff --git a/src/libsyntax/ext/base.rs b/src/libsyntax/ext/base.rs index 5ec44fb5898..b55c4f99206 100644 --- a/src/libsyntax/ext/base.rs +++ b/src/libsyntax/ext/base.rs @@ -959,29 +959,34 @@ impl<'a> ExtCtxt<'a> { /// Extract a string literal from the macro expanded version of `expr`, /// emitting `err_msg` if `expr` is not a string literal. This does not stop /// compilation on error, merely emits a non-fatal error and returns None. -pub fn expr_to_spanned_string(cx: &mut ExtCtxt, expr: P<ast::Expr>, err_msg: &str) - -> Option<Spanned<(Symbol, ast::StrStyle)>> { +pub fn expr_to_spanned_string<'a>( + cx: &'a mut ExtCtxt, + expr: P<ast::Expr>, + err_msg: &str, +) -> Result<Spanned<(Symbol, ast::StrStyle)>, DiagnosticBuilder<'a>> { // Update `expr.span`'s ctxt now in case expr is an `include!` macro invocation. let expr = expr.map(|mut expr| { expr.span = expr.span.apply_mark(cx.current_expansion.mark); expr }); - // we want to be able to handle e.g. concat("foo", "bar") + // we want to be able to handle e.g. `concat!("foo", "bar")` let expr = cx.expander().fold_expr(expr); - match expr.node { + Err(match expr.node { ast::ExprKind::Lit(ref l) => match l.node { - ast::LitKind::Str(s, style) => return Some(respan(expr.span, (s, style))), - _ => cx.span_err(l.span, err_msg) + ast::LitKind::Str(s, style) => return Ok(respan(expr.span, (s, style))), + _ => cx.struct_span_err(l.span, err_msg) }, - _ => cx.span_err(expr.span, err_msg) - } - None + _ => cx.struct_span_err(expr.span, err_msg) + }) } pub fn expr_to_string(cx: &mut ExtCtxt, expr: P<ast::Expr>, err_msg: &str) -> Option<(Symbol, ast::StrStyle)> { - expr_to_spanned_string(cx, expr, err_msg).map(|s| s.node) + expr_to_spanned_string(cx, expr, err_msg) + .map_err(|mut err| err.emit()) + .ok() + .map(|s| s.node) } /// Non-fatally assert that `tts` is empty. Note that this function |
