Skip to content

Commit

Permalink
Rollup merge of rust-lang#83055 - aDotInTheVoid:selective-strip-item-…
Browse files Browse the repository at this point in the history
…doc, r=jyn514

[rustdoc] Don't document stripped items in JSON renderer.

Fixes rust-lang#80664, see [my comment there](rust-lang#80664 (comment)) for why

Note that we already do something similar in `convert_item`:

https://github.com/rust-lang/rust/blob/bb4cdf8ec034dca5c056ec9295f38062e5b7e871/src/librustdoc/json/conversions.rs#L28-L31

`@rustbot` modify labels: +T-rustdoc +A-rustdoc-json

r? `@jyn514`
cc `@CraftSpider`
  • Loading branch information
Dylan-DPC committed Mar 25, 2021
2 parents 52e3dff + d9e2d8d commit d20b8a2
Show file tree
Hide file tree
Showing 11 changed files with 98 additions and 7 deletions.
7 changes: 7 additions & 0 deletions Cargo.lock
Original file line number Diff line number Diff line change
Expand Up @@ -1219,6 +1219,12 @@ dependencies = [
"rustc-std-workspace-core",
]

[[package]]
name = "fs-err"
version = "2.5.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "bcd1163ae48bda72a20ae26d66a04d3094135cadab911cff418ae5e33f253431"

