//! Rustdoc's JSON output interface //! //! These types are the public API exposed through the `--output-format json` flag. The [`Crate`] //! struct is the root of the JSON blob and all other items are contained within. //! //! We expose a `rustc-hash` feature that is disabled by default. This feature switches the //! [`std::collections::HashMap`] for [`rustc_hash::FxHashMap`] to improve the performance of said //! `HashMap` in specific situations. //! //! `cargo-semver-checks` for example, saw a [-3% improvement][1] when benchmarking using the //! `aws_sdk_ec2` JSON output (~500MB of JSON). As always, we recommend measuring the impact before //! turning this feature on, as [`FxHashMap`][2] only concerns itself with hash speed, and may //! increase the number of collisions. //! //! [1]: https://rust-lang.zulipchat.com/#narrow/channel/266220-t-rustdoc/topic/rustc-hash.20and.20performance.20of.20rustdoc-types/near/474855731 //! [2]: https://crates.io/crates/rustc-hash #[cfg(not(feature = "rustc-hash"))] use std::collections::HashMap; use std::path::PathBuf; #[cfg(feature = "rustc-hash")] use rustc_hash::FxHashMap as HashMap; use serde::{Deserialize, Serialize}; pub type FxHashMap = HashMap; // re-export for use in src/librustdoc /// The version of JSON output that this crate represents. /// /// This integer is incremented with every breaking change to the API, /// and is returned along with the JSON blob as [`Crate::format_version`]. /// Consuming code should assert that this value matches the format version(s) that it supports. pub const FORMAT_VERSION: u32 = 39; /// 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 /// tools to find or link to them. #[derive(Clone, Debug, PartialEq, Eq, Serialize, Deserialize)] pub struct Crate { /// The id of the root [`Module`] item of the local crate. pub root: Id, /// The version string given to `--crate-version`, if any. pub crate_version: Option, /// Whether or not the output includes private items. pub includes_private: bool, /// A collection of all items in the local crate as well as some external traits and their /// items that are referenced locally. pub index: HashMap, /// Maps IDs to fully qualified paths and other info helpful for generating links. pub paths: HashMap, /// Maps `crate_id` of items to a crate name and html_root_url if it exists. pub external_crates: HashMap, /// A single version number to be used in the future when making backwards incompatible changes /// to the JSON output. pub format_version: u32, } /// Metadata of a crate, either the same crate on which `rustdoc` was invoked, or its dependency. #[derive(Clone, Debug, PartialEq, Eq, Hash, Serialize, Deserialize)] pub struct ExternalCrate { /// The name of the crate. /// /// Note: This is the [*crate* name][crate-name], which may not be the same as the /// [*package* name][package-name]. For example, for , /// this field will be `regex_syntax` (which uses an `_`, not a `-`). /// /// [crate-name]: https://doc.rust-lang.org/stable/cargo/reference/cargo-targets.html#the-name-field /// [package-name]: https://doc.rust-lang.org/stable/cargo/reference/manifest.html#the-name-field pub name: String, /// The root URL at which the crate's documentation lives. pub html_root_url: Option, } /// Information about an external (not defined in the local crate) [`Item`]. /// /// For external items, you don't get the same level of /// information. This struct should contain enough to generate a link/reference to the item in /// question, or can be used by a tool that takes the json output of multiple crates to find /// the actual item definition with all the relevant info. #[derive(Clone, Debug, PartialEq, Eq, Hash, Serialize, Deserialize)] pub struct ItemSummary { /// Can be used to look up the name and html_root_url of the crate this item came from in the /// `external_crates` map. pub crate_id: u32, /// The list of path components for the fully qualified path of this item (e.g. /// `["std", "io", "lazy", "Lazy"]` for `std::io::lazy::Lazy`). /// /// Note that items can appear in multiple paths, and the one chosen is implementation /// defined. Currently, this is the full path to where the item was defined. Eg /// [`String`] is currently `["alloc", "string", "String"]` and [`HashMap`][`std::collections::HashMap`] /// is `["std", "collections", "hash", "map", "HashMap"]`, but this is subject to change. pub path: Vec, /// Whether this item is a struct, trait, macro, etc. pub kind: ItemKind, } /// Anything that can hold documentation - modules, structs, enums, functions, traits, etc. /// /// The `Item` data type holds fields that can apply to any of these, /// and leaves kind-specific details (like function args or enum variants) to the `inner` field. #[derive(Clone, Debug, PartialEq, Eq, Serialize, Deserialize)] pub struct Item { /// The unique identifier of this item. Can be used to find this item in various mappings. pub id: Id, /// This can be used as a key to the `external_crates` map of [`Crate`] to see which crate /// this item came from. pub crate_id: u32, /// Some items such as impls don't have names. pub name: Option, /// The source location of this item (absent if it came from a macro expansion or inline /// assembly). pub span: Option, /// By default all documented items are public, but you can tell rustdoc to output private items /// so this field is needed to differentiate. pub visibility: Visibility, /// The full markdown docstring of this item. Absent if there is no documentation at all, /// Some("") if there is some documentation but it is empty (EG `#[doc = ""]`). pub docs: Option, /// This mapping resolves [intra-doc links](https://github.com/rust-lang/rfcs/blob/master/text/1946-intra-rustdoc-links.md) from the docstring to their IDs pub links: HashMap, /// Stringified versions of the attributes on this item (e.g. `"#[inline]"`) pub attrs: Vec, /// Information about the item’s deprecation, if present. pub deprecation: Option, /// The type-specific fields describing this item. pub inner: ItemEnum, } /// A range of source code. #[derive(Clone, Debug, PartialEq, Eq, Hash, Serialize, Deserialize)] pub struct Span { /// The path to the source file for this span relative to the path `rustdoc` was invoked with. pub filename: PathBuf, /// Zero indexed Line and Column of the first character of the `Span` pub begin: (usize, usize), /// Zero indexed Line and Column of the last character of the `Span` pub end: (usize, usize), } /// Information about the deprecation of an [`Item`]. #[derive(Clone, Debug, PartialEq, Eq, Hash, Serialize, Deserialize)] pub struct Deprecation { /// Usually a version number when this [`Item`] first became deprecated. pub since: Option, /// The reason for deprecation and/or what alternatives to use. pub note: Option, } /// Visibility of an [`Item`]. #[derive(Clone, Debug, PartialEq, Eq, Hash, Serialize, Deserialize)] #[serde(rename_all = "snake_case")] pub enum Visibility { /// Explicitly public visibility set with `pub`. Public, /// For the most part items are private by default. The exceptions are associated items of /// public traits and variants of public enums. Default, /// Explicitly crate-wide visibility set with `pub(crate)` Crate, /// For `pub(in path)` visibility. Restricted { /// ID of the module to which this visibility restricts items. parent: Id, /// The path with which [`parent`] was referenced /// (like `super::super` or `crate::foo::bar`). /// /// [`parent`]: Visibility::Restricted::parent path: String, }, } /// Dynamic trait object type (`dyn Trait`). #[derive(Clone, Debug, PartialEq, Eq, Hash, Serialize, Deserialize)] pub struct DynTrait { /// All the traits implemented. One of them is the vtable, and the rest must be auto traits. pub traits: Vec, /// The lifetime of the whole dyn object /// ```text /// dyn Debug + 'static /// ^^^^^^^ /// | /// this part /// ``` pub lifetime: Option, } /// A trait and potential HRTBs #[derive(Clone, Debug, PartialEq, Eq, Hash, Serialize, Deserialize)] pub struct PolyTrait { /// The path to the trait. #[serde(rename = "trait")] pub trait_: Path, /// Used for Higher-Rank Trait Bounds (HRTBs) /// ```text /// dyn for<'a> Fn() -> &'a i32" /// ^^^^^^^ /// ``` pub generic_params: Vec, } /// A set of generic arguments provided to a path segment, e.g. /// /// ```text /// std::option::Option::::None /// ^^^^^ /// ``` #[derive(Clone, Debug, PartialEq, Eq, Hash, Serialize, Deserialize)] #[serde(rename_all = "snake_case")] pub enum GenericArgs { /// `<'a, 32, B: Copy, C = u32>` AngleBracketed { /// The list of each argument on this type. /// ```text /// <'a, 32, B: Copy, C = u32> /// ^^^^^^ /// ``` args: Vec, /// Associated type or constant bindings (e.g. `Item=i32` or `Item: Clone`) for this type. constraints: Vec, }, /// `Fn(A, B) -> C` Parenthesized { /// The input types, enclosed in parentheses. inputs: Vec, /// The output type provided after the `->`, if present. output: Option, }, } /// One argument in a list of generic arguments to a path segment. /// /// Part of [`GenericArgs`]. #[derive(Clone, Debug, PartialEq, Eq, Hash, Serialize, Deserialize)] #[serde(rename_all = "snake_case")] pub enum GenericArg { /// A lifetime argument. /// ```text /// std::borrow::Cow<'static, str> /// ^^^^^^^ /// ``` Lifetime(String), /// A type argument. /// ```text /// std::borrow::Cow<'static, str> /// ^^^ /// ``` Type(Type), /// A constant as a generic argument. /// ```text /// core::array::IntoIter /// ^^^^^^^^^^^^^^ /// ``` Const(Constant), /// A generic argument that's explicitly set to be inferred. /// ```text /// std::vec::Vec::<_>::new() /// ^ /// ``` Infer, } /// A constant. #[derive(Clone, Debug, PartialEq, Eq, Hash, Serialize, Deserialize)] pub struct Constant { /// The stringified expression of this constant. Note that its mapping to the original /// source code is unstable and it's not guaranteed that it'll match the source code. pub expr: String, /// The value of the evaluated expression for this constant, which is only computed for numeric /// types. pub value: Option, /// Whether this constant is a bool, numeric, string, or char literal. pub is_literal: bool, } /// Describes a bound applied to an associated type/constant. /// /// Example: /// ```text /// IntoIterator /// ^^^^^^^^^^ ^^^^^^^^^^^^^^^ /// ``` #[derive(Clone, Debug, PartialEq, Eq, Hash, Serialize, Deserialize)] pub struct AssocItemConstraint { /// The name of the associated type/constant. pub name: String, /// Arguments provided to the associated type/constant. pub args: GenericArgs, /// The kind of bound applied to the associated type/constant. pub binding: AssocItemConstraintKind, } /// The way in which an associate type/constant is bound. #[derive(Clone, Debug, PartialEq, Eq, Hash, Serialize, Deserialize)] #[serde(rename_all = "snake_case")] pub enum AssocItemConstraintKind { /// The required value/type is specified exactly. e.g. /// ```text /// Iterator /// ^^^^^^^^^^ /// ``` Equality(Term), /// The type is required to satisfy a set of bounds. /// ```text /// Iterator /// ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ /// ``` Constraint(Vec), } /// An opaque identifier for an item. /// /// It can be used to lookup in [`Crate::index`] or [`Crate::paths`] to resolve it /// to an [`Item`]. /// /// Id's are only valid within a single JSON blob. They cannot be used to /// resolve references between the JSON output's for different crates. /// /// Rustdoc makes no guarantees about the inner value of Id's. Applications /// should treat them as opaque keys to lookup items, and avoid attempting /// to parse them, or otherwise depend on any implementation details. #[derive(Clone, Copy, Debug, PartialEq, Eq, Hash, Serialize, Deserialize)] // FIXME(aDotInTheVoid): Consider making this non-public in rustdoc-types. pub struct Id(pub u32); /// The fundamental kind of an item. Unlike [`ItemEnum`], this does not carry any additional info. /// /// Part of [`ItemSummary`]. #[derive(Clone, Copy, Debug, PartialEq, Eq, Hash, Serialize, Deserialize)] #[serde(rename_all = "snake_case")] pub enum ItemKind { /// A module declaration, e.g. `mod foo;` or `mod foo {}` Module, /// A crate imported via the `extern crate` syntax. ExternCrate, /// An import of 1 or more items into scope, using the `use` keyword. Use, /// A `struct` declaration. Struct, /// A field of a struct. StructField, /// A `union` declaration. Union, /// An `enum` declaration. Enum, /// A variant of a enum. Variant, /// A function declaration, e.g. `fn f() {}` Function, /// A type alias declaration, e.g. `type Pig = std::borrow::Cow<'static, str>;` TypeAlias, /// The declaration of a constant, e.g. `const GREETING: &str = "Hi :3";` Constant, /// A `trait` declaration. Trait, /// A trait alias declaration, e.g. `trait Int = Add + Sub + Mul + Div;` /// /// See [the tracking issue](https://github.com/rust-lang/rust/issues/41517) TraitAlias, /// An `impl` block. Impl, /// A `static` declaration. Static, /// `type`s from an `extern` block. /// /// See [the tracking issue](https://github.com/rust-lang/rust/issues/43467) ExternType, /// A macro declaration. /// /// Corresponds to either `ItemEnum::Macro(_)` /// or `ItemEnum::ProcMacro(ProcMacro { kind: MacroKind::Bang })` Macro, /// A procedural macro attribute. /// /// Corresponds to `ItemEnum::ProcMacro(ProcMacro { kind: MacroKind::Attr })` ProcAttribute, /// A procedural macro usable in the `#[derive()]` attribute. /// /// Corresponds to `ItemEnum::ProcMacro(ProcMacro { kind: MacroKind::Derive })` ProcDerive, /// An associated constant of a trait or a type. AssocConst, /// An associated type of a trait or a type. AssocType, /// A primitive type, e.g. `u32`. /// /// [`Item`]s of this kind only come from the core library. Primitive, /// A keyword declaration. /// /// [`Item`]s of this kind only come from the come library and exist solely /// to carry documentation for the respective keywords. Keyword, } /// Specific fields of an item. /// /// Part of [`Item`]. #[derive(Clone, Debug, PartialEq, Eq, Hash, Serialize, Deserialize)] #[serde(rename_all = "snake_case")] pub enum ItemEnum { /// A module declaration, e.g. `mod foo;` or `mod foo {}` Module(Module), /// A crate imported via the `extern crate` syntax. ExternCrate { /// The name of the imported crate. name: String, /// If the crate is renamed, this is its name in the crate. rename: Option, }, /// An import of 1 or more items into scope, using the `use` keyword. Use(Use), /// A `union` declaration. Union(Union), /// A `struct` declaration. Struct(Struct), /// A field of a struct. StructField(Type), /// An `enum` declaration. Enum(Enum), /// A variant of a enum. Variant(Variant), /// A function declaration (including methods and other associated functions) Function(Function), /// A `trait` declaration. Trait(Trait), /// A trait alias declaration, e.g. `trait Int = Add + Sub + Mul + Div;` /// /// See [the tracking issue](https://github.com/rust-lang/rust/issues/41517) TraitAlias(TraitAlias), /// An `impl` block. Impl(Impl), /// A type alias declaration, e.g. `type Pig = std::borrow::Cow<'static, str>;` TypeAlias(TypeAlias), /// The declaration of a constant, e.g. `const GREETING: &str = "Hi :3";` Constant { /// The type of the constant. #[serde(rename = "type")] type_: Type, /// The declared constant itself. #[serde(rename = "const")] const_: Constant, }, /// A declaration of a `static`. Static(Static), /// `type`s from an `extern` block. /// /// See [the tracking issue](https://github.com/rust-lang/rust/issues/43467) ExternType, /// A macro_rules! declarative macro. Contains a single string with the source /// representation of the macro with the patterns stripped. Macro(String), /// A procedural macro. ProcMacro(ProcMacro), /// A primitive type, e.g. `u32`. /// /// [`Item`]s of this kind only come from the core library. Primitive(Primitive), /// An associated constant of a trait or a type. AssocConst { /// The type of the constant. #[serde(rename = "type")] type_: Type, /// Inside a trait declaration, this is the default value for the associated constant, /// if provided. /// Inside an `impl` block, this is the value assigned to the associated constant, /// and will always be present. /// /// The representation is implementation-defined and not guaranteed to be representative of /// either the resulting value or of the source code. /// /// ```rust /// const X: usize = 640 * 1024; /// // ^^^^^^^^^^ /// ``` value: Option, }, /// An associated type of a trait or a type. AssocType { /// The generic parameters and where clauses on ahis associated type. generics: Generics, /// The bounds for this associated type. e.g. /// ```rust /// trait IntoIterator { /// type Item; /// type IntoIter: Iterator; /// // ^^^^^^^^^^^^^^^^^^^^^^^^^^^ /// } /// ``` bounds: Vec, /// Inside a trait declaration, this is the default for the associated type, if provided. /// Inside an impl block, this is the type assigned to the associated type, and will always /// be present. /// /// ```rust /// type X = usize; /// // ^^^^^ /// ``` #[serde(rename = "type")] type_: Option, }, } /// A module declaration, e.g. `mod foo;` or `mod foo {}`. #[derive(Clone, Debug, PartialEq, Eq, Hash, Serialize, Deserialize)] pub struct Module { /// Whether this is the root item of a crate. /// /// This item doesn't correspond to any construction in the source code and is generated by the /// compiler. pub is_crate: bool, /// [`Item`]s declared inside this module. pub items: Vec, /// If `true`, this module is not part of the public API, but it contains /// items that are re-exported as public API. pub is_stripped: bool, } /// A `union`. #[derive(Clone, Debug, PartialEq, Eq, Hash, Serialize, Deserialize)] pub struct Union { /// The generic parameters and where clauses on this union. pub generics: Generics, /// Whether any fields have been removed from the result, due to being private or hidden. pub has_stripped_fields: bool, /// The list of fields in the union. /// /// All of the corresponding [`Item`]s are of kind [`ItemEnum::StructField`]. pub fields: Vec, /// All impls (both of traits and inherent) for this union. /// /// All of the corresponding [`Item`]s are of kind [`ItemEnum::Impl`]. pub impls: Vec, } /// A `struct`. #[derive(Clone, Debug, PartialEq, Eq, Hash, Serialize, Deserialize)] pub struct Struct { /// The kind of the struct (e.g. unit, tuple-like or struct-like) and the data specific to it, /// i.e. fields. pub kind: StructKind, /// The generic parameters and where clauses on this struct. pub generics: Generics, /// All impls (both of traits and inherent) for this struct. /// All of the corresponding [`Item`]s are of kind [`ItemEnum::Impl`]. pub impls: Vec, } /// The kind of a [`Struct`] and the data specific to it, i.e. fields. #[derive(Clone, Debug, PartialEq, Eq, Hash, Serialize, Deserialize)] #[serde(rename_all = "snake_case")] pub enum StructKind { /// A struct with no fields and no parentheses. /// /// ```rust /// pub struct Unit; /// ``` Unit, /// A struct with unnamed fields. /// /// All [`Id`]'s will point to [`ItemEnum::StructField`]. /// Unlike most of JSON, private and `#[doc(hidden)]` fields will be given as `None` /// instead of being omitted, because order matters. /// /// ```rust /// pub struct TupleStruct(i32); /// pub struct EmptyTupleStruct(); /// ``` Tuple(Vec>), /// A struct with named fields. /// /// ```rust /// pub struct PlainStruct { x: i32 } /// pub struct EmptyPlainStruct {} /// ``` Plain { /// The list of fields in the struct. /// /// All of the corresponding [`Item`]s are of kind [`ItemEnum::StructField`]. fields: Vec, /// Whether any fields have been removed from the result, due to being private or hidden. has_stripped_fields: bool, }, } /// An `enum`. #[derive(Clone, Debug, PartialEq, Eq, Hash, Serialize, Deserialize)] pub struct Enum { /// Information about the type parameters and `where` clauses of the enum. pub generics: Generics, /// Whether any variants have been removed from the result, due to being private or hidden. pub has_stripped_variants: bool, /// The list of variants in the enum. /// /// All of the corresponding [`Item`]s are of kind [`ItemEnum::Variant`] pub variants: Vec, /// `impl`s for the enum. pub impls: Vec, } /// A variant of an enum. #[derive(Clone, Debug, PartialEq, Eq, Hash, Serialize, Deserialize)] pub struct Variant { /// Whether the variant is plain, a tuple-like, or struct-like. Contains the fields. pub kind: VariantKind, /// The discriminant, if explicitly specified. pub discriminant: Option, } /// The kind of an [`Enum`] [`Variant`] and the data specific to it, i.e. fields. #[derive(Clone, Debug, PartialEq, Eq, Hash, Serialize, Deserialize)] #[serde(rename_all = "snake_case")] pub enum VariantKind { /// A variant with no parentheses /// /// ```rust /// enum Demo { /// PlainVariant, /// PlainWithDiscriminant = 1, /// } /// ``` Plain, /// A variant with unnamed fields. /// /// All [`Id`]'s will point to [`ItemEnum::StructField`]. /// Unlike most of JSON, `#[doc(hidden)]` fields will be given as `None` /// instead of being omitted, because order matters. /// /// ```rust /// enum Demo { /// TupleVariant(i32), /// EmptyTupleVariant(), /// } /// ``` Tuple(Vec>), /// A variant with named fields. /// /// ```rust /// enum Demo { /// StructVariant { x: i32 }, /// EmptyStructVariant {}, /// } /// ``` Struct { /// The list of variants in the enum. /// All of the corresponding [`Item`]s are of kind [`ItemEnum::Variant`]. fields: Vec, /// Whether any variants have been removed from the result, due to being private or hidden. has_stripped_fields: bool, }, } /// The value that distinguishes a variant in an [`Enum`] from other variants. #[derive(Clone, Debug, PartialEq, Eq, Hash, Serialize, Deserialize)] pub struct Discriminant { /// The expression that produced the discriminant. /// /// Unlike `value`, this preserves the original formatting (eg suffixes, /// hexadecimal, and underscores), making it unsuitable to be machine /// interpreted. /// /// In some cases, when the value is too complex, this may be `"{ _ }"`. /// When this occurs is unstable, and may change without notice. pub expr: String, /// The numerical value of the discriminant. Stored as a string due to /// JSON's poor support for large integers, and the fact that it would need /// to store from [`i128::MIN`] to [`u128::MAX`]. pub value: String, } /// A set of fundamental properties of a function. #[derive(Clone, Debug, PartialEq, Eq, Hash, Serialize, Deserialize)] pub struct FunctionHeader { /// Is this function marked as `const`? pub is_const: bool, /// Is this function unsafe? pub is_unsafe: bool, /// Is this function async? pub is_async: bool, /// The ABI used by the function. pub abi: Abi, } /// The ABI (Application Binary Interface) used by a function. /// /// If a variant has an `unwind` field, this means the ABI that it represents can be specified in 2 /// ways: `extern "_"` and `extern "_-unwind"`, and a value of `true` for that field signifies the /// latter variant. /// /// See the [Rustonomicon section](https://doc.rust-lang.org/nightly/nomicon/ffi.html#ffi-and-unwinding) /// on unwinding for more info. #[derive(Clone, Debug, PartialEq, Eq, Hash, Serialize, Deserialize)] pub enum Abi { // We only have a concrete listing here for stable ABI's because there are so many // See rustc_ast_passes::feature_gate::PostExpansionVisitor::check_abi for the list /// The default ABI, but that can also be written explicitly with `extern "Rust"`. Rust, /// Can be specified as `extern "C"` or, as a shorthand, just `extern`. C { unwind: bool }, /// Can be specified as `extern "cdecl"`. Cdecl { unwind: bool }, /// Can be specified as `extern "stdcall"`. Stdcall { unwind: bool }, /// Can be specified as `extern "fastcall"`. Fastcall { unwind: bool }, /// Can be specified as `extern "aapcs"`. Aapcs { unwind: bool }, /// Can be specified as `extern "win64"`. Win64 { unwind: bool }, /// Can be specified as `extern "sysv64"`. SysV64 { unwind: bool }, /// Can be specified as `extern "system"`. System { unwind: bool }, /// Any other ABI, including unstable ones. Other(String), } /// A function declaration (including methods and other associated functions). #[derive(Clone, Debug, PartialEq, Eq, Hash, Serialize, Deserialize)] pub struct Function { /// Information about the function signature, or declaration. pub sig: FunctionSignature, /// Information about the function’s type parameters and `where` clauses. pub generics: Generics, /// Information about core properties of the function, e.g. whether it's `const`, its ABI, etc. pub header: FunctionHeader, /// Whether the function has a body, i.e. an implementation. pub has_body: bool, } /// Generic parameters accepted by an item and `where` clauses imposed on it and the parameters. #[derive(Clone, Debug, PartialEq, Eq, Hash, Serialize, Deserialize)] pub struct Generics { /// A list of generic parameter definitions (e.g. ``). pub params: Vec, /// A list of where predicates (e.g. `where T: Iterator, T::Item: Copy`). pub where_predicates: Vec, } /// One generic parameter accepted by an item. #[derive(Clone, Debug, PartialEq, Eq, Hash, Serialize, Deserialize)] pub struct GenericParamDef { /// Name of the parameter. /// ```rust /// fn f<'resource, Resource>(x: &'resource Resource) {} /// // ^^^^^^^^ ^^^^^^^^ /// ``` pub name: String, /// The kind of the parameter and data specific to a particular parameter kind, e.g. type /// bounds. pub kind: GenericParamDefKind, } /// The kind of a [`GenericParamDef`]. #[derive(Clone, Debug, PartialEq, Eq, Hash, Serialize, Deserialize)] #[serde(rename_all = "snake_case")] pub enum GenericParamDefKind { /// Denotes a lifetime parameter. Lifetime { /// Lifetimes that this lifetime parameter is required to outlive. /// /// ```rust /// fn f<'a, 'b, 'resource: 'a + 'b>(a: &'a str, b: &'b str, res: &'resource str) {} /// // ^^^^^^^ /// ``` outlives: Vec, }, /// Denotes a type parameter. Type { /// Bounds applied directly to the type. Note that the bounds from `where` clauses /// that constrain this parameter won't appear here. /// /// ```rust /// fn default2() -> [T; 2] where T: Clone { todo!() } /// // ^^^^^^^ /// ``` bounds: Vec, /// The default type for this parameter, if provided, e.g. /// /// ```rust /// trait PartialEq {} /// // ^^^^ /// ``` default: Option, /// 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) {} /// ``` /// /// 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. is_synthetic: bool, }, /// Denotes a constant parameter. Const { /// The type of the constant as declared. #[serde(rename = "type")] type_: Type, /// The stringified expression for the default value, if provided. It's not guaranteed that /// it'll match the actual source code for the default value. default: Option, }, } /// One `where` clause. /// ```rust /// fn default() -> T where T: Default { T::default() } /// // ^^^^^^^^^^ /// ``` #[derive(Clone, Debug, PartialEq, Eq, Hash, Serialize, Deserialize)] #[serde(rename_all = "snake_case")] pub enum WherePredicate { /// A type is expected to comply with a set of bounds BoundPredicate { /// The type that's being constrained. /// /// ```rust /// fn f(x: T) where for<'a> &'a T: Iterator {} /// // ^ /// ``` #[serde(rename = "type")] type_: Type, /// The set of bounds that constrain the type. /// /// ```rust /// fn f(x: T) where for<'a> &'a T: Iterator {} /// // ^^^^^^^^ /// ``` bounds: Vec, /// Used for Higher-Rank Trait Bounds (HRTBs) /// ```rust /// fn f(x: T) where for<'a> &'a T: Iterator {} /// // ^^^^^^^ /// ``` generic_params: Vec, }, /// A lifetime is expected to outlive other lifetimes. LifetimePredicate { /// The name of the lifetime. lifetime: String, /// The lifetimes that must be encompassed by the lifetime. outlives: Vec, }, /// A type must exactly equal another type. EqPredicate { /// The left side of the equation. lhs: Type, /// The right side of the equation. rhs: Term, }, } /// Either a trait bound or a lifetime bound. #[derive(Clone, Debug, PartialEq, Eq, Hash, Serialize, Deserialize)] #[serde(rename_all = "snake_case")] pub enum GenericBound { /// A trait bound. TraitBound { /// The full path to the trait. #[serde(rename = "trait")] trait_: Path, /// Used for Higher-Rank Trait Bounds (HRTBs) /// ```text /// where F: for<'a, 'b> Fn(&'a u8, &'b u8) /// ^^^^^^^^^^^ /// | /// this part /// ``` generic_params: Vec, /// The context for which a trait is supposed to be used, e.g. `const modifier: TraitBoundModifier, }, /// A lifetime bound, e.g. /// ```rust /// fn f<'a, T>(x: &'a str, y: &T) where T: 'a {} /// // ^^^ /// ``` Outlives(String), /// `use<'a, T>` precise-capturing bound syntax Use(Vec), } /// A set of modifiers applied to a trait. #[derive(Clone, Copy, Debug, PartialEq, Eq, Hash, Serialize, Deserialize)] #[serde(rename_all = "snake_case")] pub enum TraitBoundModifier { /// Marks the absence of a modifier. None, /// Indicates that the trait bound relaxes a trait bound applied to a parameter by default, /// e.g. `T: Sized?`, the `Sized` trait is required for all generic type parameters by default /// unless specified otherwise with this modifier. Maybe, /// Indicates that the trait bound must be applicable in both a run-time and a compile-time /// context. MaybeConst, } /// Either a type or a constant, usually stored as the right-hand side of an equation in places like /// [`AssocItemConstraint`] #[derive(Clone, Debug, PartialEq, Eq, Hash, Serialize, Deserialize)] #[serde(rename_all = "snake_case")] pub enum Term { /// A type. /// /// ```rust /// fn f(x: impl IntoIterator) {} /// // ^^^ /// ``` Type(Type), /// A constant. /// /// ```ignore (incomplete feature in the snippet) /// trait Foo { /// const BAR: usize; /// } /// /// fn f(x: impl Foo) {} /// // ^^ /// ``` Constant(Constant), } /// A type. #[derive(Clone, Debug, PartialEq, Eq, Hash, Serialize, Deserialize)] #[serde(rename_all = "snake_case")] pub enum Type { /// Structs, enums, unions and type aliases, e.g. `std::option::Option` ResolvedPath(Path), /// Dynamic trait object type (`dyn Trait`). DynTrait(DynTrait), /// Parameterized types. The contained string is the name of the parameter. Generic(String), /// Built-in numeric types (e.g. `u32`, `f32`), `bool`, `char`. Primitive(String), /// A function pointer type, e.g. `fn(u32) -> u32`, `extern "C" fn() -> *const u8` FunctionPointer(Box), /// A tuple type, e.g. `(String, u32, Box)` Tuple(Vec), /// An unsized slice type, e.g. `[u32]`. Slice(Box), /// An array type, e.g. `[u32; 15]` Array { /// The type of the contained element. #[serde(rename = "type")] type_: Box, /// The stringified expression that is the length of the array. /// /// Keep in mind that it's not guaranteed to match the actual source code of the expression. len: String, }, /// A pattern type, e.g. `u32 is 1..` /// /// See [the tracking issue](https://github.com/rust-lang/rust/issues/123646) Pat { /// The base type, e.g. the `u32` in `u32 is 1..` #[serde(rename = "type")] type_: Box, #[doc(hidden)] __pat_unstable_do_not_use: String, }, /// An opaque type that satisfies a set of bounds, `impl TraitA + TraitB + ...` ImplTrait(Vec), /// A type that's left to be inferred, `_` Infer, /// A raw pointer type, e.g. `*mut u32`, `*const u8`, etc. RawPointer { /// This is `true` for `*mut _` and `false` for `*const _`. is_mutable: bool, /// The type of the pointee. #[serde(rename = "type")] type_: Box, }, /// `&'a mut String`, `&str`, etc. BorrowedRef { /// The name of the lifetime of the reference, if provided. lifetime: Option, /// This is `true` for `&mut i32` and `false` for `&i32` is_mutable: bool, /// The type of the pointee, e.g. the `i32` in `&'a mut i32` #[serde(rename = "type")] type_: Box, }, /// Associated types like `::Name` and `T::Item` where /// `T: Iterator` or inherent associated types like `Struct::Name`. QualifiedPath { /// The name of the associated type in the parent type. /// /// ```ignore (incomplete expression) /// as Iterator>::Item /// // ^^^^ /// ``` name: String, /// The generic arguments provided to the associated type. /// /// ```ignore (incomplete expression) /// as BetterIterator>::Item<'static> /// // ^^^^^^^^^ /// ``` args: Box, /// The type with which this type is associated. /// /// ```ignore (incomplete expression) /// as Iterator>::Item /// // ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ /// ``` self_type: Box, /// `None` iff this is an *inherent* associated type. #[serde(rename = "trait")] trait_: Option, }, } /// A type that has a simple path to it. This is the kind of type of structs, unions, enums, etc. #[derive(Clone, Debug, PartialEq, Eq, Hash, Serialize, Deserialize)] pub struct Path { /// The path of the type. /// /// This will be the path that is *used* (not where it is defined), so /// multiple `Path`s may have different values for this field even if /// they all refer to the same item. e.g. /// /// ```rust /// pub type Vec1 = std::vec::Vec; // path: "std::vec::Vec" /// pub type Vec2 = Vec; // path: "Vec" /// pub type Vec3 = std::prelude::v1::Vec; // path: "std::prelude::v1::Vec" /// ``` // // Example tested in ./tests/rustdoc-json/path_name.rs pub path: String, /// The ID of the type. pub id: Id, /// Generic arguments to the type. /// /// ```ignore (incomplete expression) /// std::borrow::Cow<'static, str> /// // ^^^^^^^^^^^^^^ /// ``` pub args: Option>, } /// A type that is a function pointer. #[derive(Clone, Debug, PartialEq, Eq, Hash, Serialize, Deserialize)] pub struct FunctionPointer { /// The signature of the function. pub sig: FunctionSignature, /// Used for Higher-Rank Trait Bounds (HRTBs) /// /// ```ignore (incomplete expression) /// for<'c> fn(val: &'c i32) -> i32 /// // ^^^^^^^ /// ``` pub generic_params: Vec, /// The core properties of the function, such as the ABI it conforms to, whether it's unsafe, etc. pub header: FunctionHeader, } /// The signature of a function. #[derive(Clone, Debug, PartialEq, Eq, Hash, Serialize, Deserialize)] pub struct FunctionSignature { /// List of argument names and their type. /// /// Note that not all names will be valid identifiers, as some of /// them may be patterns. pub inputs: Vec<(String, Type)>, /// The output type, if specified. pub output: Option, /// Whether the function accepts an arbitrary amount of trailing arguments the C way. /// /// ```ignore (incomplete code) /// fn printf(fmt: &str, ...); /// ``` pub is_c_variadic: bool, } /// A `trait` declaration. #[derive(Clone, Debug, PartialEq, Eq, Hash, Serialize, Deserialize)] pub struct Trait { /// Whether the trait is marked `auto` and is thus implemented automatically /// for all applicable types. pub is_auto: bool, /// Whether the trait is marked as `unsafe`. pub is_unsafe: bool, /// Whether the trait is [dyn compatible](https://doc.rust-lang.org/reference/items/traits.html#dyn-compatibility)[^1]. /// /// [^1]: Formerly known as "object safe". pub is_dyn_compatible: bool, /// Associated [`Item`]s that can/must be implemented by the `impl` blocks. pub items: Vec, /// Information about the type parameters and `where` clauses of the trait. pub generics: Generics, /// Constraints that must be met by the implementor of the trait. pub bounds: Vec, /// The implementations of the trait. pub implementations: Vec, } /// A trait alias declaration, e.g. `trait Int = Add + Sub + Mul + Div;` /// /// See [the tracking issue](https://github.com/rust-lang/rust/issues/41517) #[derive(Clone, Debug, PartialEq, Eq, Hash, Serialize, Deserialize)] pub struct TraitAlias { /// Information about the type parameters and `where` clauses of the alias. pub generics: Generics, /// The bounds that are associated with the alias. pub params: Vec, } /// An `impl` block. #[derive(Clone, Debug, PartialEq, Eq, Hash, Serialize, Deserialize)] pub struct Impl { /// Whether this impl is for an unsafe trait. pub is_unsafe: bool, /// Information about the impl’s type parameters and `where` clauses. pub generics: Generics, /// The list of the names of all the trait methods that weren't mentioned in this impl but /// were provided by the trait itself. /// /// For example, for this impl of the [`PartialEq`] trait: /// ```rust /// struct Foo; /// /// impl PartialEq for Foo { /// fn eq(&self, other: &Self) -> bool { todo!() } /// } /// ``` /// This field will be `["ne"]`, as it has a default implementation defined for it. pub provided_trait_methods: Vec, /// The trait being implemented or `None` if the impl is inherent, which means /// `impl Struct {}` as opposed to `impl Trait for Struct {}`. #[serde(rename = "trait")] pub trait_: Option, /// The type that the impl block is for. #[serde(rename = "for")] pub for_: Type, /// The list of associated items contained in this impl block. pub items: Vec, /// Whether this is a negative impl (e.g. `!Sized` or `!Send`). pub is_negative: bool, /// Whether this is an impl that’s implied by the compiler /// (for autotraits, e.g. `Send` or `Sync`). pub is_synthetic: bool, // FIXME: document this pub blanket_impl: Option, } /// A `use` statement. #[derive(Clone, Debug, PartialEq, Eq, Hash, Serialize, Deserialize)] #[serde(rename_all = "snake_case")] pub struct Use { /// The full path being imported. pub source: String, /// May be different from the last segment of `source` when renaming imports: /// `use source as name;` pub name: String, /// The ID of the item being imported. Will be `None` in case of re-exports of primitives: /// ```rust /// pub use i32 as my_i32; /// ``` pub id: Option, /// Whether this statement is a wildcard `use`, e.g. `use source::*;` pub is_glob: bool, } /// A procedural macro. #[derive(Clone, Debug, PartialEq, Eq, Hash, Serialize, Deserialize)] pub struct ProcMacro { /// How this macro is supposed to be called: `foo!()`, `#[foo]` or `#[derive(foo)]` pub kind: MacroKind, /// Helper attributes defined by a macro to be used inside it. /// /// Defined only for derive macros. /// /// E.g. the [`Default`] derive macro defines a `#[default]` helper attribute so that one can /// do: /// /// ```rust /// #[derive(Default)] /// enum Option { /// #[default] /// None, /// Some(T), /// } /// ``` pub helpers: Vec, } /// The way a [`ProcMacro`] is declared to be used. #[derive(Clone, Copy, Debug, PartialEq, Eq, Hash, Serialize, Deserialize)] #[serde(rename_all = "snake_case")] pub enum MacroKind { /// A bang macro `foo!()`. Bang, /// An attribute macro `#[foo]`. Attr, /// A derive macro `#[derive(Clone, Debug, PartialEq, Eq, Hash, Serialize, Deserialize)]` Derive, } /// A type alias declaration, e.g. `type Pig = std::borrow::Cow<'static, str>;` #[derive(Clone, Debug, PartialEq, Eq, Hash, Serialize, Deserialize)] pub struct TypeAlias { /// The type referred to by this alias. #[serde(rename = "type")] pub type_: Type, /// Information about the type parameters and `where` clauses of the alias. pub generics: Generics, } /// A `static` declaration. #[derive(Clone, Debug, PartialEq, Eq, Hash, Serialize, Deserialize)] pub struct Static { /// The type of the static. #[serde(rename = "type")] pub type_: Type, /// This is `true` for mutable statics, declared as `static mut X: T = f();` pub is_mutable: bool, /// The stringified expression for the initial value. /// /// It's not guaranteed that it'll match the actual source code for the initial value. pub expr: String, /// Is the static `unsafe`? /// /// This is only true if it's in an `extern` block, and not explicity marked /// as `safe`. /// /// ```rust /// unsafe extern { /// static A: i32; // unsafe /// safe static B: i32; // safe /// } /// /// static C: i32 = 0; // safe /// static mut D: i32 = 0; // safe /// ``` pub is_unsafe: bool, } /// A primitive type declaration. Declarations of this kind can only come from the core library. #[derive(Clone, Debug, PartialEq, Eq, Hash, Serialize, Deserialize)] pub struct Primitive { /// The name of the type. pub name: String, /// The implementations, inherent and of traits, on the primitive type. pub impls: Vec, } #[cfg(test)] mod tests;