@@ -684,15 +684,15 @@ fn contains_macro_use(fld: &mut MacroExpander, attrs: &[ast::Attribute]) -> bool
684
684
// logic as for expression-position macro invocations.
685
685
pub fn expand_item_mac ( it : P < ast:: Item > ,
686
686
fld : & mut MacroExpander ) -> SmallVector < P < ast:: Item > > {
687
- let ( extname, path_span, tts) = match it. node {
687
+ let ( extname, path_span, tts, span , attrs , ident ) = it . and_then ( |it| { match it. node {
688
688
ItemMac ( codemap:: Spanned {
689
- node : MacInvocTT ( ref pth, ref tts, _) ,
689
+ node : MacInvocTT ( pth, tts, _) ,
690
690
..
691
691
} ) => {
692
- ( pth. segments [ 0 ] . identifier . name , pth. span , ( * tts) . clone ( ) )
692
+ ( pth. segments [ 0 ] . identifier . name , pth. span , tts, it . span , it . attrs , it . ident )
693
693
}
694
694
_ => fld. cx . span_bug ( it. span , "invalid item macro invocation" )
695
- } ;
695
+ } } ) ;
696
696
697
697
let fm = fresh_mark ( ) ;
698
698
let items = {
@@ -706,56 +706,56 @@ pub fn expand_item_mac(it: P<ast::Item>,
706
706
}
707
707
708
708
Some ( rc) => match * rc {
709
- NormalTT ( ref expander, span , allow_internal_unstable) => {
710
- if it . ident . name != parse:: token:: special_idents:: invalid. name {
709
+ NormalTT ( ref expander, tt_span , allow_internal_unstable) => {
710
+ if ident. name != parse:: token:: special_idents:: invalid. name {
711
711
fld. cx
712
712
. span_err ( path_span,
713
713
& format ! ( "macro {}! expects no ident argument, given '{}'" ,
714
714
extname,
715
- it . ident) ) ;
715
+ ident) ) ;
716
716
return SmallVector :: zero ( ) ;
717
717
}
718
718
fld. cx . bt_push ( ExpnInfo {
719
- call_site : it . span ,
719
+ call_site : span,
720
720
callee : NameAndSpan {
721
721
format : MacroBang ( extname) ,
722
- span : span ,
722
+ span : tt_span ,
723
723
allow_internal_unstable : allow_internal_unstable,
724
724
}
725
725
} ) ;
726
726
// mark before expansion:
727
727
let marked_before = mark_tts ( & tts[ ..] , fm) ;
728
- expander. expand ( fld. cx , it . span , & marked_before[ ..] )
728
+ expander. expand ( fld. cx , span, & marked_before[ ..] )
729
729
}
730
- IdentTT ( ref expander, span , allow_internal_unstable) => {
731
- if it . ident . name == parse:: token:: special_idents:: invalid. name {
730
+ IdentTT ( ref expander, tt_span , allow_internal_unstable) => {
731
+ if ident. name == parse:: token:: special_idents:: invalid. name {
732
732
fld. cx . span_err ( path_span,
733
733
& format ! ( "macro {}! expects an ident argument" ,
734
734
extname) ) ;
735
735
return SmallVector :: zero ( ) ;
736
736
}
737
737
fld. cx . bt_push ( ExpnInfo {
738
- call_site : it . span ,
738
+ call_site : span,
739
739
callee : NameAndSpan {
740
740
format : MacroBang ( extname) ,
741
- span : span ,
741
+ span : tt_span ,
742
742
allow_internal_unstable : allow_internal_unstable,
743
743
}
744
744
} ) ;
745
745
// mark before expansion:
746
746
let marked_tts = mark_tts ( & tts[ ..] , fm) ;
747
- expander. expand ( fld. cx , it . span , it . ident , marked_tts)
747
+ expander. expand ( fld. cx , span, ident, marked_tts)
748
748
}
749
749
MacroRulesTT => {
750
- if it . ident . name == parse:: token:: special_idents:: invalid. name {
750
+ if ident. name == parse:: token:: special_idents:: invalid. name {
751
751
fld. cx . span_err ( path_span,
752
752
& format ! ( "macro_rules! expects an ident argument" )
753
753
) ;
754
754
return SmallVector :: zero ( ) ;
755
755
}
756
756
757
757
fld. cx . bt_push ( ExpnInfo {
758
- call_site : it . span ,
758
+ call_site : span,
759
759
callee : NameAndSpan {
760
760
format : MacroBang ( extname) ,
761
761
span : None ,
@@ -767,7 +767,7 @@ pub fn expand_item_mac(it: P<ast::Item>,
767
767
} ) ;
768
768
// DON'T mark before expansion.
769
769
770
- let allow_internal_unstable = attr:: contains_name ( & it . attrs ,
770
+ let allow_internal_unstable = attr:: contains_name ( & attrs,
771
771
"allow_internal_unstable" ) ;
772
772
773
773
// ensure any #[allow_internal_unstable]s are
@@ -777,18 +777,19 @@ pub fn expand_item_mac(it: P<ast::Item>,
777
777
feature_gate:: emit_feature_err (
778
778
& fld. cx . parse_sess . span_diagnostic ,
779
779
"allow_internal_unstable" ,
780
- it . span ,
780
+ span,
781
781
feature_gate:: GateIssue :: Language ,
782
782
feature_gate:: EXPLAIN_ALLOW_INTERNAL_UNSTABLE )
783
783
}
784
784
785
+ let export = attr:: contains_name ( & attrs, "macro_export" ) ;
785
786
let def = ast:: MacroDef {
786
- ident : it . ident ,
787
- attrs : it . attrs . clone ( ) ,
787
+ ident : ident,
788
+ attrs : attrs,
788
789
id : ast:: DUMMY_NODE_ID ,
789
- span : it . span ,
790
+ span : span,
790
791
imported_from : None ,
791
- export : attr :: contains_name ( & it . attrs , "macro_export" ) ,
792
+ export : export ,
792
793
use_locally : true ,
793
794
allow_internal_unstable : allow_internal_unstable,
794
795
body : tts,
@@ -800,7 +801,7 @@ pub fn expand_item_mac(it: P<ast::Item>,
800
801
return SmallVector :: zero ( ) ;
801
802
}
802
803
_ => {
803
- fld. cx . span_err ( it . span ,
804
+ fld. cx . span_err ( span,
804
805
& format ! ( "{}! is not legal in item position" ,
805
806
extname) ) ;
806
807
return SmallVector :: zero ( ) ;
0 commit comments