11//! Functions dealing with attributes and meta items.
22
3- use crate :: ast:: { AttrArgs , AttrArgsEq , AttrId , AttrItem , AttrKind , AttrStyle , AttrVec , Attribute } ;
3+ use crate :: ast:: {
4+ AttrArgs , AttrArgsEq , AttrId , AttrItem , AttrKind , AttrStyle , AttrVec , Attribute , Safety ,
5+ } ;
46use crate :: ast:: { DelimArgs , Expr , ExprKind , LitKind , MetaItemLit } ;
57use crate :: ast:: { MetaItem , MetaItemKind , NestedMetaItem , NormalAttr } ;
68use crate :: ast:: { Path , PathSegment , DUMMY_NODE_ID } ;
@@ -238,7 +240,12 @@ impl AttrItem {
238240 }
239241
240242 pub fn meta ( & self , span : Span ) -> Option < MetaItem > {
241- Some ( MetaItem { path : self . path . clone ( ) , kind : self . meta_kind ( ) ?, span } )
243+ Some ( MetaItem {
244+ unsafety : Safety :: Default ,
245+ path : self . path . clone ( ) ,
246+ kind : self . meta_kind ( ) ?,
247+ span,
248+ } )
242249 }
243250
244251 pub fn meta_kind ( & self ) -> Option < MetaItemKind > {
@@ -371,7 +378,10 @@ impl MetaItem {
371378 _ => path. span . hi ( ) ,
372379 } ;
373380 let span = path. span . with_hi ( hi) ;
374- Some ( MetaItem { path, kind, span } )
381+ // FIXME: This parses `unsafe()` not as unsafe attribute syntax in `MetaItem`,
382+ // but as a parenthesized list. This (and likely `MetaItem`) should be changed in
383+ // such a way that builtin macros don't accept extraneous `unsafe()`.
384+ Some ( MetaItem { unsafety : Safety :: Default , path, kind, span } )
375385 }
376386}
377387
@@ -555,11 +565,12 @@ pub fn mk_doc_comment(
555565pub fn mk_attr (
556566 g : & AttrIdGenerator ,
557567 style : AttrStyle ,
568+ unsafety : Safety ,
558569 path : Path ,
559570 args : AttrArgs ,
560571 span : Span ,
561572) -> Attribute {
562- mk_attr_from_item ( g, AttrItem { path, args, tokens : None } , None , style, span)
573+ mk_attr_from_item ( g, AttrItem { unsafety , path, args, tokens : None } , None , style, span)
563574}
564575
565576pub fn mk_attr_from_item (
@@ -577,15 +588,22 @@ pub fn mk_attr_from_item(
577588 }
578589}
579590
580- pub fn mk_attr_word ( g : & AttrIdGenerator , style : AttrStyle , name : Symbol , span : Span ) -> Attribute {
591+ pub fn mk_attr_word (
592+ g : & AttrIdGenerator ,
593+ style : AttrStyle ,
594+ unsafety : Safety ,
595+ name : Symbol ,
596+ span : Span ,
597+ ) -> Attribute {
581598 let path = Path :: from_ident ( Ident :: new ( name, span) ) ;
582599 let args = AttrArgs :: Empty ;
583- mk_attr ( g, style, path, args, span)
600+ mk_attr ( g, style, unsafety , path, args, span)
584601}
585602
586603pub fn mk_attr_nested_word (
587604 g : & AttrIdGenerator ,
588605 style : AttrStyle ,
606+ unsafety : Safety ,
589607 outer : Symbol ,
590608 inner : Symbol ,
591609 span : Span ,
@@ -601,12 +619,13 @@ pub fn mk_attr_nested_word(
601619 delim : Delimiter :: Parenthesis ,
602620 tokens : inner_tokens,
603621 } ) ;
604- mk_attr ( g, style, path, attr_args, span)
622+ mk_attr ( g, style, unsafety , path, attr_args, span)
605623}
606624
607625pub fn mk_attr_name_value_str (
608626 g : & AttrIdGenerator ,
609627 style : AttrStyle ,
628+ unsafety : Safety ,
610629 name : Symbol ,
611630 val : Symbol ,
612631 span : Span ,
@@ -621,7 +640,7 @@ pub fn mk_attr_name_value_str(
621640 } ) ;
622641 let path = Path :: from_ident ( Ident :: new ( name, span) ) ;
623642 let args = AttrArgs :: Eq ( span, AttrArgsEq :: Ast ( expr) ) ;
624- mk_attr ( g, style, path, args, span)
643+ mk_attr ( g, style, unsafety , path, args, span)
625644}
626645
627646pub fn filter_by_name ( attrs : & [ Attribute ] , name : Symbol ) -> impl Iterator < Item = & Attribute > {
0 commit comments