@@ -13,7 +13,7 @@ pub use self::SyntaxExtension::*;
13
13
use ast;
14
14
use ast:: { Name , PatKind } ;
15
15
use attr:: HasAttrs ;
16
- use codemap:: { self , CodeMap , ExpnInfo } ;
16
+ use codemap:: { self , CodeMap , ExpnInfo , Spanned , respan } ;
17
17
use syntax_pos:: { Span , ExpnId , NO_EXPANSION } ;
18
18
use errors:: DiagnosticBuilder ;
19
19
use ext;
@@ -805,8 +805,8 @@ impl<'a> ExtCtxt<'a> {
805
805
/// Extract a string literal from the macro expanded version of `expr`,
806
806
/// emitting `err_msg` if `expr` is not a string literal. This does not stop
807
807
/// compilation on error, merely emits a non-fatal error and returns None.
808
- pub fn expr_to_string ( cx : & mut ExtCtxt , expr : P < ast:: Expr > , err_msg : & str )
809
- -> Option < ( InternedString , ast:: StrStyle ) > {
808
+ pub fn expr_to_spanned_string ( cx : & mut ExtCtxt , expr : P < ast:: Expr > , err_msg : & str )
809
+ -> Option < Spanned < ( InternedString , ast:: StrStyle ) > > {
810
810
// Update `expr.span`'s expn_id now in case expr is an `include!` macro invocation.
811
811
let expr = expr. map ( |mut expr| {
812
812
expr. span . expn_id = cx. backtrace ;
@@ -817,14 +817,19 @@ pub fn expr_to_string(cx: &mut ExtCtxt, expr: P<ast::Expr>, err_msg: &str)
817
817
let expr = cx. expander ( ) . fold_expr ( expr) ;
818
818
match expr. node {
819
819
ast:: ExprKind :: Lit ( ref l) => match l. node {
820
- ast:: LitKind :: Str ( ref s, style) => return Some ( ( ( * s ) . clone ( ) , style) ) ,
820
+ ast:: LitKind :: Str ( ref s, style) => return Some ( respan ( expr . span , ( s . clone ( ) , style) ) ) ,
821
821
_ => cx. span_err ( l. span , err_msg)
822
822
} ,
823
823
_ => cx. span_err ( expr. span , err_msg)
824
824
}
825
825
None
826
826
}
827
827
828
+ pub fn expr_to_string ( cx : & mut ExtCtxt , expr : P < ast:: Expr > , err_msg : & str )
829
+ -> Option < ( InternedString , ast:: StrStyle ) > {
830
+ expr_to_spanned_string ( cx, expr, err_msg) . map ( |s| s. node )
831
+ }
832
+
828
833
/// Non-fatally assert that `tts` is empty. Note that this function
829
834
/// returns even when `tts` is non-empty, macros that *need* to stop
830
835
/// compilation should call
@@ -851,7 +856,7 @@ pub fn get_single_str_from_tts(cx: &mut ExtCtxt,
851
856
cx. span_err ( sp, & format ! ( "{} takes 1 argument" , name) ) ;
852
857
return None
853
858
}
854
- let ret = cx . expander ( ) . fold_expr ( panictry ! ( p. parse_expr( ) ) ) ;
859
+ let ret = panictry ! ( p. parse_expr( ) ) ;
855
860
if p. token != token:: Eof {
856
861
cx. span_err ( sp, & format ! ( "{} takes 1 argument" , name) ) ;
857
862
}
0 commit comments