@@ -12,8 +12,8 @@ use thin_vec::{ThinVec, thin_vec};
1212use crate :: errors:: {
1313 EiiExternTargetExpectedList , EiiExternTargetExpectedMacro , EiiExternTargetExpectedUnsafe ,
1414 EiiMacroExpectedMaxOneArgument , EiiOnlyOnce , EiiSharedMacroInStatementPosition ,
15- EiiSharedMacroTarget , EiiStaticArgumentRequired , EiiStaticDefault ,
16- EiiStaticMultipleImplementations , EiiStaticMutable ,
15+ EiiSharedMacroTarget , EiiStaticArgumentRequired , EiiStaticMultipleImplementations ,
16+ EiiStaticMutable ,
1717} ;
1818
1919/// ```rust
@@ -86,14 +86,6 @@ fn eii_(
8686 let ( item_span, foreign_item_name) = match kind {
8787 ItemKind :: Fn ( func) => ( func. sig . span , func. ident ) ,
8888 ItemKind :: Static ( stat) => {
89- // Statics with a default are not supported yet
90- if let Some ( stat_body) = & stat. expr {
91- ecx. dcx ( ) . emit_err ( EiiStaticDefault {
92- span : stat_body. span ,
93- name : path_to_string ( & meta_item. path ) ,
94- } ) ;
95- return vec ! [ ] ;
96- }
9789 // Statics must have an explicit name for the eii
9890 if meta_item. is_word ( ) {
9991 ecx. dcx ( ) . emit_err ( EiiStaticArgumentRequired {
@@ -137,18 +129,16 @@ fn eii_(
137129
138130 let mut module_items = Vec :: new ( ) ;
139131
140- if let ItemKind :: Fn ( func) = kind
141- && func. body . is_some ( )
142- {
143- module_items. push ( generate_default_func_impl (
144- ecx,
145- & func,
146- impl_unsafe,
147- macro_name,
148- eii_attr_span,
149- item_span,
150- foreign_item_name,
151- ) )
132+ if let Some ( default_impl) = generate_default_impl (
133+ ecx,
134+ kind,
135+ impl_unsafe,
136+ macro_name,
137+ eii_attr_span,
138+ item_span,
139+ foreign_item_name,
140+ ) {
141+ module_items. push ( default_impl) ;
152142 }
153143
154144 module_items. push ( generate_foreign_item (
@@ -220,20 +210,33 @@ fn filter_attrs_for_multiple_eii_attr(
220210 . collect ( )
221211}
222212
223- fn generate_default_func_impl (
213+ fn generate_default_impl (
224214 ecx : & mut ExtCtxt < ' _ > ,
225- func : & ast :: Fn ,
215+ item_kind : & ItemKind ,
226216 impl_unsafe : bool ,
227217 macro_name : Ident ,
228218 eii_attr_span : Span ,
229219 item_span : Span ,
230220 foreign_item_name : Ident ,
231- ) -> Box < ast:: Item > {
221+ ) -> Option < Box < ast:: Item > > {
222+ match item_kind {
223+ ItemKind :: Fn ( func) => {
224+ if func. body . is_none ( ) {
225+ return None ;
226+ }
227+ }
228+ ItemKind :: Static ( stat) => {
229+ if stat. expr . is_none ( ) {
230+ return None ;
231+ }
232+ }
233+ _ => unreachable ! ( "Target was checked earlier" ) ,
234+ } ;
235+
232236 // FIXME: re-add some original attrs
233237 let attrs = ThinVec :: new ( ) ;
234238
235- let mut default_func = func. clone ( ) ;
236- default_func. eii_impls . push ( EiiImpl {
239+ let eii_impl = EiiImpl {
237240 node_id : DUMMY_NODE_ID ,
238241 inner_span : macro_name. span ,
239242 eii_macro_path : ast:: Path :: from_ident ( macro_name) ,
@@ -253,7 +256,18 @@ fn generate_default_func_impl(
253256 ) ,
254257 impl_unsafe,
255258 } ) ,
256- } ) ;
259+ } ;
260+
261+ let mut item_kind = item_kind. clone ( ) ;
262+ match & mut item_kind {
263+ ItemKind :: Fn ( func) => {
264+ func. eii_impls . push ( eii_impl) ;
265+ }
266+ ItemKind :: Static ( stat) => {
267+ stat. eii_impls . push ( eii_impl) ;
268+ }
269+ _ => unreachable ! ( "Target was checked earlier" ) ,
270+ } ;
257271
258272 let anon_mod = |span : Span , stmts : ThinVec < ast:: Stmt > | {
259273 let unit = ecx. ty ( item_span, ast:: TyKind :: Tup ( ThinVec :: new ( ) ) ) ;
@@ -267,15 +281,12 @@ fn generate_default_func_impl(
267281 } ;
268282
269283 // const _: () = {
270- // <orig fn >
284+ // <orig item >
271285 // }
272- anon_mod (
286+ Some ( anon_mod (
273287 item_span,
274- thin_vec ! [ ecx. stmt_item(
275- item_span,
276- ecx. item( item_span, attrs, ItemKind :: Fn ( Box :: new( default_func) ) )
277- ) , ] ,
278- )
288+ thin_vec ! [ ecx. stmt_item( item_span, ecx. item( item_span, attrs, item_kind) ) ] ,
289+ ) )
279290}
280291
281292/// Generates a foreign item, like
@@ -362,6 +373,8 @@ fn generate_foreign_static(mut stat: Box<ast::StaticItem>) -> ast::ForeignItemKi
362373 stat. safety = ast:: Safety :: Safe ( stat. ident . span ) ;
363374 }
364375
376+ stat. expr = None ;
377+
365378 ast:: ForeignItemKind :: Static ( stat)
366379}
367380
0 commit comments