@@ -101,6 +101,10 @@ pub enum MetadataError {
101
101
#[ derive( Default , Deserialize ) ]
102
102
#[ serde( rename_all = "kebab-case" ) ]
103
103
pub struct Metadata {
104
+ /// Whether the current crate is a proc-macro (used by docs.rs to hack around cargo bugs).
105
+ #[ serde( default ) ]
106
+ pub proc_macro : bool ,
107
+
104
108
/// List of features to pass on to `cargo`.
105
109
///
106
110
/// By default, docs.rs will only build default features.
@@ -328,6 +332,15 @@ impl std::str::FromStr for Metadata {
328
332
Metadata :: default ( )
329
333
} ;
330
334
335
+ let proc_macro = manifest
336
+ . as_ref ( )
337
+ . and_then ( |t| table ( t, "lib" ) )
338
+ . and_then ( |table| table. get ( "proc-macro" ) )
339
+ . and_then ( |val| val. as_bool ( ) ) ;
340
+ if let Some ( proc_macro) = proc_macro {
341
+ metadata. proc_macro = proc_macro;
342
+ }
343
+
331
344
metadata. rustdoc_args . push ( "-Z" . into ( ) ) ;
332
345
metadata. rustdoc_args . push ( "unstable-options" . into ( ) ) ;
333
346
@@ -363,6 +376,7 @@ mod test_parsing {
363
376
assert ! ( metadata. all_features) ;
364
377
assert ! ( metadata. no_default_features) ;
365
378
assert ! ( metadata. default_target. is_some( ) ) ;
379
+ assert ! ( !metadata. proc_macro) ;
366
380
367
381
let features = metadata. features . unwrap ( ) ;
368
382
assert_eq ! ( features. len( ) , 2 ) ;
@@ -446,6 +460,18 @@ mod test_parsing {
446
460
assert ! ( metadata. no_default_features) ;
447
461
assert ! ( metadata. default_target. is_some( ) ) ;
448
462
}
463
+
464
+ #[ test]
465
+ fn test_proc_macro ( ) {
466
+ let manifest = r#"
467
+ [package]
468
+ name = "x"
469
+ [lib]
470
+ proc-macro = true
471
+ "# ;
472
+ let metadata = Metadata :: from_str ( manifest) . unwrap ( ) ;
473
+ assert ! ( metadata. proc_macro) ;
474
+ }
449
475
}
450
476
451
477
#[ cfg( test) ]
0 commit comments