@@ -22,11 +22,11 @@ pub use self::ReprAttr::*;
2222pub use self :: StabilityLevel :: * ;
2323
2424use ast;
25- use ast:: { AttrId , Attribute , Name , Ident , Path , PathSegment } ;
25+ use ast:: { AttrId , Attribute , AttrStyle , Name , Ident , Path , PathSegment } ;
2626use ast:: { MetaItem , MetaItemKind , NestedMetaItem , NestedMetaItemKind } ;
2727use ast:: { Lit , LitKind , Expr , ExprKind , Item , Local , Stmt , StmtKind , GenericParam } ;
2828use codemap:: { BytePos , Spanned , respan, dummy_spanned} ;
29- use syntax_pos:: Span ;
29+ use syntax_pos:: { FileName , Span } ;
3030use parse:: lexer:: comments:: { doc_comment_style, strip_doc_comment_decoration} ;
3131use parse:: parser:: Parser ;
3232use parse:: { self , ParseSess , PResult } ;
@@ -821,3 +821,33 @@ derive_has_attrs! {
821821 Item , Expr , Local , ast:: ForeignItem , ast:: StructField , ast:: ImplItem , ast:: TraitItem , ast:: Arm ,
822822 ast:: Field , ast:: FieldPat , ast:: Variant_
823823}
824+
825+ pub fn inject ( mut krate : ast:: Crate , parse_sess : & ParseSess , attrs : & [ String ] ) -> ast:: Crate {
826+ for raw_attr in attrs {
827+ let mut parser = parse:: new_parser_from_source_str (
828+ parse_sess,
829+ FileName :: CliCrateAttr ,
830+ raw_attr. clone ( ) ,
831+ ) ;
832+
833+ let start_span = parser. span ;
834+ let ( path, tokens) = panictry ! ( parser. parse_path_and_tokens( ) ) ;
835+ let end_span = parser. span ;
836+ if parser. token != token:: Eof {
837+ parse_sess. span_diagnostic
838+ . span_err ( start_span. to ( end_span) , "invalid crate attribute" ) ;
839+ continue ;
840+ }
841+
842+ krate. attrs . push ( Attribute {
843+ id : mk_attr_id ( ) ,
844+ style : AttrStyle :: Inner ,
845+ path,
846+ tokens,
847+ is_sugared_doc : false ,
848+ span : start_span. to ( end_span) ,
849+ } ) ;
850+ }
851+
852+ krate
853+ }
0 commit comments