@@ -133,6 +133,8 @@ expansions! {
133
133
"trait item" , . make_trait_items, lift . fold_trait_item, lift . visit_trait_item;
134
134
ImplItems : SmallVector <ast:: ImplItem > [ SmallVector , ast:: ImplItem ] ,
135
135
"impl item" , . make_impl_items, lift . fold_impl_item, lift . visit_impl_item;
136
+ ForeignItems : SmallVector <ast:: ForeignItem > [ SmallVector , ast:: ForeignItem ] ,
137
+ "foreign item" , . make_foreign_items, lift . fold_foreign_item, lift . visit_foreign_item;
136
138
}
137
139
138
140
impl ExpansionKind {
@@ -149,6 +151,8 @@ impl ExpansionKind {
149
151
Expansion :: ImplItems ( items. map ( Annotatable :: expect_impl_item) . collect ( ) ) ,
150
152
ExpansionKind :: TraitItems =>
151
153
Expansion :: TraitItems ( items. map ( Annotatable :: expect_trait_item) . collect ( ) ) ,
154
+ ExpansionKind :: ForeignItems =>
155
+ Expansion :: ForeignItems ( items. map ( Annotatable :: expect_foreign_item) . collect ( ) ) ,
152
156
_ => unreachable ! ( ) ,
153
157
}
154
158
}
@@ -435,6 +439,11 @@ impl<'a, 'b> MacroExpander<'a, 'b> {
435
439
Annotatable :: ImplItem ( item) => {
436
440
Annotatable :: ImplItem ( item. map ( |item| cfg. fold_impl_item ( item) . pop ( ) . unwrap ( ) ) )
437
441
}
442
+ Annotatable :: ForeignItem ( item) => {
443
+ Annotatable :: ForeignItem (
444
+ item. map ( |item| cfg. fold_foreign_item ( item) . pop ( ) . unwrap ( ) )
445
+ )
446
+ }
438
447
Annotatable :: Stmt ( stmt) => {
439
448
Annotatable :: Stmt ( stmt. map ( |stmt| cfg. fold_stmt ( stmt) . pop ( ) . unwrap ( ) ) )
440
449
}
@@ -509,6 +518,7 @@ impl<'a, 'b> MacroExpander<'a, 'b> {
509
518
Annotatable :: Item ( item) => token:: NtItem ( item) ,
510
519
Annotatable :: TraitItem ( item) => token:: NtTraitItem ( item. into_inner ( ) ) ,
511
520
Annotatable :: ImplItem ( item) => token:: NtImplItem ( item. into_inner ( ) ) ,
521
+ Annotatable :: ForeignItem ( item) => token:: NtForeignItem ( item. into_inner ( ) ) ,
512
522
Annotatable :: Stmt ( stmt) => token:: NtStmt ( stmt. into_inner ( ) ) ,
513
523
Annotatable :: Expr ( expr) => token:: NtExpr ( expr) ,
514
524
} ) ) . into ( ) ;
@@ -793,6 +803,15 @@ impl<'a> Parser<'a> {
793
803
}
794
804
Expansion :: ImplItems ( items)
795
805
}
806
+ ExpansionKind :: ForeignItems => {
807
+ let mut items = SmallVector :: new ( ) ;
808
+ while self . token != token:: Eof {
809
+ if let Some ( item) = self . parse_foreign_item ( ) ? {
810
+ items. push ( item) ;
811
+ }
812
+ }
813
+ Expansion :: ForeignItems ( items)
814
+ }
796
815
ExpansionKind :: Stmts => {
797
816
let mut stmts = SmallVector :: new ( ) ;
798
817
while self . token != token:: Eof &&
@@ -1166,6 +1185,44 @@ impl<'a, 'b> Folder for InvocationCollector<'a, 'b> {
1166
1185
noop_fold_foreign_mod ( self . cfg . configure_foreign_mod ( foreign_mod) , self )
1167
1186
}
1168
1187
1188
+ fn fold_foreign_item ( & mut self ,
1189
+ foreign_item : ast:: ForeignItem ) -> SmallVector < ast:: ForeignItem > {
1190
+ let ( attr, traits, foreign_item) = self . classify_item ( foreign_item) ;
1191
+
1192
+ let explain = if self . cx . ecfg . proc_macro_enabled ( ) {
1193
+ feature_gate:: EXPLAIN_PROC_MACROS_IN_EXTERN
1194
+ } else {
1195
+ feature_gate:: EXPLAIN_MACROS_IN_EXTERN
1196
+ } ;
1197
+
1198
+ if attr. is_some ( ) || !traits. is_empty ( ) {
1199
+ if !self . cx . ecfg . macros_in_extern_enabled ( ) {
1200
+ if let Some ( ref attr) = attr {
1201
+ emit_feature_err ( & self . cx . parse_sess , "macros_in_extern" , attr. span ,
1202
+ GateIssue :: Language , explain) ;
1203
+ }
1204
+ }
1205
+
1206
+ let item = Annotatable :: ForeignItem ( P ( foreign_item) ) ;
1207
+ return self . collect_attr ( attr, traits, item, ExpansionKind :: ForeignItems )
1208
+ . make_foreign_items ( ) ;
1209
+ }
1210
+
1211
+ if let ast:: ForeignItemKind :: Macro ( mac) = foreign_item. node {
1212
+ self . check_attributes ( & foreign_item. attrs ) ;
1213
+
1214
+ if !self . cx . ecfg . macros_in_extern_enabled ( ) {
1215
+ emit_feature_err ( & self . cx . parse_sess , "macros_in_extern" , foreign_item. span ,
1216
+ GateIssue :: Language , explain) ;
1217
+ }
1218
+
1219
+ return self . collect_bang ( mac, foreign_item. span , ExpansionKind :: ForeignItems )
1220
+ . make_foreign_items ( ) ;
1221
+ }
1222
+
1223
+ noop_fold_foreign_item ( foreign_item, self )
1224
+ }
1225
+
1169
1226
fn fold_item_kind ( & mut self , item : ast:: ItemKind ) -> ast:: ItemKind {
1170
1227
match item {
1171
1228
ast:: ItemKind :: MacroDef ( ..) => item,
@@ -1311,6 +1368,7 @@ impl<'feat> ExpansionConfig<'feat> {
1311
1368
fn enable_allow_internal_unstable = allow_internal_unstable,
1312
1369
fn enable_custom_derive = custom_derive,
1313
1370
fn proc_macro_enabled = proc_macro,
1371
+ fn macros_in_extern_enabled = macros_in_extern,
1314
1372
}
1315
1373
}
1316
1374
0 commit comments