@@ -13,7 +13,7 @@ pub use self::SyntaxExtension::*;
1313use ast;
1414use ast:: { Name , PatKind } ;
1515use attr:: HasAttrs ;
16- use codemap:: { self , CodeMap , ExpnInfo } ;
16+ use codemap:: { self , CodeMap , ExpnInfo , Spanned , respan } ;
1717use syntax_pos:: { Span , ExpnId , NO_EXPANSION } ;
1818use errors:: DiagnosticBuilder ;
1919use ext;
@@ -805,8 +805,8 @@ impl<'a> ExtCtxt<'a> {
805805/// Extract a string literal from the macro expanded version of `expr`,
806806/// emitting `err_msg` if `expr` is not a string literal. This does not stop
807807/// 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 ) > > {
810810 // Update `expr.span`'s expn_id now in case expr is an `include!` macro invocation.
811811 let expr = expr. map ( |mut expr| {
812812 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)
817817 let expr = cx. expander ( ) . fold_expr ( expr) ;
818818 match expr. node {
819819 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) ) ) ,
821821 _ => cx. span_err ( l. span , err_msg)
822822 } ,
823823 _ => cx. span_err ( expr. span , err_msg)
824824 }
825825 None
826826}
827827
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+
828833/// Non-fatally assert that `tts` is empty. Note that this function
829834/// returns even when `tts` is non-empty, macros that *need* to stop
830835/// compilation should call
@@ -851,7 +856,7 @@ pub fn get_single_str_from_tts(cx: &mut ExtCtxt,
851856 cx. span_err ( sp, & format ! ( "{} takes 1 argument" , name) ) ;
852857 return None
853858 }
854- let ret = cx . expander ( ) . fold_expr ( panictry ! ( p. parse_expr( ) ) ) ;
859+ let ret = panictry ! ( p. parse_expr( ) ) ;
855860 if p. token != token:: Eof {
856861 cx. span_err ( sp, & format ! ( "{} takes 1 argument" , name) ) ;
857862 }
0 commit comments