From 34fcc76312e340c69a6f8821442e4a55d0b4ca5f Mon Sep 17 00:00:00 2001 From: Andreas Molzer Date: Sat, 19 Sep 2020 04:28:32 +0200 Subject: [PATCH] Add type definitions for rustdoc JSON backend --- src/librustdoc/json/mod.rs | 2 + src/librustdoc/json/types.rs | 274 +++++++++++++++++++++++++++++++++++ 2 files changed, 276 insertions(+) create mode 100644 src/librustdoc/json/types.rs diff --git a/src/librustdoc/json/mod.rs b/src/librustdoc/json/mod.rs index 14f87ec2aa9bb..e77a02bcf996f 100644 --- a/src/librustdoc/json/mod.rs +++ b/src/librustdoc/json/mod.rs @@ -6,6 +6,8 @@ use crate::formats::FormatRenderer; use rustc_span::edition::Edition; +mod types; + #[derive(Clone)] pub struct JsonRenderer {} diff --git a/src/librustdoc/json/types.rs b/src/librustdoc/json/types.rs new file mode 100644 index 0000000000000..a0cd4242bbb46 --- /dev/null +++ b/src/librustdoc/json/types.rs @@ -0,0 +1,274 @@ +//! Defines the types and by extension the structure used for serialization. +use serde::Serialize; +use std::collections::HashMap; + +#[derive(Serialize)] +struct Crate { + name: String, + version: String, + includes_private: bool, + root: Id, + index: HashMap, + paths: HashMap, + extern_crates: HashMap, + format_version: u32, +} + +#[derive(Serialize)] +struct Item { + crate_id: u32, + name: String, + span: Option, + visibility: String, + docs: String, + links: HashMap, + attrs: Vec, + deprecation: Option, + #[serde(flatten)] + inner: ItemInner, +} + +#[derive(Serialize)] +#[serde(tag = "kind", content = "inner")] +enum ItemInner { + #[serde(rename = "module")] + Module { items: Vec }, + #[serde(rename = "function")] + Function { decl: FnDecl, generics: Generics, header: String, abi: String }, + #[serde(rename = "struct")] + Struct { + struct_type: String, + generics: Generics, + fields_stripped: bool, + fields: Vec, + impls: Vec, + }, + #[serde(rename = "union")] + Union { + struct_type: String, + generics: Generics, + fields_stripped: bool, + fields: Vec, + impls: Vec, + }, + #[serde(rename = "struct_field")] + StructField { r#type: Type }, + #[serde(rename = "enum")] + Enum { generics: Generics, fields: Vec, fields_stripped: bool, impls: Vec }, + #[serde(rename = "variant")] + Variant { + #[serde(flatten)] + inner: VariantInner, + }, + #[serde(rename = "trait")] + Trait { + is_auto: bool, + is_unsafe: bool, + items: Vec, + generics: Generics, + bounds: Vec, + }, + #[serde(rename = "trait_alias")] + TraitAlias { generics: Generics, bounds: Vec }, + #[serde(rename = "method")] + Method { decl: FnDecl, generics: Generics, header: String, has_body: bool }, + #[serde(rename = "assoc_const")] + AssocConst { r#type: Type, default: Option }, + #[serde(rename = "assoc_type")] + AssocType { bounds: Vec, default: Option }, + #[serde(rename = "impl")] + Impl { + is_unsafe: bool, + generics: Generics, + provided_trait_methods: Vec, + r#trait: Option, + r#for: Type, + items: Vec, + negative: bool, + synthetic: bool, + blanket_impl: Option, + }, + #[serde(rename = "constant")] + Constant { r#type: Type, expr: String, value: Option, is_literal: bool }, + #[serde(rename = "static")] + Static { r#type: Type, expr: String, mutable: bool }, + #[serde(rename = "typedef")] + Typedef { r#type: Type, generics: Generics }, + #[serde(rename = "opaque_ty")] + OpaqueTy { bounds: Vec, generics: Generics }, + #[serde(rename = "foreign_type")] + ForeignType(), + #[serde(rename = "extern_crate")] + ExternCrate { name: String, rename: Option }, + #[serde(rename = "import")] + Import { source: String, name: String, id: Id, glob: bool }, + #[serde(rename = "macro")] + Macro(String), +} + +#[derive(Serialize)] +#[serde(tag = "variant_kind", content = "variant_inner")] +enum VariantInner { + #[serde(rename = "plain")] + Plain, + #[serde(rename = "tuple")] + Tuple(Vec), + #[serde(rename = "struct")] + Struct(Vec), +} + +#[derive(Serialize)] +#[serde(tag = "kind", content = "inner")] +enum Type { + #[serde(rename = "resolved_path")] + ResolvedPath { + name: String, + args: Option>, + id: Id, + param_names: Box, + }, + #[serde(rename = "generic")] + Generic(String), + #[serde(rename = "tuple")] + Tuple(Vec), + #[serde(rename = "slice")] + Slice(Box), + #[serde(rename = "array")] + Array { r#type: Box, len: String }, + #[serde(rename = "impl_trait")] + ImplTrait(Vec), + #[serde(rename = "never")] + Never, + #[serde(rename = "infer")] + Infer, + #[serde(rename = "function_pointer")] + FunctionPointer { + is_unsafe: bool, + decl: Box, + params: Vec, + abi: String, + }, + #[serde(rename = "raw_pointer")] + RawPointer { mutable: bool, r#type: Box }, + #[serde(rename = "borrowed_ref")] + BorrowedRef { lifetime: Option, mutable: bool, r#type: Box }, + #[serde(rename = "qualified_path")] + QualifiedPath { name: String, self_type: Box, r#trait: Box }, +} + +#[derive(Serialize)] +enum GenericArgs { + #[serde(rename = "angle_bracketed")] + AngleBracketed { args: Vec, bindings: TypeBinding }, + #[serde(rename = "paranthesized")] + Paranthesized { inputs: Vec, output: Type }, +} + +#[derive(Serialize)] +struct TypeBinding { + name: String, + binding: TypeBindingInner, +} + +#[derive(Serialize)] +enum TypeBindingInner { + #[serde(rename = "equality")] + Equality(Type), + #[serde(rename = "constraint")] + Constraint(Vec), +} + +#[derive(Serialize)] +enum GenericArg { + #[serde(rename = "lifetime")] + Lifetime(String), + #[serde(rename = "type")] + Type(Type), + #[serde(rename = "const")] + Const { r#type: Type, expr: String, value: Option, is_literal: bool }, +} + +#[derive(Serialize)] +struct ItemSummary { + crate_id: u32, + path: Vec, + kind: String, +} + +#[derive(Serialize)] +struct ExternalCrate { + name: String, + html_root_url: String, +} + +#[derive(Serialize)] +struct Visibility { + parent: Id, + path: String, +} + +#[derive(Serialize)] +struct Span { + filename: String, + begin: (u32, u32), + end: (u32, u32), +} + +#[derive(Serialize)] +struct Deprecation { + since: Option, + note: Option, +} + +#[derive(Serialize)] +struct FnDecl { + inputs: Vec<(String, Type)>, + output: Option, + c_variadic: bool, +} + +#[derive(Serialize)] +struct Generics { + params: Vec, + where_predicates: Vec, +} + +#[derive(Serialize)] +struct GenericParamDef { + name: String, + kind: GenericParamDefInner, +} + +#[derive(Serialize)] +enum GenericParamDefInner { + #[serde(rename = "lifetime")] + Lifetime, + #[serde(rename = "const")] + Const(Type), + #[serde(rename = "type")] + Type { + bounds: Vec, + default: Option, + // FIXME: this appears in RFC but not in the spec. + synthetic: Option, + }, +} + +#[derive(Serialize)] +enum WherePredicate { + #[serde(rename = "bound_predicate")] + Bound { ty: Type, bounds: Vec }, + #[serde(rename = "region_predicate")] + Region { lifetime: String, bounds: Vec }, + #[serde(rename = "eq_predicate")] + Eq { lhs: Type, rhs: Type }, +} + +#[derive(Serialize)] +enum GenericBound { + #[serde(rename = "trait_bound")] + TraitBound { r#trait: Type, modifier: String, generics_params: Vec }, +} + +#[derive(Serialize, PartialEq, Eq, Hash)] +struct Id(String);