1 //! Rustdoc's JSON output interface
3 //! These types are the public API exposed through the `--output-format json` flag. The [`Crate`]
4 //! struct is the root of the JSON blob and all other items are contained within.
6 use std
::collections
::HashMap
;
7 use std
::path
::PathBuf
;
9 use serde
::{Deserialize, Serialize}
;
11 /// rustdoc format-version.
12 pub const FORMAT_VERSION
: u32 = 24;
14 /// A `Crate` is the root of the emitted JSON blob. It contains all type/documentation information
15 /// about the language items in the local crate, as well as info about external items to allow
16 /// tools to find or link to them.
17 #[derive(Clone, Debug, PartialEq, Eq, Serialize, Deserialize)]
19 /// The id of the root [`Module`] item of the local crate.
21 /// The version string given to `--crate-version`, if any.
22 pub crate_version
: Option
<String
>,
23 /// Whether or not the output includes private items.
24 pub includes_private
: bool
,
25 /// A collection of all items in the local crate as well as some external traits and their
26 /// items that are referenced locally.
27 pub index
: HashMap
<Id
, Item
>,
28 /// Maps IDs to fully qualified paths and other info helpful for generating links.
29 pub paths
: HashMap
<Id
, ItemSummary
>,
30 /// Maps `crate_id` of items to a crate name and html_root_url if it exists.
31 pub external_crates
: HashMap
<u32, ExternalCrate
>,
32 /// A single version number to be used in the future when making backwards incompatible changes
33 /// to the JSON output.
34 pub format_version
: u32,
37 #[derive(Clone, Debug, PartialEq, Eq, Hash, Serialize, Deserialize)]
38 pub struct ExternalCrate
{
40 pub html_root_url
: Option
<String
>,
43 /// For external (not defined in the local crate) items, you don't get the same level of
44 /// information. This struct should contain enough to generate a link/reference to the item in
45 /// question, or can be used by a tool that takes the json output of multiple crates to find
46 /// the actual item definition with all the relevant info.
47 #[derive(Clone, Debug, PartialEq, Eq, Hash, Serialize, Deserialize)]
48 pub struct ItemSummary
{
49 /// Can be used to look up the name and html_root_url of the crate this item came from in the
50 /// `external_crates` map.
52 /// The list of path components for the fully qualified path of this item (e.g.
53 /// `["std", "io", "lazy", "Lazy"]` for `std::io::lazy::Lazy`).
55 /// Note that items can appear in multiple paths, and the one chosen is implementation
56 /// defined. Currently, this is the full path to where the item was defined. Eg
57 /// [`String`] is currently `["alloc", "string", "String"]` and [`HashMap`] is
58 /// `["std", "collections", "hash", "map", "HashMap"]`, but this is subject to change.
59 pub path
: Vec
<String
>,
60 /// Whether this item is a struct, trait, macro, etc.
64 #[derive(Clone, Debug, PartialEq, Eq, Serialize, Deserialize)]
66 /// The unique identifier of this item. Can be used to find this item in various mappings.
68 /// This can be used as a key to the `external_crates` map of [`Crate`] to see which crate
69 /// this item came from.
71 /// Some items such as impls don't have names.
72 pub name
: Option
<String
>,
73 /// The source location of this item (absent if it came from a macro expansion or inline
75 pub span
: Option
<Span
>,
76 /// By default all documented items are public, but you can tell rustdoc to output private items
77 /// so this field is needed to differentiate.
78 pub visibility
: Visibility
,
79 /// The full markdown docstring of this item. Absent if there is no documentation at all,
80 /// Some("") if there is some documentation but it is empty (EG `#[doc = ""]`).
81 pub docs
: Option
<String
>,
82 /// 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
83 pub links
: HashMap
<String
, Id
>,
84 /// Stringified versions of the attributes on this item (e.g. `"#[inline]"`)
85 pub attrs
: Vec
<String
>,
86 pub deprecation
: Option
<Deprecation
>,
91 #[derive(Clone, Debug, PartialEq, Eq, Hash, Serialize, Deserialize)]
93 /// The path to the source file for this span relative to the path `rustdoc` was invoked with.
94 pub filename
: PathBuf
,
95 /// Zero indexed Line and Column of the first character of the `Span`
96 pub begin
: (usize, usize),
97 /// Zero indexed Line and Column of the last character of the `Span`
98 pub end
: (usize, usize),
101 #[derive(Clone, Debug, PartialEq, Eq, Hash, Serialize, Deserialize)]
102 pub struct Deprecation
{
103 pub since
: Option
<String
>,
104 pub note
: Option
<String
>,
107 #[derive(Clone, Debug, PartialEq, Eq, Hash, Serialize, Deserialize)]
108 #[serde(rename_all = "snake_case")]
109 pub enum Visibility
{
111 /// For the most part items are private by default. The exceptions are associated items of
112 /// public traits and variants of public enums.
115 /// For `pub(in path)` visibility. `parent` is the module it's restricted to and `path` is how
116 /// that module was referenced (like `"super::super"` or `"crate::foo::bar"`).
123 #[derive(Clone, Debug, PartialEq, Eq, Hash, Serialize, Deserialize)]
124 pub struct DynTrait
{
125 /// All the traits implemented. One of them is the vtable, and the rest must be auto traits.
126 pub traits
: Vec
<PolyTrait
>,
127 /// The lifetime of the whole dyn object
129 /// dyn Debug + 'static
134 pub lifetime
: Option
<String
>,
137 #[derive(Clone, Debug, PartialEq, Eq, Hash, Serialize, Deserialize)]
138 /// A trait and potential HRTBs
139 pub struct PolyTrait
{
140 #[serde(rename = "trait")]
142 /// Used for Higher-Rank Trait Bounds (HRTBs)
144 /// dyn for<'a> Fn() -> &'a i32"
149 pub generic_params
: Vec
<GenericParamDef
>,
152 #[derive(Clone, Debug, PartialEq, Eq, Hash, Serialize, Deserialize)]
153 #[serde(rename_all = "snake_case")]
154 pub enum GenericArgs
{
155 /// <'a, 32, B: Copy, C = u32>
156 AngleBracketed { args: Vec<GenericArg>, bindings: Vec<TypeBinding> }
,
158 Parenthesized { inputs: Vec<Type>, output: Option<Type> }
,
161 #[derive(Clone, Debug, PartialEq, Eq, Hash, Serialize, Deserialize)]
162 #[serde(rename_all = "snake_case")]
163 pub enum GenericArg
{
170 #[derive(Clone, Debug, PartialEq, Eq, Hash, Serialize, Deserialize)]
171 pub struct Constant
{
172 #[serde(rename = "type")]
175 pub value
: Option
<String
>,
176 pub is_literal
: bool
,
179 #[derive(Clone, Debug, PartialEq, Eq, Hash, Serialize, Deserialize)]
180 pub struct TypeBinding
{
182 pub args
: GenericArgs
,
183 pub binding
: TypeBindingKind
,
186 #[derive(Clone, Debug, PartialEq, Eq, Hash, Serialize, Deserialize)]
187 #[serde(rename_all = "snake_case")]
188 pub enum TypeBindingKind
{
190 Constraint(Vec
<GenericBound
>),
193 #[derive(Clone, Debug, PartialEq, Eq, Hash, Serialize, Deserialize)]
194 pub struct Id(pub String
);
196 #[derive(Clone, Debug, PartialEq, Eq, Hash, Serialize, Deserialize)]
197 #[serde(rename_all = "snake_case")]
225 #[derive(Clone, Debug, PartialEq, Eq, Hash, Serialize, Deserialize)]
226 #[serde(tag = "kind", content = "inner", rename_all = "snake_case")]
231 rename
: Option
<String
>,
244 TraitAlias(TraitAlias
),
253 /// `type`s from an extern block
256 /// Declarative macro_rules! macro
258 ProcMacro(ProcMacro
),
260 Primitive(Primitive
),
263 #[serde(rename = "type")]
265 /// e.g. `const X: usize = 5;`
266 default: Option
<String
>,
270 bounds
: Vec
<GenericBound
>,
271 /// e.g. `type X = usize;`
272 default: Option
<Type
>,
276 #[derive(Clone, Debug, PartialEq, Eq, Hash, Serialize, Deserialize)]
280 /// If `true`, this module is not part of the public API, but it contains
281 /// items that are re-exported as public API.
282 pub is_stripped
: bool
,
285 #[derive(Clone, Debug, PartialEq, Eq, Hash, Serialize, Deserialize)]
287 pub generics
: Generics
,
288 pub fields_stripped
: bool
,
293 #[derive(Clone, Debug, PartialEq, Eq, Hash, Serialize, Deserialize)]
295 pub kind
: StructKind
,
296 pub generics
: Generics
,
300 #[derive(Clone, Debug, PartialEq, Eq, Hash, Serialize, Deserialize)]
301 #[serde(rename_all = "snake_case")]
302 pub enum StructKind
{
303 /// A struct with no fields and no parentheses.
309 /// A struct with unnamed fields.
312 /// pub struct TupleStruct(i32);
313 /// pub struct EmptyTupleStruct();
316 /// All [`Id`]'s will point to [`ItemEnum::StructField`]. Private and
317 /// `#[doc(hidden)]` fields will be given as `None`
318 Tuple(Vec
<Option
<Id
>>),
319 /// A struct with nammed fields.
322 /// pub struct PlainStruct { x: i32 }
323 /// pub struct EmptyPlainStruct {}
325 Plain { fields: Vec<Id>, fields_stripped: bool }
,
328 #[derive(Clone, Debug, PartialEq, Eq, Hash, Serialize, Deserialize)]
330 pub generics
: Generics
,
331 pub variants_stripped
: bool
,
332 pub variants
: Vec
<Id
>,
336 #[derive(Clone, Debug, PartialEq, Eq, Hash, Serialize, Deserialize)]
338 /// Whether the variant is plain, a tuple-like, or struct-like. Contains the fields.
339 pub kind
: VariantKind
,
340 /// The discriminant, if explicitly specified.
341 pub discriminant
: Option
<Discriminant
>,
344 #[derive(Clone, Debug, PartialEq, Eq, Hash, Serialize, Deserialize)]
345 #[serde(rename_all = "snake_case")]
346 pub enum VariantKind
{
347 /// A variant with no parentheses
352 /// PlainWithDiscriminant = 1,
356 /// A variant with unnamed fields.
358 /// Unlike most of json, `#[doc(hidden)]` fields will be given as `None`
359 /// instead of being omitted, because order matters.
363 /// TupleVariant(i32),
364 /// EmptyTupleVariant(),
367 Tuple(Vec
<Option
<Id
>>),
368 /// A variant with named fields.
372 /// StructVariant { x: i32 },
373 /// EmptyStructVariant {},
376 Struct { fields: Vec<Id>, fields_stripped: bool }
,
379 #[derive(Clone, Debug, PartialEq, Eq, Hash, Serialize, Deserialize)]
380 pub struct Discriminant
{
381 /// The expression that produced the discriminant.
383 /// Unlike `value`, this preserves the original formatting (eg suffixes,
384 /// hexadecimal, and underscores), making it unsuitable to be machine
387 /// In some cases, when the value is to complex, this may be `"{ _ }"`.
388 /// When this occurs is unstable, and may change without notice.
390 /// The numerical value of the discriminant. Stored as a string due to
391 /// JSON's poor support for large integers, and the fact that it would need
392 /// to store from [`i128::MIN`] to [`u128::MAX`].
396 #[derive(Clone, Debug, PartialEq, Eq, Hash, Serialize, Deserialize)]
398 #[serde(rename = "const")]
400 #[serde(rename = "unsafe")]
402 #[serde(rename = "async")]
407 #[derive(Clone, Debug, PartialEq, Eq, Hash, Serialize, Deserialize)]
409 // We only have a concrete listing here for stable ABI's because their are so many
410 // See rustc_ast_passes::feature_gate::PostExpansionVisitor::check_abi for the list
413 Cdecl { unwind: bool }
,
414 Stdcall { unwind: bool }
,
415 Fastcall { unwind: bool }
,
416 Aapcs { unwind: bool }
,
417 Win64 { unwind: bool }
,
418 SysV64 { unwind: bool }
,
419 System { unwind: bool }
,
423 /// Represents a function (including methods and other associated functions)
424 #[derive(Clone, Debug, PartialEq, Eq, Hash, Serialize, Deserialize)]
425 pub struct Function
{
427 pub generics
: Generics
,
432 #[derive(Clone, Debug, PartialEq, Eq, Hash, Serialize, Deserialize)]
433 pub struct Generics
{
434 pub params
: Vec
<GenericParamDef
>,
435 pub where_predicates
: Vec
<WherePredicate
>,
438 #[derive(Clone, Debug, PartialEq, Eq, Hash, Serialize, Deserialize)]
439 pub struct GenericParamDef
{
441 pub kind
: GenericParamDefKind
,
444 #[derive(Clone, Debug, PartialEq, Eq, Hash, Serialize, Deserialize)]
445 #[serde(rename_all = "snake_case")]
446 pub enum GenericParamDefKind
{
448 outlives
: Vec
<String
>,
451 bounds
: Vec
<GenericBound
>,
452 default: Option
<Type
>,
453 /// This is normally `false`, which means that this generic parameter is
454 /// declared in the Rust source text.
456 /// If it is `true`, this generic parameter has been introduced by the
457 /// compiler behind the scenes.
463 /// ```ignore (pseudo-rust)
464 /// pub fn f(_: impl Trait) {}
467 /// The compiler will transform this behind the scenes to
469 /// ```ignore (pseudo-rust)
470 /// pub fn f<impl Trait: Trait>(_: impl Trait) {}
473 /// In this example, the generic parameter named `impl Trait` (and which
474 /// is bound by `Trait`) is synthetic, because it was not originally in
475 /// the Rust source text.
479 #[serde(rename = "type")]
481 default: Option
<String
>,
485 #[derive(Clone, Debug, PartialEq, Eq, Hash, Serialize, Deserialize)]
486 #[serde(rename_all = "snake_case")]
487 pub enum WherePredicate
{
489 #[serde(rename = "type")]
491 bounds
: Vec
<GenericBound
>,
492 /// Used for Higher-Rank Trait Bounds (HRTBs)
494 /// where for<'a> &'a T: Iterator,"
499 generic_params
: Vec
<GenericParamDef
>,
503 bounds
: Vec
<GenericBound
>,
511 #[derive(Clone, Debug, PartialEq, Eq, Hash, Serialize, Deserialize)]
512 #[serde(rename_all = "snake_case")]
513 pub enum GenericBound
{
515 #[serde(rename = "trait")]
517 /// Used for Higher-Rank Trait Bounds (HRTBs)
519 /// where F: for<'a, 'b> Fn(&'a u8, &'b u8)
524 generic_params
: Vec
<GenericParamDef
>,
525 modifier
: TraitBoundModifier
,
530 #[derive(Clone, Debug, PartialEq, Eq, Hash, Serialize, Deserialize)]
531 #[serde(rename_all = "snake_case")]
532 pub enum TraitBoundModifier
{
538 #[derive(Clone, Debug, PartialEq, Eq, Hash, Serialize, Deserialize)]
539 #[serde(rename_all = "snake_case")]
545 #[derive(Clone, Debug, PartialEq, Eq, Hash, Serialize, Deserialize)]
546 #[serde(rename_all = "snake_case")]
547 #[serde(tag = "kind", content = "inner")]
549 /// Structs, enums, and unions
552 /// Parameterized types
554 /// Built in numberic (i*, u*, f*) types, bool, and char
556 /// `extern "ABI" fn`
557 FunctionPointer(Box
<FunctionPointer
>),
558 /// `(String, u32, Box<usize>)`
564 #[serde(rename = "type")]
568 /// `impl TraitA + TraitB + ...`
569 ImplTrait(Vec
<GenericBound
>),
572 /// `*mut u32`, `*u8`, etc.
575 #[serde(rename = "type")]
578 /// `&'a mut String`, `&str`, etc.
580 lifetime
: Option
<String
>,
582 #[serde(rename = "type")]
585 /// `<Type as Trait>::Name` or associated types like `T::Item` where `T: Iterator`
588 args
: Box
<GenericArgs
>,
589 self_type
: Box
<Type
>,
590 #[serde(rename = "trait")]
595 #[derive(Clone, Debug, PartialEq, Eq, Hash, Serialize, Deserialize)]
599 /// Generic arguments to the type
601 /// std::borrow::Cow<'static, str>
606 pub args
: Option
<Box
<GenericArgs
>>,
609 #[derive(Clone, Debug, PartialEq, Eq, Hash, Serialize, Deserialize)]
610 pub struct FunctionPointer
{
612 /// Used for Higher-Rank Trait Bounds (HRTBs)
614 /// for<'c> fn(val: &'c i32) -> i32
619 pub generic_params
: Vec
<GenericParamDef
>,
623 #[derive(Clone, Debug, PartialEq, Eq, Hash, Serialize, Deserialize)]
625 /// List of argument names and their type.
627 /// Note that not all names will be valid identifiers, as some of
628 /// them may be patterns.
629 pub inputs
: Vec
<(String
, Type
)>,
630 pub output
: Option
<Type
>,
631 pub c_variadic
: bool
,
634 #[derive(Clone, Debug, PartialEq, Eq, Hash, Serialize, Deserialize)]
639 pub generics
: Generics
,
640 pub bounds
: Vec
<GenericBound
>,
641 pub implementations
: Vec
<Id
>,
644 #[derive(Clone, Debug, PartialEq, Eq, Hash, Serialize, Deserialize)]
645 pub struct TraitAlias
{
646 pub generics
: Generics
,
647 pub params
: Vec
<GenericBound
>,
650 #[derive(Clone, Debug, PartialEq, Eq, Hash, Serialize, Deserialize)]
653 pub generics
: Generics
,
654 pub provided_trait_methods
: Vec
<String
>,
655 #[serde(rename = "trait")]
656 pub trait_
: Option
<Path
>,
657 #[serde(rename = "for")]
662 pub blanket_impl
: Option
<Type
>,
665 #[derive(Clone, Debug, PartialEq, Eq, Hash, Serialize, Deserialize)]
666 #[serde(rename_all = "snake_case")]
668 /// The full path being imported.
670 /// May be different from the last segment of `source` when renaming imports:
671 /// `use source as name;`
673 /// The ID of the item being imported. Will be `None` in case of re-exports of primitives:
675 /// pub use i32 as my_i32;
678 /// Whether this import uses a glob: `use source::*;`
682 #[derive(Clone, Debug, PartialEq, Eq, Hash, Serialize, Deserialize)]
683 pub struct ProcMacro
{
685 pub helpers
: Vec
<String
>,
688 #[derive(Clone, Debug, PartialEq, Eq, Hash, Serialize, Deserialize)]
689 #[serde(rename_all = "snake_case")]
691 /// A bang macro `foo!()`.
693 /// An attribute macro `#[foo]`.
695 /// A derive macro `#[derive(Clone, Debug, PartialEq, Eq, Hash, Serialize, Deserialize)]`
699 #[derive(Clone, Debug, PartialEq, Eq, Hash, Serialize, Deserialize)]
701 #[serde(rename = "type")]
703 pub generics
: Generics
,
706 #[derive(Clone, Debug, PartialEq, Eq, Hash, Serialize, Deserialize)]
707 pub struct OpaqueTy
{
708 pub bounds
: Vec
<GenericBound
>,
709 pub generics
: Generics
,
712 #[derive(Clone, Debug, PartialEq, Eq, Hash, Serialize, Deserialize)]
714 #[serde(rename = "type")]
720 #[derive(Clone, Debug, PartialEq, Eq, Hash, Serialize, Deserialize)]
721 pub struct Primitive
{