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:
parent
6d7684101a
commit
aa763fcf42
@ -340,9 +340,10 @@ impl FromWithTcx<clean::GenericParamDefKind> for GenericParamDefKind {
|
||||
Lifetime { outlives } => GenericParamDefKind::Lifetime {
|
||||
outlives: outlives.into_iter().map(|lt| lt.0.to_string()).collect(),
|
||||
},
|
||||
Type { did: _, bounds, default, synthetic: _ } => GenericParamDefKind::Type {
|
||||
Type { did: _, bounds, default, synthetic } => GenericParamDefKind::Type {
|
||||
bounds: bounds.into_iter().map(|x| x.into_tcx(tcx)).collect(),
|
||||
default: default.map(|x| (*x).into_tcx(tcx)),
|
||||
synthetic,
|
||||
},
|
||||
Const { did: _, ty, default } => {
|
||||
GenericParamDefKind::Const { ty: (*ty).into_tcx(tcx), default: default.map(|x| *x) }
|
||||
|
@ -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)]
|
||||
|
5
src/test/rustdoc-json/fns/generics.rs
Normal file
5
src/test/rustdoc-json/fns/generics.rs
Normal file
@ -0,0 +1,5 @@
|
||||
// @has generics.json "$.index[*][?(@.name=='one_generic_param_fn')].inner.generics.params[0].kind.type.synthetic" false
|
||||
pub fn one_generic_param_fn<T>(_: T) {}
|
||||
|
||||
// @has - "$.index[*][?(@.name=='one_synthetic_generic_param_fn')].inner.generics.params[0].kind.type.synthetic" true
|
||||
pub fn one_synthetic_generic_param_fn(_: impl Clone) {}
|
Loading…
x
Reference in New Issue
Block a user