Skip to content

Commit 8772e1a

Browse files
committed
record whether the crate is a proc-macro or not
1 parent ac09136 commit 8772e1a

File tree

1 file changed

+26
-0
lines changed

1 file changed

+26
-0
lines changed

crates/metadata/lib.rs

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -101,6 +101,10 @@ pub enum MetadataError {
101101
#[derive(Default, Deserialize)]
102102
#[serde(rename_all = "kebab-case")]
103103
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+
104108
/// List of features to pass on to `cargo`.
105109
///
106110
/// By default, docs.rs will only build default features.
@@ -328,6 +332,15 @@ impl std::str::FromStr for Metadata {
328332
Metadata::default()
329333
};
330334

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+
331344
metadata.rustdoc_args.push("-Z".into());
332345
metadata.rustdoc_args.push("unstable-options".into());
333346

@@ -363,6 +376,7 @@ mod test_parsing {
363376
assert!(metadata.all_features);
364377
assert!(metadata.no_default_features);
365378
assert!(metadata.default_target.is_some());
379+
assert!(!metadata.proc_macro);
366380

367381
let features = metadata.features.unwrap();
368382
assert_eq!(features.len(), 2);
@@ -446,6 +460,18 @@ mod test_parsing {
446460
assert!(metadata.no_default_features);
447461
assert!(metadata.default_target.is_some());
448462
}
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+
}
449475
}
450476

451477
#[cfg(test)]

0 commit comments

Comments
 (0)