[[package]]
name = "fs_extra"
version = "1.1.0"
Expand Down Expand Up @@ -1748,6 +1754,7 @@ checksum = "92c245af8786f6ac35f95ca14feca9119e71339aaab41e878e7cdd655c97e9e5"
name = "jsondocck"
version = "0.1.0"
dependencies = [
"fs-err",
"getopts",
"jsonpath_lib",
"lazy_static",
Expand Down
7 changes: 6 additions & 1 deletion src/librustdoc/formats/renderer.rs
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,11 @@ crate trait FormatRenderer<'tcx>: Sized {
/// Gives a description of the renderer. Used for performance profiling.
fn descr() -> &'static str;

/// Whether to call `item` recursivly for modules
///
/// This is true for html, and false for json. See #80664
const RUN_ON_MODULE: bool;

/// Sets up any state required for the renderer. When this is called the cache has already been
/// populated.
fn init(
Expand Down Expand Up @@ -68,7 +73,7 @@ crate fn run_format<'tcx, T: FormatRenderer<'tcx>>(

let unknown = Symbol::intern("<unknown item>");
while let Some((mut cx, item)) = work.pop() {
if item.is_mod() {
if item.is_mod() && T::RUN_ON_MODULE {
// modules are special because they add a namespace. We also need to
// recurse into the items of the module as well.
let name = item.name.as_ref().unwrap().to_string();
Expand Down
2 changes: 2 additions & 0 deletions src/librustdoc/html/render/context.rs
Original file line number Diff line number Diff line change
Expand Up @@ -290,6 +290,8 @@ impl<'tcx> FormatRenderer<'tcx> for Context<'tcx> {
"html"
}

const RUN_ON_MODULE: bool = true;

fn init(
mut krate: clean::Crate,
options: RenderOptions,
Expand Down
3 changes: 2 additions & 1 deletion src/librustdoc/json/conversions.rs
Original file line number Diff line number Diff line change
Expand Up @@ -179,7 +179,8 @@ fn from_clean_item_kind(item: clean::ItemKind, tcx: TyCtxt<'_>, name: &Option<Sy
bounds: g.into_iter().map(Into::into).collect(),
default: t.map(Into::into),
},
StrippedItem(inner) => from_clean_item_kind(*inner, tcx, name),
// `convert_item` early returns `None` for striped items
StrippedItem(_) => unreachable!(),
PrimitiveItem(_) | KeywordItem(_) => {
panic!("{:?} is not supported for JSON output", item)
}
Expand Down
6 changes: 5 additions & 1 deletion src/librustdoc/json/mod.rs
Original file line number Diff line number Diff line change
Expand Up @@ -129,6 +129,8 @@ impl<'tcx> FormatRenderer<'tcx> for JsonRenderer<'tcx> {
"json"
}

const RUN_ON_MODULE: bool = false;

fn init(
krate: clean::Crate,
options: RenderOptions,
Expand Down Expand Up @@ -169,8 +171,10 @@ impl<'tcx> FormatRenderer<'tcx> for JsonRenderer<'tcx> {
e.impls = self.get_impls(id)
}
let removed = self.index.borrow_mut().insert(from_def_id(id), new_item.clone());

// FIXME(adotinthevoid): Currently, the index is duplicated. This is a sanity check
// to make sure the items are unique.
// to make sure the items are unique. The main place this happens is when an item, is
// reexported in more than one place. See `rustdoc-json/reexport/in_root_and_mod`
if let Some(old_item) = removed {
assert_eq!(old_item, new_item);
}
Expand Down
15 changes: 15 additions & 0 deletions src/test/rustdoc-json/reexport/in_root_and_mod.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
#![feature(no_core)]
#![no_core]

mod foo {
// @set foo_id = in_root_and_mod.json "$.index[*][?(@.name=='Foo')].id"
pub struct Foo;
}

// @has - "$.index[*][?(@.name=='in_root_and_mod')].inner.items[*]" $foo_id
pub use foo::Foo;

pub mod bar {
// @has - "$.index[*][?(@.name=='bar')].inner.items[*]" $foo_id
pub use crate::foo::Foo;
}
20 changes: 20 additions & 0 deletions src/test/rustdoc-json/reexport/in_root_and_mod_pub.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
#![feature(no_core)]
#![no_core]

pub mod foo {
// @set bar_id = in_root_and_mod_pub.json "$.index[*][?(@.name=='Bar')].id"
// @has - "$.index[*][?(@.name=='foo')].inner.items[*]" $bar_id
pub struct Bar;
}

// @set root_import_id = - "$.index[*][?(@.inner.source=='foo::Bar')].id"
// @is - "$.index[*][?(@.inner.source=='foo::Bar')].inner.id" $bar_id
// @has - "$.index[*][?(@.name=='in_root_and_mod_pub')].inner.items[*]" $root_import_id
pub use foo::Bar;

pub mod baz {
// @set baz_import_id = - "$.index[*][?(@.inner.source=='crate::foo::Bar')].id"
// @is - "$.index[*][?(@.inner.source=='crate::foo::Bar')].inner.id" $bar_id
// @has - "$.index[*][?(@.name=='baz')].inner.items[*]" $baz_import_id
pub use crate::foo::Bar;
}
14 changes: 14 additions & 0 deletions src/test/rustdoc-json/reexport/rename_private.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
// edition:2018

#![no_core]
#![feature(no_core)]
// @!has rename_private.json "$.index[*][?(@.name=='inner')]"
mod inner {
// @!has - "$.index[*][?(@.name=='Public')]"
pub struct Public;
}

// @set newname_id = - "$.index[*][?(@.name=='NewName')].id"
// @is - "$.index[*][?(@.name=='NewName')].kind" \"struct\"
// @has - "$.index[*][?(@.name=='rename_private')].inner.items[*]" $newname_id
pub use inner::Public as NewName;
1 change: 1 addition & 0 deletions src/tools/jsondocck/Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -12,3 +12,4 @@ lazy_static = "1.4"
shlex = "0.1"
serde = "1.0"
serde_json = "1.0"
fs-err = "2.5.0"
10 changes: 8 additions & 2 deletions src/tools/jsondocck/src/cache.rs
Original file line number Diff line number Diff line change
@@ -1,8 +1,10 @@
use crate::error::CkError;
use serde_json::Value;
use std::collections::HashMap;
use std::io;
use std::path::{Path, PathBuf};
use std::{fs, io};

use fs_err as fs;

#[derive(Debug)]
pub struct Cache {
Expand Down Expand Up @@ -31,7 +33,11 @@ impl Cache {
self.last_path = Some(resolve.clone());
resolve
} else {
self.last_path.as_ref().unwrap().clone()
self.last_path
.as_ref()
// FIXME: Point to a line number
.expect("No last path set. Make sure to specify a full path before using `-`")
.clone()
}
}

Expand Down
20 changes: 18 additions & 2 deletions src/tools/jsondocck/src/main.rs
Original file line number Diff line number Diff line change
Expand Up @@ -239,7 +239,20 @@ fn check_command(command: Command, cache: &mut Cache) -> Result<(), CkError> {
let val = cache.get_value(&command.args[0])?;
let results = select(&val, &command.args[1]).unwrap();
let pat = string_to_value(&command.args[2], cache);
results.len() == 1 && results[0] == pat.as_ref()
let is = results.len() == 1 && results[0] == pat.as_ref();
if !command.negated && !is {
return Err(CkError::FailedCheck(
format!(
"{} matched to {:?}, but expected {:?}",
&command.args[1],
results,
pat.as_ref()
),
command,
));
} else {
is
}
}
CommandKind::Set => {
// @set <name> = <path> <jsonpath>
Expand Down Expand Up @@ -299,7 +312,10 @@ fn check_command(command: Command, cache: &mut Cache) -> Result<(), CkError> {

fn string_to_value<'a>(s: &str, cache: &'a Cache) -> Cow<'a, Value> {
if s.starts_with("$") {
Cow::Borrowed(&cache.variables[&s[1..]])
Cow::Borrowed(&cache.variables.get(&s[1..]).unwrap_or_else(|| {
// FIXME(adotinthevoid): Show line number
panic!("No variable: `{}`. Current state: `{:?}`", &s[1..], cache.variables)
}))
} else {
Cow::Owned(serde_json::from_str(s).unwrap())
}
Expand Down

0 comments on commit d20b8a2

Please sign in to comment.