1+ #![ deny( rustc:: untranslatable_diagnostic) ]
2+
3+ use crate :: errors:: {
4+ ArgumentNotAttributes , AttrNoArguments , AttributeMetaItem , AttributeSingleWord ,
5+ AttributesWrongForm , CannotBeNameOfMacro , ExpectedCommaInList , HelperAttributeNameInvalid ,
6+ MacroBodyStability , MacroConstStability , NotAMetaItem , OnlyOneArgument , OnlyOneWord ,
7+ ResolveRelativePath , TakesNoArguments ,
8+ } ;
19use crate :: expand:: { self , AstFragment , Invocation } ;
210use crate :: module:: DirOwnership ;
311
@@ -789,26 +797,16 @@ impl SyntaxExtension {
789797 . unwrap_or_else ( || ( None , helper_attrs) ) ;
790798 let ( stability, const_stability, body_stability) = attr:: find_stability ( & sess, attrs, span) ;
791799 if let Some ( ( _, sp) ) = const_stability {
792- sess. parse_sess
793- . span_diagnostic
794- . struct_span_err ( sp, "macros cannot have const stability attributes" )
795- . span_label ( sp, "invalid const stability attribute" )
796- . span_label (
797- sess. source_map ( ) . guess_head_span ( span) ,
798- "const stability attribute affects this macro" ,
799- )
800- . emit ( ) ;
800+ sess. emit_err ( MacroConstStability {
801+ span : sp,
802+ head_span : sess. source_map ( ) . guess_head_span ( span) ,
803+ } ) ;
801804 }
802805 if let Some ( ( _, sp) ) = body_stability {
803- sess. parse_sess
804- . span_diagnostic
805- . struct_span_err ( sp, "macros cannot have body stability attributes" )
806- . span_label ( sp, "invalid body stability attribute" )
807- . span_label (
808- sess. source_map ( ) . guess_head_span ( span) ,
809- "body stability attribute affects this macro" ,
810- )
811- . emit ( ) ;
806+ sess. emit_err ( MacroBodyStability {
807+ span : sp,
808+ head_span : sess. source_map ( ) . guess_head_span ( span) ,
809+ } ) ;
812810 }
813811
814812 SyntaxExtension {
@@ -1200,13 +1198,11 @@ pub fn resolve_path(
12001198 . expect ( "attempting to resolve a file path in an external file" ) ,
12011199 FileName :: DocTest ( path, _) => path,
12021200 other => {
1203- return Err ( parse_sess . span_diagnostic . struct_span_err (
1201+ return Err ( ResolveRelativePath {
12041202 span,
1205- & format ! (
1206- "cannot resolve relative path in non-file source `{}`" ,
1207- parse_sess. source_map( ) . filename_for_diagnostics( & other)
1208- ) ,
1209- ) ) ;
1203+ path : parse_sess. source_map ( ) . filename_for_diagnostics ( & other) . to_string ( ) ,
1204+ }
1205+ . into_diagnostic ( & parse_sess. span_diagnostic ) ) ;
12101206 }
12111207 } ;
12121208 result. pop ( ) ;
@@ -1222,6 +1218,8 @@ pub fn resolve_path(
12221218/// The returned bool indicates whether an applicable suggestion has already been
12231219/// added to the diagnostic to avoid emitting multiple suggestions. `Err(None)`
12241220/// indicates that an ast error was encountered.
1221+ // FIXME(Nilstrieb) Make this function setup translatable
1222+ #[ allow( rustc:: untranslatable_diagnostic) ]
12251223pub fn expr_to_spanned_string < ' a > (
12261224 cx : & ' a mut ExtCtxt < ' _ > ,
12271225 expr : P < ast:: Expr > ,
@@ -1280,9 +1278,9 @@ pub fn expr_to_string(
12801278/// compilation should call
12811279/// `cx.parse_sess.span_diagnostic.abort_if_errors()` (this should be
12821280/// done as rarely as possible).
1283- pub fn check_zero_tts ( cx : & ExtCtxt < ' _ > , sp : Span , tts : TokenStream , name : & str ) {
1281+ pub fn check_zero_tts ( cx : & ExtCtxt < ' _ > , span : Span , tts : TokenStream , name : & str ) {
12841282 if !tts. is_empty ( ) {
1285- cx. span_err ( sp , & format ! ( "{} takes no arguments" , name) ) ;
1283+ cx. emit_err ( TakesNoArguments { span , name } ) ;
12861284 }
12871285}
12881286
@@ -1304,31 +1302,27 @@ pub fn parse_expr(p: &mut parser::Parser<'_>) -> Option<P<ast::Expr>> {
13041302/// expect exactly one string literal, or emit an error and return `None`.
13051303pub fn get_single_str_from_tts (
13061304 cx : & mut ExtCtxt < ' _ > ,
1307- sp : Span ,
1305+ span : Span ,
13081306 tts : TokenStream ,
13091307 name : & str ,
13101308) -> Option < Symbol > {
13111309 let mut p = cx. new_parser_from_tts ( tts) ;
13121310 if p. token == token:: Eof {
1313- cx. span_err ( sp , & format ! ( "{} takes 1 argument" , name) ) ;
1311+ cx. emit_err ( OnlyOneArgument { span , name } ) ;
13141312 return None ;
13151313 }
13161314 let ret = parse_expr ( & mut p) ?;
13171315 let _ = p. eat ( & token:: Comma ) ;
13181316
13191317 if p. token != token:: Eof {
1320- cx. span_err ( sp , & format ! ( "{} takes 1 argument" , name) ) ;
1318+ cx. emit_err ( OnlyOneArgument { span , name } ) ;
13211319 }
13221320 expr_to_string ( cx, ret, "argument must be a string literal" ) . map ( |( s, _) | s)
13231321}
13241322
13251323/// Extracts comma-separated expressions from `tts`.
13261324/// On error, emit it, and return `None`.
1327- pub fn get_exprs_from_tts (
1328- cx : & mut ExtCtxt < ' _ > ,
1329- sp : Span ,
1330- tts : TokenStream ,
1331- ) -> Option < Vec < P < ast:: Expr > > > {
1325+ pub fn get_exprs_from_tts ( cx : & mut ExtCtxt < ' _ > , tts : TokenStream ) -> Option < Vec < P < ast:: Expr > > > {
13321326 let mut p = cx. new_parser_from_tts ( tts) ;
13331327 let mut es = Vec :: new ( ) ;
13341328 while p. token != token:: Eof {
@@ -1343,7 +1337,7 @@ pub fn get_exprs_from_tts(
13431337 continue ;
13441338 }
13451339 if p. token != token:: Eof {
1346- cx. span_err ( sp , "expected token: `,`" ) ;
1340+ cx. emit_err ( ExpectedCommaInList { span : p . token . span } ) ;
13471341 return None ;
13481342 }
13491343 }
@@ -1353,64 +1347,58 @@ pub fn get_exprs_from_tts(
13531347pub fn parse_macro_name_and_helper_attrs (
13541348 diag : & rustc_errors:: Handler ,
13551349 attr : & Attribute ,
1356- descr : & str ,
1350+ macro_type : & str ,
13571351) -> Option < ( Symbol , Vec < Symbol > ) > {
13581352 // Once we've located the `#[proc_macro_derive]` attribute, verify
13591353 // that it's of the form `#[proc_macro_derive(Foo)]` or
13601354 // `#[proc_macro_derive(Foo, attributes(A, ..))]`
13611355 let list = attr. meta_item_list ( ) ?;
13621356 if list. len ( ) != 1 && list. len ( ) != 2 {
1363- diag. span_err ( attr. span , "attribute must have either one or two arguments" ) ;
1357+ diag. emit_err ( AttrNoArguments { span : attr. span } ) ;
13641358 return None ;
13651359 }
13661360 let Some ( trait_attr) = list[ 0 ] . meta_item ( ) else {
1367- diag. span_err ( list[ 0 ] . span ( ) , "not a meta item" ) ;
1361+ diag. emit_err ( NotAMetaItem { span : list[ 0 ] . span ( ) } ) ;
13681362 return None ;
13691363 } ;
13701364 let trait_ident = match trait_attr. ident ( ) {
13711365 Some ( trait_ident) if trait_attr. is_word ( ) => trait_ident,
13721366 _ => {
1373- diag. span_err ( trait_attr. span , "must only be one word" ) ;
1367+ diag. emit_err ( OnlyOneWord { span : trait_attr. span } ) ;
13741368 return None ;
13751369 }
13761370 } ;
13771371
13781372 if !trait_ident. name . can_be_raw ( ) {
1379- diag. span_err (
1380- trait_attr. span ,
1381- & format ! ( "`{}` cannot be a name of {} macro" , trait_ident, descr) ,
1382- ) ;
1373+ diag. emit_err ( CannotBeNameOfMacro { span : trait_attr. span , trait_ident, macro_type } ) ;
13831374 }
13841375
13851376 let attributes_attr = list. get ( 1 ) ;
13861377 let proc_attrs: Vec < _ > = if let Some ( attr) = attributes_attr {
13871378 if !attr. has_name ( sym:: attributes) {
1388- diag. span_err ( attr. span ( ) , "second argument must be `attributes`" ) ;
1379+ diag. emit_err ( ArgumentNotAttributes { span : attr. span ( ) } ) ;
13891380 }
13901381 attr. meta_item_list ( )
13911382 . unwrap_or_else ( || {
1392- diag. span_err ( attr . span ( ) , "attribute must be of form: `attributes(foo, bar)`" ) ;
1383+ diag. emit_err ( AttributesWrongForm { span : attr . span ( ) } ) ;
13931384 & [ ]
13941385 } )
13951386 . iter ( )
13961387 . filter_map ( |attr| {
13971388 let Some ( attr) = attr. meta_item ( ) else {
1398- diag. span_err ( attr. span ( ) , "not a meta item" ) ;
1389+ diag. emit_err ( AttributeMetaItem { span : attr. span ( ) } ) ;
13991390 return None ;
14001391 } ;
14011392
14021393 let ident = match attr. ident ( ) {
14031394 Some ( ident) if attr. is_word ( ) => ident,
14041395 _ => {
1405- diag. span_err ( attr. span , "must only be one word" ) ;
1396+ diag. emit_err ( AttributeSingleWord { span : attr. span } ) ;
14061397 return None ;
14071398 }
14081399 } ;
14091400 if !ident. name . can_be_raw ( ) {
1410- diag. span_err (
1411- attr. span ,
1412- & format ! ( "`{}` cannot be a name of derive helper attribute" , ident) ,
1413- ) ;
1401+ diag. emit_err ( HelperAttributeNameInvalid { span : attr. span , name : ident } ) ;
14141402 }
14151403
14161404 Some ( ident. name )
0 commit comments