From fdeb38b903d3842a0600dc2e80f19a58469a69cb Mon Sep 17 00:00:00 2001 From: Eric Huss Date: Mon, 24 Jan 2022 17:10:05 -0800 Subject: [PATCH] Fix documenting with undocumented dependencies. --- src/cargo/core/compiler/unit_dependencies.rs | 28 ++++++------ tests/testsuite/doc.rs | 47 +++++++++++++++++++- 2 files changed, 61 insertions(+), 14 deletions(-) diff --git a/src/cargo/core/compiler/unit_dependencies.rs b/src/cargo/core/compiler/unit_dependencies.rs index a3bcecc1782..c2575fd77f1 100644 --- a/src/cargo/core/compiler/unit_dependencies.rs +++ b/src/cargo/core/compiler/unit_dependencies.rs @@ -431,7 +431,7 @@ fn compute_deps_doc( let mut ret = Vec::new(); for (id, _deps) in deps { let dep = state.get(id); - let lib = match dep.targets().iter().find(|t| t.is_lib() && t.documented()) { + let lib = match dep.targets().iter().find(|t| t.is_lib()) { Some(lib) => lib, None => continue, }; @@ -449,18 +449,20 @@ fn compute_deps_doc( mode, )?; ret.push(lib_unit_dep); - if let CompileMode::Doc { deps: true } = unit.mode { - // Document this lib as well. - let doc_unit_dep = new_unit_dep( - state, - unit, - dep, - lib, - dep_unit_for, - unit.kind.for_target(lib), - unit.mode, - )?; - ret.push(doc_unit_dep); + if lib.documented() { + if let CompileMode::Doc { deps: true } = unit.mode { + // Document this lib as well. + let doc_unit_dep = new_unit_dep( + state, + unit, + dep, + lib, + dep_unit_for, + unit.kind.for_target(lib), + unit.mode, + )?; + ret.push(doc_unit_dep); + } } } diff --git a/tests/testsuite/doc.rs b/tests/testsuite/doc.rs index 869e4f3342f..da500d4a1d4 100644 --- a/tests/testsuite/doc.rs +++ b/tests/testsuite/doc.rs @@ -2557,7 +2557,7 @@ fn doc_lib_false() { bar = {path = "bar"} "#, ) - .file("src/lib.rs", "") + .file("src/lib.rs", "extern crate bar;") .file("src/bin/some-bin.rs", "fn main() {}") .file( "bar/Cargo.toml", @@ -2588,3 +2588,48 @@ fn doc_lib_false() { assert!(!p.build_dir().join("doc/bar").exists()); assert!(p.build_dir().join("doc/some_bin").exists()); } + +#[cargo_test] +fn doc_lib_false_dep() { + // doc = false for a dependency + // Ensures that the rmeta gets produced + let p = project() + .file( + "Cargo.toml", + r#" + [package] + name = "foo" + version = "0.1.0" + + [dependencies] + bar = { path = "bar" } + "#, + ) + .file("src/lib.rs", "extern crate bar;") + .file( + "bar/Cargo.toml", + r#" + [package] + name = "bar" + version = "0.1.0" + + [lib] + doc = false + "#, + ) + .file("bar/src/lib.rs", "") + .build(); + + p.cargo("doc") + .with_stderr( + "\ +[CHECKING] bar v0.1.0 [..] +[DOCUMENTING] foo v0.1.0 [..] +[FINISHED] [..] +", + ) + .run(); + + assert!(p.build_dir().join("doc/foo").exists()); + assert!(!p.build_dir().join("doc/bar").exists()); +}