rustdoc-json: Include GenericParamDefKind::Type::synthetic in JSON
The rustdoc JSON for
```
pub fn f(_: impl Clone) {}
```
will effectively be
```
pub fn f<impl Clone: Clone>(_: impl Clone)
```
where a synthetic generic parameter called `impl Clone` with generic
trait bound `Clone` is added to the function declaration.
The generated HTML filters out these generic parameters by doing
`self.params.iter().filter(|p| !p.is_synthetic_type_param())`, because
the synthetic generic parameter is not of interest to regular users.
For the same reason, we should expose whether or not a generic parameter
is synthetic or not also in the rustdoc JSON, so that rustdoc JSON
clients can also have the option to hide synthetic generic parameters.
This commit is contained in:
@@ -9,7 +9,7 @@ use std::path::PathBuf;
|
||||
use serde::{Deserialize, Serialize};
|
||||
|
||||
/// rustdoc format-version.
|
||||
pub const FORMAT_VERSION: u32 = 12;
|
||||
pub const FORMAT_VERSION: u32 = 13;
|
||||
|
||||
/// A `Crate` is the root of the emitted JSON blob. It contains all type/documentation information
|
||||
/// about the language items in the local crate, as well as info about external items to allow
|
||||
@@ -346,9 +346,41 @@ pub struct GenericParamDef {
|
||||
#[derive(Clone, Debug, Serialize, Deserialize, PartialEq)]
|
||||
#[serde(rename_all = "snake_case")]
|
||||
pub enum GenericParamDefKind {
|
||||
Lifetime { outlives: Vec<String> },
|
||||
Type { bounds: Vec<GenericBound>, default: Option<Type> },
|
||||
Const { ty: Type, default: Option<String> },
|
||||
Lifetime {
|
||||
outlives: Vec<String>,
|
||||
},
|
||||
Type {
|
||||
bounds: Vec<GenericBound>,
|
||||
default: Option<Type>,
|
||||
/// This is normally `false`, which means that this generic parameter is
|
||||
/// declared in the Rust source text.
|
||||
///
|
||||
/// If it is `true`, this generic parameter has been introduced by the
|
||||
/// compiler behind the scenes.
|
||||
///
|
||||
/// # Example
|
||||
///
|
||||
/// Consider
|
||||
///
|
||||
/// ```ignore (pseudo-rust)
|
||||
/// pub fn f(_: impl Trait) {}
|
||||
/// ```
|
||||
///
|
||||
/// The compiler will transform this behind the scenes to
|
||||
///
|
||||
/// ```ignore (pseudo-rust)
|
||||
/// pub fn f<impl Trait: Trait>(_: impl Trait) {}
|
||||
/// ```
|
||||
///
|
||||
/// In this example, the generic parameter named `impl Trait` (and which
|
||||
/// is bound by `Trait`) is synthetic, because it was not originally in
|
||||
/// the Rust source text.
|
||||
synthetic: bool,
|
||||
},
|
||||
Const {
|
||||
ty: Type,
|
||||
default: Option<String>,
|
||||
},
|
||||
}
|
||||
|
||||
#[derive(Clone, Debug, Serialize, Deserialize, PartialEq)]
|
||||
|
||||
Reference in New Issue
Block a user