From fa96acc162d3708520179ae156c56686f0d7c107 Mon Sep 17 00:00:00 2001 From: Andreas Molzer Date: Sat, 5 Sep 2020 19:38:50 +0200 Subject: [PATCH 01/28] Split cache_dir from generic temp_dir --- src/config/mod.rs | 16 +++++++++++++++- src/generator/mod.rs | 2 +- 2 files changed, 16 insertions(+), 2 deletions(-) diff --git a/src/config/mod.rs b/src/config/mod.rs index 728e32f..2b5104a 100644 --- a/src/config/mod.rs +++ b/src/config/mod.rs @@ -61,6 +61,8 @@ pub struct FileConfig { /// Defaults to tex for stdout. #[structopt(short = "t", long = "to", long = "out-type", long = "output-type")] pub output_type: Option, + #[structopt(short = "c", long = "cache", long = "cache-dir")] + pub cache_dir: Option, /// Type of the document. #[structopt(long)] @@ -247,6 +249,11 @@ pub struct Config { /// directory. This prevents content injection from untrusted sources and is currently the /// result of choosing this path randomly. TODO: Make this restriction explicit. pub temp_dir: PathBuf, + /// Space for downloaded (or generated?) input files. + /// + /// Defaults to the `temp_dir` if not otherwise configured. + /// TODO: Similar restrictions as to `temp_dir` apply. + pub cache_dir: PathBuf, pub input: FileOrStdio, pub document_folder: PathBuf, pub project_root: PathBuf, @@ -454,8 +461,15 @@ impl Config { Config { output, - out_dir: args.out_dir.unwrap_or_else(|| tempdir.path().to_owned()), + out_dir: args.out_dir + .unwrap_or_else(|| tempdir.path().to_owned()), temp_dir: tempdir_path, + cache_dir: { + let configured = infile.cache_dir + .or(file.cache_dir) + .unwrap_or_else(|| tempdir.path().to_owned()); + project_root.join(configured) + }, input: args.input, document_folder, project_root, diff --git a/src/generator/mod.rs b/src/generator/mod.rs index 877489d..c3d1311 100644 --- a/src/generator/mod.rs +++ b/src/generator/mod.rs @@ -67,7 +67,7 @@ impl<'a, B: Backend<'a>, W: Write> Generator<'a, B, W> { cfg, default_out, stack: Vec::new(), - resolver: Resolver::new(cfg.project_root.clone(), cfg.document_folder.clone(), cfg.temp_dir.clone()), + resolver: Resolver::new(cfg.project_root.clone(), cfg.document_folder.clone(), cfg.cache_dir.clone()), template, stderr, } From 191aa0c6ce29e5d2ba933881c81155a99b1432f4 Mon Sep 17 00:00:00 2001 From: Andreas Molzer Date: Sun, 6 Sep 2020 18:58:06 +0200 Subject: [PATCH 02/28] Plan an unimplemented rustdoc type --- src/backend/latex/preamble.rs | 2 +- src/backend/mod.rs | 7 +++++++ src/config/mod.rs | 3 ++- src/main.rs | 4 ++++ 4 files changed, 14 insertions(+), 2 deletions(-) diff --git a/src/backend/latex/preamble.rs b/src/backend/latex/preamble.rs index 8325c48..d84ec9b 100644 --- a/src/backend/latex/preamble.rs +++ b/src/backend/latex/preamble.rs @@ -165,7 +165,7 @@ pub fn write_maketitle_info(cfg: &Config, short_author: ShortAuthor, out: &mut i } if cfg.titlehead.is_some() || cfg.logo_university.is_some() { match cfg.document_type { - DocumentType::Article | DocumentType::Report | DocumentType::Thesis => { + DocumentType::Article | DocumentType::Report | DocumentType::Thesis | DocumentType::RustDoc => { writeln!(out, "\\titlehead{{")?; let mut joiner = OutJoiner::new(&mut *out, "\\\\"); if let Some(titlehead) = &cfg.titlehead { diff --git a/src/backend/mod.rs b/src/backend/mod.rs index 3a268d7..6216126 100644 --- a/src/backend/mod.rs +++ b/src/backend/mod.rs @@ -43,6 +43,13 @@ pub fn generate<'a>( Ok(()) } +pub fn generate_rust_docs<'a>( + cfg: &'a Config, backend: impl Backend<'a>, arena: &'a Arena, what_cargo: String, + out: impl Write, stderr: Arc>, +) -> FatalResult<()> { + todo!() +} + #[rustfmt::skip] pub trait Backend<'a>: Sized + Debug { // MediumCodeGenUnits are used for leaf-events, which don't contain any further events. diff --git a/src/config/mod.rs b/src/config/mod.rs index 2b5104a..3113f60 100644 --- a/src/config/mod.rs +++ b/src/config/mod.rs @@ -494,7 +494,7 @@ impl Config { .unwrap_or(MaybeUnknown::Known(CitationStyle::Ieee)), figures: args.fileconfig.figures.or(infile.figures).or(file.figures).unwrap_or_else( || match document_type { - DocumentType::Article | DocumentType::Beamer => false, + DocumentType::Article | DocumentType::Beamer | DocumentType::RustDoc => false, DocumentType::Thesis | DocumentType::Report => true, }, ), @@ -706,6 +706,7 @@ pub enum DocumentType { Report, Thesis, Beamer, + RustDoc, } #[derive(Debug, Clone, Copy, PartialEq, Eq, Deserialize, Display, EnumString)] diff --git a/src/main.rs b/src/main.rs index b563764..c926157 100644 --- a/src/main.rs +++ b/src/main.rs @@ -165,6 +165,10 @@ fn gen_latex(cfg: &Config, markdown: String, out: impl Write) { OutType::Pdf | OutType::Latex => backend::generate(cfg, Beamer::new(), &Arena::new(), markdown, out, stderr), OutType::Mp4 => backend::generate(cfg, SlidesFfmpegEspeak::new(), &Arena::new(), markdown, out, stderr), }, + DocumentType::RustDoc => { + let input = markdown; + backend::generate_rust_docs(cfg, Report::new(), &Arena::new(), input, out, stderr) + } DocumentType::Report => backend::generate(cfg, Report::new(), &Arena::new(), markdown, out, stderr), DocumentType::Thesis => backend::generate(cfg, Thesis::new(), &Arena::new(), markdown, out, stderr), }; From 20c13ddb56b26e4b9130438051485fc842a6afc0 Mon Sep 17 00:00:00 2001 From: Andreas Molzer Date: Sun, 6 Sep 2020 20:10:50 +0200 Subject: [PATCH 03/28] Add bindings for described rustdoc format --- src/frontend/mod.rs | 1 + src/frontend/rustdoc/mod.rs | 351 ++++++++++++++++++++++++++++++++++++ 2 files changed, 352 insertions(+) create mode 100644 src/frontend/rustdoc/mod.rs diff --git a/src/frontend/mod.rs b/src/frontend/mod.rs index 44d34c0..5d00a6e 100644 --- a/src/frontend/mod.rs +++ b/src/frontend/mod.rs @@ -15,6 +15,7 @@ mod convert_cow; mod event; pub mod range; mod refs; +mod rustdoc; mod size; mod table_layout; diff --git a/src/frontend/rustdoc/mod.rs b/src/frontend/rustdoc/mod.rs new file mode 100644 index 0000000..c625234 --- /dev/null +++ b/src/frontend/rustdoc/mod.rs @@ -0,0 +1,351 @@ +use std::collections::HashMap; +use serde::Deserialize; + +#[derive(Deserialize)] +struct Crate { + name: String, + version: String, + includes_private: bool, + root: Id, + index: HashMap, + paths: HashMap, + extern_crates: HashMap, + format_version: u32, +} + +#[derive(Deserialize)] +struct Item { + crate_id: u32, + name: String, + span: Option, + visibility: String, + docs: String, + links: HashMap, + attrs: Vec, + deprecation: Option, + #[serde(flatten)] + inner: ItemInner , +} + +#[derive(Deserialize)] +#[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 { + // FIXME: + }, + #[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(Deserialize)] +#[serde(tag = "kind", content = "inner")] +enum Type { + // FIXME: resoled_path + #[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(Deserialize)] +enum GenericArgs { + #[serde(rename = "angle_bracketed")] + AngleBracketed { + args: Vec, + bindings: TypeBinding, + }, + #[serde(rename = "paranthesized")] + Paranthesized { + inputs: Vec, + output: Type, + }, +} + +#[derive(Deserialize)] +struct TypeBinding { + name: String, + binding: TypeBindingInner, +} + +#[derive(Deserialize)] +enum TypeBindingInner { + #[serde(rename = "equality")] + Equality(Type), + #[serde(rename = "constraint")] + Constraint(Vec), +} + +#[derive(Deserialize)] +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(Deserialize)] +struct ItemSummary { + crate_id: u32, + path: Vec, + kind: String, +} + +#[derive(Deserialize)] +struct ExternalCrate { + name: String, + html_root_url: String, +} + +#[derive(Deserialize)] +struct Visibility { + parent: Id, + path: String, +} + +#[derive(Deserialize)] +struct Span { + filename: String, + begin: (u32, u32), + end: (u32, u32), +} + +#[derive(Deserialize)] +struct Deprecation { + since: Option, + note: Option, +} + +#[derive(Deserialize)] +struct FnDecl { + inputs: Vec<(String, Type)>, + output: Option, + c_variadic: bool, +} + +#[derive(Deserialize)] +struct Generics { + params: Vec, + where_predicates: Vec, +} + +#[derive(Deserialize)] +struct GenericParamDef { + name: String, + kind: GenericParamDefInner, +} + +#[derive(Deserialize)] +enum GenericParamDefInner { + #[serde(rename = "lifetime")] + Lifetime, + #[serde(rename = "const")] + Const(Type), + #[serde(rename = "type")] + Type { + bounds: Vec, + default: Option, + // TODO: this appears in RFC but not in the spec. + synthetic: Option, + }, +} + +#[derive(Deserialize)] +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(Deserialize)] +enum GenericBound { + #[serde(rename = "trait_bound")] + TraitBound { + r#trait: Type, + modifier: String, + generics_params: Vec, + } +} + +#[derive(Deserialize, PartialEq, Eq, Hash)] +struct Id(String); From b53f7cee0d4355543d0c32857c481522dbc515d7 Mon Sep 17 00:00:00 2001 From: Andreas Molzer Date: Wed, 16 Dec 2020 19:47:20 +0100 Subject: [PATCH 04/28] Use the rustdoc type definitions --- src/frontend/rustdoc/mod.rs | 352 +----------------------- src/frontend/rustdoc/types.rs | 491 ++++++++++++++++++++++++++++++++++ 2 files changed, 492 insertions(+), 351 deletions(-) create mode 100644 src/frontend/rustdoc/types.rs diff --git a/src/frontend/rustdoc/mod.rs b/src/frontend/rustdoc/mod.rs index c625234..6f8b3de 100644 --- a/src/frontend/rustdoc/mod.rs +++ b/src/frontend/rustdoc/mod.rs @@ -1,351 +1 @@ -use std::collections::HashMap; -use serde::Deserialize; - -#[derive(Deserialize)] -struct Crate { - name: String, - version: String, - includes_private: bool, - root: Id, - index: HashMap, - paths: HashMap, - extern_crates: HashMap, - format_version: u32, -} - -#[derive(Deserialize)] -struct Item { - crate_id: u32, - name: String, - span: Option, - visibility: String, - docs: String, - links: HashMap, - attrs: Vec, - deprecation: Option, - #[serde(flatten)] - inner: ItemInner , -} - -#[derive(Deserialize)] -#[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 { - // FIXME: - }, - #[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(Deserialize)] -#[serde(tag = "kind", content = "inner")] -enum Type { - // FIXME: resoled_path - #[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(Deserialize)] -enum GenericArgs { - #[serde(rename = "angle_bracketed")] - AngleBracketed { - args: Vec, - bindings: TypeBinding, - }, - #[serde(rename = "paranthesized")] - Paranthesized { - inputs: Vec, - output: Type, - }, -} - -#[derive(Deserialize)] -struct TypeBinding { - name: String, - binding: TypeBindingInner, -} - -#[derive(Deserialize)] -enum TypeBindingInner { - #[serde(rename = "equality")] - Equality(Type), - #[serde(rename = "constraint")] - Constraint(Vec), -} - -#[derive(Deserialize)] -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(Deserialize)] -struct ItemSummary { - crate_id: u32, - path: Vec, - kind: String, -} - -#[derive(Deserialize)] -struct ExternalCrate { - name: String, - html_root_url: String, -} - -#[derive(Deserialize)] -struct Visibility { - parent: Id, - path: String, -} - -#[derive(Deserialize)] -struct Span { - filename: String, - begin: (u32, u32), - end: (u32, u32), -} - -#[derive(Deserialize)] -struct Deprecation { - since: Option, - note: Option, -} - -#[derive(Deserialize)] -struct FnDecl { - inputs: Vec<(String, Type)>, - output: Option, - c_variadic: bool, -} - -#[derive(Deserialize)] -struct Generics { - params: Vec, - where_predicates: Vec, -} - -#[derive(Deserialize)] -struct GenericParamDef { - name: String, - kind: GenericParamDefInner, -} - -#[derive(Deserialize)] -enum GenericParamDefInner { - #[serde(rename = "lifetime")] - Lifetime, - #[serde(rename = "const")] - Const(Type), - #[serde(rename = "type")] - Type { - bounds: Vec, - default: Option, - // TODO: this appears in RFC but not in the spec. - synthetic: Option, - }, -} - -#[derive(Deserialize)] -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(Deserialize)] -enum GenericBound { - #[serde(rename = "trait_bound")] - TraitBound { - r#trait: Type, - modifier: String, - generics_params: Vec, - } -} - -#[derive(Deserialize, PartialEq, Eq, Hash)] -struct Id(String); +mod types; diff --git a/src/frontend/rustdoc/types.rs b/src/frontend/rustdoc/types.rs new file mode 100644 index 0000000..1076b1a --- /dev/null +++ b/src/frontend/rustdoc/types.rs @@ -0,0 +1,491 @@ +// Adopted from: rust-lang/rust, c254a15906d6ad64821659b50c4265c96b113159, src/librustdoc/json/types.rs +//! 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. + +use std::path::PathBuf; + +use std::collections::HashMap; +use serde::{Deserialize}; + +/// 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 +/// tools to find or link to them. +#[derive(Clone, Debug, Deserialize, PartialEq)] +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, +} + +#[derive(Clone, Debug, Deserialize, PartialEq)] +pub struct ExternalCrate { + pub name: String, + pub html_root_url: Option, +} + +/// For external (not defined in the local crate) 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, Deserialize, PartialEq)] +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`). + pub path: Vec, + /// Whether this item is a struct, trait, macro, etc. + pub kind: ItemKind, +} + +#[derive(Clone, Debug, Deserialize, PartialEq)] +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 source: 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. + pub docs: String, + /// 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, + pub deprecation: Option, + pub kind: ItemKind, + pub inner: ItemEnum, +} + +#[derive(Clone, Debug, Deserialize, PartialEq)] +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), +} + +#[derive(Clone, Debug, Deserialize, PartialEq)] +pub struct Deprecation { + pub since: Option, + pub note: Option, +} + +#[serde(rename_all = "snake_case")] +#[derive(Clone, Debug, Deserialize, PartialEq)] +pub enum Visibility { + Public, + /// For the most part items are private by default. The exceptions are associated items of + /// public traits and variants of public enums. + Default, + Crate, + /// For `pub(in path)` visibility. `parent` is the module it's restricted to and `path` is how + /// that module was referenced (like `"super::super"` or `"crate::foo::bar"`). + Restricted { + parent: Id, + path: String, + }, +} + +#[serde(rename_all = "snake_case")] +#[derive(Clone, Debug, Deserialize, PartialEq)] +pub enum GenericArgs { + /// <'a, 32, B: Copy, C = u32> + AngleBracketed { args: Vec, bindings: Vec }, + /// Fn(A, B) -> C + Parenthesized { inputs: Vec, output: Option }, +} + +#[serde(rename_all = "snake_case")] +#[derive(Clone, Debug, Deserialize, PartialEq)] +pub enum GenericArg { + Lifetime(String), + Type(Type), + Const(Constant), +} + +#[derive(Clone, Debug, Deserialize, PartialEq)] +pub struct Constant { + #[serde(rename = "type")] + pub type_: Type, + pub expr: String, + pub value: Option, + pub is_literal: bool, +} + +#[derive(Clone, Debug, Deserialize, PartialEq)] +pub struct TypeBinding { + pub name: String, + pub binding: TypeBindingKind, +} + +#[serde(rename_all = "snake_case")] +#[derive(Clone, Debug, Deserialize, PartialEq)] +pub enum TypeBindingKind { + Equality(Type), + Constraint(Vec), +} + +#[derive(Clone, Debug, PartialEq, Eq, Hash, Deserialize)] +pub struct Id(pub String); + +#[serde(rename_all = "snake_case")] +#[derive(Clone, Debug, Deserialize, PartialEq)] +pub enum ItemKind { + Module, + ExternCrate, + Import, + Struct, + StructField, + Union, + Enum, + Variant, + Function, + Typedef, + OpaqueTy, + Constant, + Trait, + TraitAlias, + Method, + Impl, + Static, + ForeignType, + Macro, + ProcAttribute, + ProcDerive, + AssocConst, + AssocType, + Primitive, + Keyword, +} + +#[serde(untagged)] +#[derive(Clone, Debug, Deserialize, PartialEq)] +pub enum ItemEnum { + ModuleItem(Module), + ExternCrateItem { + name: String, + rename: Option, + }, + ImportItem(Import), + + StructItem(Struct), + StructFieldItem(Type), + EnumItem(Enum), + VariantItem(Variant), + + FunctionItem(Function), + + TraitItem(Trait), + TraitAliasItem(TraitAlias), + MethodItem(Method), + ImplItem(Impl), + + TypedefItem(Typedef), + OpaqueTyItem(OpaqueTy), + ConstantItem(Constant), + + StaticItem(Static), + + /// `type`s from an extern block + ForeignTypeItem, + + /// Declarative macro_rules! macro + MacroItem(String), + ProcMacroItem(ProcMacro), + + AssocConstItem { + #[serde(rename = "type")] + type_: Type, + /// e.g. `const X: usize = 5;` + default: Option, + }, + AssocTypeItem { + bounds: Vec, + /// e.g. `type X = usize;` + default: Option, + }, +} + +#[derive(Clone, Debug, Deserialize, PartialEq)] +pub struct Module { + pub is_crate: bool, + pub items: Vec, +} + +#[derive(Clone, Debug, Deserialize, PartialEq)] +pub struct Struct { + pub struct_type: StructType, + pub generics: Generics, + pub fields_stripped: bool, + pub fields: Vec, + pub impls: Vec, +} + +#[derive(Clone, Debug, Deserialize, PartialEq)] +pub struct Enum { + pub generics: Generics, + pub variants_stripped: bool, + pub variants: Vec, + pub impls: Vec, +} + +#[serde(rename_all = "snake_case")] +#[serde(tag = "variant_kind", content = "variant_inner")] +#[derive(Clone, Debug, Deserialize, PartialEq)] +pub enum Variant { + Plain, + Tuple(Vec), + Struct(Vec), +} + +#[serde(rename_all = "snake_case")] +#[derive(Clone, Debug, Deserialize, PartialEq)] +pub enum StructType { + Plain, + Tuple, + Unit, +} + +#[derive(Clone, Debug, Deserialize, PartialEq)] +pub struct Function { + pub decl: FnDecl, + pub generics: Generics, + pub header: String, + pub abi: String, +} + +#[derive(Clone, Debug, Deserialize, PartialEq)] +pub struct Method { + pub decl: FnDecl, + pub generics: Generics, + pub header: String, + pub has_body: bool, +} + +#[derive(Clone, Debug, Default, Deserialize, PartialEq)] +pub struct Generics { + pub params: Vec, + pub where_predicates: Vec, +} + +#[derive(Clone, Debug, Deserialize, PartialEq)] +pub struct GenericParamDef { + pub name: String, + pub kind: GenericParamDefKind, +} + +#[serde(rename_all = "snake_case")] +#[derive(Clone, Debug, Deserialize, PartialEq)] +pub enum GenericParamDefKind { + Lifetime, + Type { bounds: Vec, default: Option }, + Const(Type), +} + +#[serde(rename_all = "snake_case")] +#[derive(Clone, Debug, Deserialize, PartialEq)] +pub enum WherePredicate { + BoundPredicate { ty: Type, bounds: Vec }, + RegionPredicate { lifetime: String, bounds: Vec }, + EqPredicate { lhs: Type, rhs: Type }, +} + +#[serde(rename_all = "snake_case")] +#[derive(Clone, Debug, Deserialize, PartialEq)] +pub enum GenericBound { + TraitBound { + #[serde(rename = "trait")] + trait_: Type, + /// Used for HRTBs + generic_params: Vec, + modifier: TraitBoundModifier, + }, + Outlives(String), +} + +#[serde(rename_all = "snake_case")] +#[derive(Clone, Debug, Deserialize, PartialEq)] +pub enum TraitBoundModifier { + None, + Maybe, + MaybeConst, +} + +#[serde(rename_all = "snake_case")] +#[serde(tag = "kind", content = "inner")] +#[derive(Clone, Debug, Deserialize, PartialEq)] +pub enum Type { + /// Structs, enums, and traits + ResolvedPath { + name: String, + id: Id, + args: Option>, + param_names: Vec, + }, + /// Parameterized types + Generic(String), + /// Fixed-size numeric types (plus int/usize/float), char, arrays, slices, and tuples + Primitive(String), + /// `extern "ABI" fn` + FunctionPointer(Box), + /// `(String, u32, Box)` + Tuple(Vec), + /// `[u32]` + Slice(Box), + /// [u32; 15] + Array { + #[serde(rename = "type")] + type_: Box, + len: String, + }, + /// `impl TraitA + TraitB + ...` + ImplTrait(Vec), + /// `!` + Never, + /// `_` + Infer, + /// `*mut u32`, `*u8`, etc. + RawPointer { + mutable: bool, + #[serde(rename = "type")] + type_: Box, + }, + /// `&'a mut String`, `&str`, etc. + BorrowedRef { + lifetime: Option, + mutable: bool, + #[serde(rename = "type")] + type_: Box, + }, + /// `::Name` or associated types like `T::Item` where `T: Iterator` + QualifiedPath { + name: String, + self_type: Box, + #[serde(rename = "trait")] + trait_: Box, + }, +} + +#[derive(Clone, Debug, Deserialize, PartialEq)] +pub struct FunctionPointer { + pub is_unsafe: bool, + pub generic_params: Vec, + pub decl: FnDecl, + pub abi: String, +} + +#[derive(Clone, Debug, Deserialize, PartialEq)] +pub struct FnDecl { + pub inputs: Vec<(String, Type)>, + pub output: Option, + pub c_variadic: bool, +} + +#[derive(Clone, Debug, Deserialize, PartialEq)] +pub struct Trait { + pub is_auto: bool, + pub is_unsafe: bool, + pub items: Vec, + pub generics: Generics, + pub bounds: Vec, + pub implementors: Vec, +} + +#[derive(Clone, Debug, Deserialize, PartialEq)] +pub struct TraitAlias { + pub generics: Generics, + pub params: Vec, +} + +#[derive(Clone, Debug, Deserialize, PartialEq)] +pub struct Impl { + pub is_unsafe: bool, + pub generics: Generics, + pub provided_trait_methods: Vec, + #[serde(rename = "trait")] + pub trait_: Option, + #[serde(rename = "for")] + pub for_: Type, + pub items: Vec, + pub negative: bool, + pub synthetic: bool, + pub blanket_impl: Option, +} + +#[serde(rename_all = "snake_case")] +#[derive(Clone, Debug, Deserialize, PartialEq)] +pub struct Import { + /// The full path being imported. + pub span: 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. + pub id: Option, // FIXME is this actually ever None? + /// Whether this import uses a glob: `use source::*;` + pub glob: bool, +} + +#[derive(Clone, Debug, Deserialize, PartialEq)] +pub struct ProcMacro { + pub kind: MacroKind, + pub helpers: Vec, +} + +#[serde(rename_all = "snake_case")] +#[derive(Clone, Debug, Deserialize, PartialEq)] +pub enum MacroKind { + /// A bang macro `foo!()`. + Bang, + /// An attribute macro `#[foo]`. + Attr, + /// A derive macro `#[derive(Foo)]` + Derive, +} + +#[derive(Clone, Debug, Deserialize, PartialEq)] +pub struct Typedef { + #[serde(rename = "type")] + pub type_: Type, + pub generics: Generics, +} + +#[derive(Clone, Debug, Deserialize, PartialEq)] +pub struct OpaqueTy { + pub bounds: Vec, + pub generics: Generics, +} + +#[derive(Clone, Debug, Deserialize, PartialEq)] +pub struct Static { + #[serde(rename = "type")] + pub type_: Type, + pub mutable: bool, + pub expr: String, +} From a2dae5ef68e8d57ea7c42bdad7f82135a6066cd5 Mon Sep 17 00:00:00 2001 From: Andreas Molzer Date: Wed, 20 Jan 2021 23:37:40 +0100 Subject: [PATCH 05/28] Sketch iterative event generation from rustdoc --- Cargo.lock | 2087 ++++++++++++++++----------------- Cargo.toml | 1 + src/frontend/rustdoc/mod.rs | 236 ++++ src/frontend/rustdoc/types.rs | 18 +- src/generator/iter.rs | 6 +- src/generator/mod.rs | 8 +- 6 files changed, 1302 insertions(+), 1054 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 0c4cf73..db84e0f 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -4,210 +4,237 @@ name = "adler32" version = "1.0.4" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5d2e7343e7fc9de883d1b0341e0b13970f764c14101234857d2ddafa1cb1cac2" [[package]] name = "aho-corasick" version = "0.7.6" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "58fb5e95d83b38284460a5fda7d6470aa0b8844d283a0b614b8535e880800d2d" dependencies = [ - "memchr 2.3.0 (registry+https://github.com/rust-lang/crates.io-index)", + "memchr", ] [[package]] name = "alga" version = "0.9.2" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "658f9468113d34781f6ca9d014d174c74b73de870f1e0e3ad32079bbab253b19" dependencies = [ - "approx 0.3.2 (registry+https://github.com/rust-lang/crates.io-index)", - "libm 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)", - "num-complex 0.2.4 (registry+https://github.com/rust-lang/crates.io-index)", - "num-traits 0.2.11 (registry+https://github.com/rust-lang/crates.io-index)", + "approx", + "libm", + "num-complex", + "num-traits", ] [[package]] name = "ansi_term" version = "0.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ee49baf6cb617b853aa8d93bf420db2383fab46d314482ca2803b40d5fde979b" dependencies = [ - "winapi 0.3.8 (registry+https://github.com/rust-lang/crates.io-index)", + "winapi 0.3.8", ] [[package]] name = "approx" version = "0.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f0e60b75072ecd4168020818c0107f2857bb6c4e64252d8d3983f6263b40a5c3" dependencies = [ - "num-traits 0.2.11 (registry+https://github.com/rust-lang/crates.io-index)", + "num-traits", ] [[package]] name = "arrayvec" version = "0.5.1" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cff77d8686867eceff3105329d4698d96c2391c176d5d03adc90c7389162b5b8" [[package]] name = "atty" version = "0.2.14" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d9b39be18770d11421cdb1b9947a45dd3f37e93092cbf377614828a319d5fee8" dependencies = [ - "hermit-abi 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)", - "libc 0.2.66 (registry+https://github.com/rust-lang/crates.io-index)", - "winapi 0.3.8 (registry+https://github.com/rust-lang/crates.io-index)", + "hermit-abi", + "libc", + "winapi 0.3.8", ] [[package]] name = "autocfg" version = "0.1.7" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1d49d90015b3c36167a20fe2810c5cd875ad504b39cff3d4eae7977e6b7c1cb2" [[package]] name = "autocfg" version = "1.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f8aac770f1885fd7e387acedd76065302551364496e46b3dd00860b2f8359b9d" [[package]] name = "backtrace" version = "0.3.42" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b4b1549d804b6c73f4817df2ba073709e96e426f12987127c48e6745568c350b" dependencies = [ - "backtrace-sys 0.1.32 (registry+https://github.com/rust-lang/crates.io-index)", - "cfg-if 0.1.10 (registry+https://github.com/rust-lang/crates.io-index)", - "libc 0.2.66 (registry+https://github.com/rust-lang/crates.io-index)", - "rustc-demangle 0.1.16 (registry+https://github.com/rust-lang/crates.io-index)", + "backtrace-sys", + "cfg-if", + "libc", + "rustc-demangle", ] [[package]] name = "backtrace-sys" version = "0.1.32" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5d6575f128516de27e3ce99689419835fce9643a9b215a14d2b5b685be018491" dependencies = [ - "cc 1.0.50 (registry+https://github.com/rust-lang/crates.io-index)", - "libc 0.2.66 (registry+https://github.com/rust-lang/crates.io-index)", + "cc", + "libc", ] [[package]] name = "base64" version = "0.10.1" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0b25d992356d2eb0ed82172f5248873db5560c4721f564b13cb5193bda5e668e" dependencies = [ - "byteorder 1.3.2 (registry+https://github.com/rust-lang/crates.io-index)", + "byteorder", ] [[package]] name = "bitflags" version = "1.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cf1de2fe8c75bc145a2f577add951f8134889b4795d47466a54a5c846d691693" [[package]] name = "block" version = "0.1.6" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0d8c1fef690941d3e7788d328517591fecc684c084084702d6ff1641e993699a" [[package]] name = "block-buffer" version = "0.7.3" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c0940dc441f31689269e10ac70eb1002a3a1d3ad1390e030043662eb7fe4688b" dependencies = [ - "block-padding 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)", - "byte-tools 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)", - "byteorder 1.3.2 (registry+https://github.com/rust-lang/crates.io-index)", - "generic-array 0.12.3 (registry+https://github.com/rust-lang/crates.io-index)", + "block-padding", + "byte-tools", + "byteorder", + "generic-array", ] [[package]] name = "block-padding" version = "0.1.5" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fa79dedbb091f449f1f39e53edf88d5dbe95f895dae6135a8d7b881fb5af73f5" dependencies = [ - "byte-tools 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)", + "byte-tools", ] [[package]] name = "boolinator" version = "2.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cfa8873f51c92e232f9bac4065cddef41b714152812bfc5f7672ba16d6ef8cd9" [[package]] name = "byte-tools" version = "0.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e3b5ca7a04898ad4bcd41c90c5285445ff5b791899bb1b0abdd2a2aa791211d7" [[package]] name = "byteorder" version = "1.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a7c3dd8985a7111efc5c80b44e23ecdd8c007de8ade3b96595387e812b957cf5" [[package]] name = "bytes" version = "0.4.12" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "206fdffcfa2df7cbe15601ef46c813fce0965eb3286db6b56c583b814b51c81c" dependencies = [ - "byteorder 1.3.2 (registry+https://github.com/rust-lang/crates.io-index)", - "either 1.5.3 (registry+https://github.com/rust-lang/crates.io-index)", - "iovec 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)", + "byteorder", + "either", + "iovec", ] [[package]] name = "c2-chacha" version = "0.2.3" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "214238caa1bf3a496ec3392968969cab8549f96ff30652c9e56885329315f6bb" dependencies = [ - "ppv-lite86 0.2.6 (registry+https://github.com/rust-lang/crates.io-index)", + "ppv-lite86", ] [[package]] name = "cairo-rs" version = "0.7.1" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e05db47de3b0f09a222fa4bba2eab957d920d4243962a86b2d77ab401e4a359c" dependencies = [ - "bitflags 1.2.1 (registry+https://github.com/rust-lang/crates.io-index)", - "cairo-sys-rs 0.9.2 (registry+https://github.com/rust-lang/crates.io-index)", - "glib 0.8.2 (registry+https://github.com/rust-lang/crates.io-index)", - "glib-sys 0.9.1 (registry+https://github.com/rust-lang/crates.io-index)", - "gobject-sys 0.9.1 (registry+https://github.com/rust-lang/crates.io-index)", - "libc 0.2.66 (registry+https://github.com/rust-lang/crates.io-index)", + "bitflags", + "cairo-sys-rs", + "glib", + "glib-sys", + "gobject-sys", + "libc", ] [[package]] name = "cairo-sys-rs" version = "0.9.2" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ff65ba02cac715be836f63429ab00a767d48336efc5497c5637afb53b4f14d63" dependencies = [ - "glib-sys 0.9.1 (registry+https://github.com/rust-lang/crates.io-index)", - "libc 0.2.66 (registry+https://github.com/rust-lang/crates.io-index)", - "pkg-config 0.3.17 (registry+https://github.com/rust-lang/crates.io-index)", + "glib-sys", + "libc", + "pkg-config", ] [[package]] name = "cc" version = "1.0.50" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "95e28fa049fda1c330bcf9d723be7663a899c4679724b34c81e9f5a326aab8cd" [[package]] name = "cfg-if" version = "0.1.10" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4785bdd1c96b2a846b2bd7cc02e86b6b3dbf14e7e53446c4f54c92a361040822" [[package]] name = "clap" version = "2.33.0" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5067f5bb2d80ef5d68b4c87db81601f0b75bca627bc2ef76b141d7b846a3c6d9" dependencies = [ - "ansi_term 0.11.0 (registry+https://github.com/rust-lang/crates.io-index)", - "atty 0.2.14 (registry+https://github.com/rust-lang/crates.io-index)", - "bitflags 1.2.1 (registry+https://github.com/rust-lang/crates.io-index)", - "strsim 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)", - "textwrap 0.11.0 (registry+https://github.com/rust-lang/crates.io-index)", - "unicode-width 0.1.7 (registry+https://github.com/rust-lang/crates.io-index)", - "vec_map 0.8.1 (registry+https://github.com/rust-lang/crates.io-index)", + "ansi_term", + "atty", + "bitflags", + "strsim", + "textwrap", + "unicode-width", + "vec_map", ] [[package]] name = "cloudabi" version = "0.0.3" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ddfc5b9aa5d4507acaf872de71051dfd0e309860e88966e1051e462a077aac4f" dependencies = [ - "bitflags 1.2.1 (registry+https://github.com/rust-lang/crates.io-index)", + "bitflags", ] [[package]] @@ -215,8 +242,8 @@ name = "codespan" version = "0.2.1" source = "git+https://github.com/oberien/codespan?rev=dc7b13739165fc58721415ce3120d05cf117ca81#dc7b13739165fc58721415ce3120d05cf117ca81" dependencies = [ - "failure 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)", - "itertools 0.8.2 (registry+https://github.com/rust-lang/crates.io-index)", + "failure", + "itertools 0.8.2", ] [[package]] @@ -224,1653 +251,1831 @@ name = "codespan-reporting" version = "0.2.1" source = "git+https://github.com/oberien/codespan?rev=dc7b13739165fc58721415ce3120d05cf117ca81#dc7b13739165fc58721415ce3120d05cf117ca81" dependencies = [ - "codespan 0.2.1 (git+https://github.com/oberien/codespan?rev=dc7b13739165fc58721415ce3120d05cf117ca81)", - "termcolor 1.1.0 (registry+https://github.com/rust-lang/crates.io-index)", + "codespan", + "termcolor", ] [[package]] name = "cookie" version = "0.12.0" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "888604f00b3db336d2af898ec3c1d5d0ddf5e6d462220f2ededc33a87ac4bbd5" dependencies = [ - "time 0.1.42 (registry+https://github.com/rust-lang/crates.io-index)", - "url 1.7.2 (registry+https://github.com/rust-lang/crates.io-index)", + "time", + "url 1.7.2", ] [[package]] name = "cookie_store" version = "0.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "46750b3f362965f197996c4448e4a0935e791bf7d6631bfce9ee0af3d24c919c" dependencies = [ - "cookie 0.12.0 (registry+https://github.com/rust-lang/crates.io-index)", - "failure 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)", - "idna 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)", - "log 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)", - "publicsuffix 1.5.4 (registry+https://github.com/rust-lang/crates.io-index)", - "serde 1.0.104 (registry+https://github.com/rust-lang/crates.io-index)", - "serde_json 1.0.45 (registry+https://github.com/rust-lang/crates.io-index)", - "time 0.1.42 (registry+https://github.com/rust-lang/crates.io-index)", - "try_from 0.3.2 (registry+https://github.com/rust-lang/crates.io-index)", - "url 1.7.2 (registry+https://github.com/rust-lang/crates.io-index)", + "cookie", + "failure", + "idna 0.1.5", + "log", + "publicsuffix", + "serde", + "serde_json", + "time", + "try_from", + "url 1.7.2", ] [[package]] name = "core-foundation" version = "0.6.4" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "25b9e03f145fd4f2bf705e07b900cd41fc636598fe5dc452fd0db1441c3f496d" dependencies = [ - "core-foundation-sys 0.6.2 (registry+https://github.com/rust-lang/crates.io-index)", - "libc 0.2.66 (registry+https://github.com/rust-lang/crates.io-index)", + "core-foundation-sys", + "libc", ] [[package]] name = "core-foundation-sys" version = "0.6.2" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e7ca8a5221364ef15ce201e8ed2f609fc312682a8f4e0e3d4aa5879764e0fa3b" [[package]] name = "crc32fast" version = "1.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ba125de2af0df55319f41944744ad91c71113bf74a4646efff39afe1f6842db1" dependencies = [ - "cfg-if 0.1.10 (registry+https://github.com/rust-lang/crates.io-index)", + "cfg-if", ] [[package]] name = "crossbeam-deque" version = "0.7.2" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c3aa945d63861bfe624b55d153a39684da1e8c0bc8fba932f7ee3a3c16cea3ca" dependencies = [ - "crossbeam-epoch 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)", - "crossbeam-utils 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)", + "crossbeam-epoch", + "crossbeam-utils 0.7.0", ] [[package]] name = "crossbeam-epoch" version = "0.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5064ebdbf05ce3cb95e45c8b086f72263f4166b29b97f6baff7ef7fe047b55ac" dependencies = [ - "autocfg 0.1.7 (registry+https://github.com/rust-lang/crates.io-index)", - "cfg-if 0.1.10 (registry+https://github.com/rust-lang/crates.io-index)", - "crossbeam-utils 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)", - "lazy_static 1.4.0 (registry+https://github.com/rust-lang/crates.io-index)", - "memoffset 0.5.3 (registry+https://github.com/rust-lang/crates.io-index)", - "scopeguard 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)", + "autocfg 0.1.7", + "cfg-if", + "crossbeam-utils 0.7.0", + "lazy_static", + "memoffset", + "scopeguard", ] [[package]] name = "crossbeam-queue" version = "0.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7c979cd6cfe72335896575c6b5688da489e420d36a27a0b9eb0c73db574b4a4b" dependencies = [ - "crossbeam-utils 0.6.6 (registry+https://github.com/rust-lang/crates.io-index)", + "crossbeam-utils 0.6.6", ] [[package]] name = "crossbeam-queue" version = "0.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c695eeca1e7173472a32221542ae469b3e9aac3a4fc81f7696bcad82029493db" dependencies = [ - "cfg-if 0.1.10 (registry+https://github.com/rust-lang/crates.io-index)", - "crossbeam-utils 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)", + "cfg-if", + "crossbeam-utils 0.7.0", ] [[package]] name = "crossbeam-utils" version = "0.6.6" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "04973fa96e96579258a5091af6003abde64af786b860f18622b82e026cca60e6" dependencies = [ - "cfg-if 0.1.10 (registry+https://github.com/rust-lang/crates.io-index)", - "lazy_static 1.4.0 (registry+https://github.com/rust-lang/crates.io-index)", + "cfg-if", + "lazy_static", ] [[package]] name = "crossbeam-utils" version = "0.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ce446db02cdc3165b94ae73111e570793400d0794e46125cc4056c81cbb039f4" dependencies = [ - "autocfg 0.1.7 (registry+https://github.com/rust-lang/crates.io-index)", - "cfg-if 0.1.10 (registry+https://github.com/rust-lang/crates.io-index)", - "lazy_static 1.4.0 (registry+https://github.com/rust-lang/crates.io-index)", + "autocfg 0.1.7", + "cfg-if", + "lazy_static", ] [[package]] name = "cssparser" version = "0.27.2" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "754b69d351cdc2d8ee09ae203db831e005560fc6030da058f86ad60c92a9cb0a" dependencies = [ - "cssparser-macros 0.6.0 (registry+https://github.com/rust-lang/crates.io-index)", - "dtoa-short 0.3.2 (registry+https://github.com/rust-lang/crates.io-index)", - "itoa 0.4.5 (registry+https://github.com/rust-lang/crates.io-index)", - "matches 0.1.8 (registry+https://github.com/rust-lang/crates.io-index)", - "phf 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)", - "proc-macro2 1.0.8 (registry+https://github.com/rust-lang/crates.io-index)", - "quote 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)", - "smallvec 1.1.0 (registry+https://github.com/rust-lang/crates.io-index)", - "syn 1.0.14 (registry+https://github.com/rust-lang/crates.io-index)", + "cssparser-macros", + "dtoa-short", + "itoa", + "matches", + "phf 0.8.0", + "proc-macro2 1.0.8", + "quote 1.0.2", + "smallvec 1.1.0", + "syn 1.0.14", ] [[package]] name = "cssparser-macros" version = "0.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dfae75de57f2b2e85e8768c3ea840fd159c8f33e2b6522c7835b7abac81be16e" dependencies = [ - "quote 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)", - "syn 1.0.14 (registry+https://github.com/rust-lang/crates.io-index)", + "quote 1.0.2", + "syn 1.0.14", ] [[package]] name = "data-url" version = "0.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d33fe99ccedd6e84bc035f1931bb2e6be79739d6242bd895e7311c886c50dc9c" dependencies = [ - "matches 0.1.8 (registry+https://github.com/rust-lang/crates.io-index)", + "matches", ] [[package]] name = "derive_more" version = "0.99.9" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "298998b1cf6b5b2c8a7b023dfd45821825ce3ba8a8af55c921a0e734e4653f76" dependencies = [ - "proc-macro2 1.0.8 (registry+https://github.com/rust-lang/crates.io-index)", - "quote 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)", - "syn 1.0.14 (registry+https://github.com/rust-lang/crates.io-index)", + "proc-macro2 1.0.8", + "quote 1.0.2", + "syn 1.0.14", ] [[package]] name = "digest" version = "0.8.1" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f3d0c8c8752312f9713efd397ff63acb9f85585afbf179282e720e7704954dd5" dependencies = [ - "generic-array 0.12.3 (registry+https://github.com/rust-lang/crates.io-index)", + "generic-array", ] [[package]] name = "downcast-rs" version = "1.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "52ba6eb47c2131e784a38b726eb54c1e1484904f013e576a25354d0124161af6" [[package]] name = "dtoa" version = "0.4.4" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ea57b42383d091c85abcc2706240b94ab2a8fa1fc81c10ff23c4de06e2a90b5e" [[package]] name = "dtoa-short" version = "0.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "59020b8513b76630c49d918c33db9f4c91638e7d3404a28084083b87e33f76f2" dependencies = [ - "dtoa 0.4.4 (registry+https://github.com/rust-lang/crates.io-index)", + "dtoa", ] [[package]] name = "either" version = "1.5.3" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bb1f6b1ce1c140482ea30ddd3335fc0024ac7ee112895426e0a629a6c20adfe3" [[package]] name = "encoding" version = "0.2.33" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6b0d943856b990d12d3b55b359144ff341533e516d94098b1d3fc1ac666d36ec" dependencies = [ - "encoding-index-japanese 1.20141219.5 (registry+https://github.com/rust-lang/crates.io-index)", - "encoding-index-korean 1.20141219.5 (registry+https://github.com/rust-lang/crates.io-index)", - "encoding-index-simpchinese 1.20141219.5 (registry+https://github.com/rust-lang/crates.io-index)", - "encoding-index-singlebyte 1.20141219.5 (registry+https://github.com/rust-lang/crates.io-index)", - "encoding-index-tradchinese 1.20141219.5 (registry+https://github.com/rust-lang/crates.io-index)", + "encoding-index-japanese", + "encoding-index-korean", + "encoding-index-simpchinese", + "encoding-index-singlebyte", + "encoding-index-tradchinese", ] [[package]] name = "encoding-index-japanese" version = "1.20141219.5" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "04e8b2ff42e9a05335dbf8b5c6f7567e5591d0d916ccef4e0b1710d32a0d0c91" dependencies = [ - "encoding_index_tests 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)", + "encoding_index_tests", ] [[package]] name = "encoding-index-korean" version = "1.20141219.5" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4dc33fb8e6bcba213fe2f14275f0963fd16f0a02c878e3095ecfdf5bee529d81" dependencies = [ - "encoding_index_tests 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)", + "encoding_index_tests", ] [[package]] name = "encoding-index-simpchinese" version = "1.20141219.5" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d87a7194909b9118fc707194baa434a4e3b0fb6a5a757c73c3adb07aa25031f7" dependencies = [ - "encoding_index_tests 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)", + "encoding_index_tests", ] [[package]] name = "encoding-index-singlebyte" version = "1.20141219.5" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3351d5acffb224af9ca265f435b859c7c01537c0849754d3db3fdf2bfe2ae84a" dependencies = [ - "encoding_index_tests 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)", + "encoding_index_tests", ] [[package]] name = "encoding-index-tradchinese" version = "1.20141219.5" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fd0e20d5688ce3cab59eb3ef3a2083a5c77bf496cb798dc6fcdb75f323890c18" dependencies = [ - "encoding_index_tests 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)", + "encoding_index_tests", ] [[package]] name = "encoding_index_tests" version = "0.1.4" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a246d82be1c9d791c5dfde9a2bd045fc3cbba3fa2b11ad558f27d01712f00569" [[package]] name = "encoding_rs" version = "0.8.22" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cd8d03faa7fe0c1431609dfad7bbe827af30f82e1e2ae6f7ee4fca6bd764bc28" dependencies = [ - "cfg-if 0.1.10 (registry+https://github.com/rust-lang/crates.io-index)", + "cfg-if", ] [[package]] name = "enum-kinds" version = "0.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d0f21c374dea848c19071b1504ca5ad03c9ad0d03d2e509e68f6623b8fcac4b5" dependencies = [ - "quote 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)", - "syn 0.12.15 (registry+https://github.com/rust-lang/crates.io-index)", + "quote 0.4.2", + "syn 0.12.15", ] [[package]] name = "env_logger" version = "0.5.13" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "15b0a4d2e39f8420210be8b27eeda28029729e2fd4291019455016c348240c38" dependencies = [ - "atty 0.2.14 (registry+https://github.com/rust-lang/crates.io-index)", - "humantime 1.3.0 (registry+https://github.com/rust-lang/crates.io-index)", - "log 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)", - "regex 1.3.3 (registry+https://github.com/rust-lang/crates.io-index)", - "termcolor 1.1.0 (registry+https://github.com/rust-lang/crates.io-index)", + "atty", + "humantime", + "log", + "regex", + "termcolor", ] [[package]] name = "error-chain" version = "0.12.1" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3ab49e9dcb602294bc42f9a7dfc9bc6e936fca4418ea300dbfb84fe16de0b7d9" dependencies = [ - "version_check 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)", + "version_check 0.1.5", ] [[package]] name = "failure" version = "0.1.6" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f8273f13c977665c5db7eb2b99ae520952fe5ac831ae4cd09d80c4c7042b5ed9" dependencies = [ - "backtrace 0.3.42 (registry+https://github.com/rust-lang/crates.io-index)", - "failure_derive 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)", + "backtrace", + "failure_derive", ] [[package]] name = "failure_derive" version = "0.1.6" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0bc225b78e0391e4b8683440bf2e63c2deeeb2ce5189eab46e2b68c6d3725d08" dependencies = [ - "proc-macro2 1.0.8 (registry+https://github.com/rust-lang/crates.io-index)", - "quote 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)", - "syn 1.0.14 (registry+https://github.com/rust-lang/crates.io-index)", - "synstructure 0.12.3 (registry+https://github.com/rust-lang/crates.io-index)", + "proc-macro2 1.0.8", + "quote 1.0.2", + "syn 1.0.14", + "synstructure", ] [[package]] name = "fake-simd" version = "0.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e88a8acf291dafb59c2d96e8f59828f3838bb1a70398823ade51a84de6a6deed" [[package]] name = "fixedbitset" version = "0.1.9" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "86d4de0081402f5e88cdac65c8dcdcc73118c1a7a465e2a05f0da05843a8ea33" [[package]] name = "flate2" version = "1.0.13" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6bd6d6f4752952feb71363cffc9ebac9411b75b87c6ab6058c40c8900cf43c0f" dependencies = [ - "cfg-if 0.1.10 (registry+https://github.com/rust-lang/crates.io-index)", - "crc32fast 1.2.0 (registry+https://github.com/rust-lang/crates.io-index)", - "libc 0.2.66 (registry+https://github.com/rust-lang/crates.io-index)", - "miniz_oxide 0.3.5 (registry+https://github.com/rust-lang/crates.io-index)", + "cfg-if", + "crc32fast", + "libc", + "miniz_oxide", ] [[package]] name = "float-cmp" version = "0.5.3" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "75224bec9bfe1a65e2d34132933f2de7fe79900c96a0174307554244ece8150e" dependencies = [ - "num-traits 0.2.11 (registry+https://github.com/rust-lang/crates.io-index)", + "num-traits", ] [[package]] name = "fnv" version = "1.0.6" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2fad85553e09a6f881f739c29f0b00b0f01357c743266d478b68951ce23285f3" [[package]] name = "foreign-types" version = "0.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f6f339eb8adc052cd2ca78910fda869aefa38d22d5cb648e6485e4d3fc06f3b1" dependencies = [ - "foreign-types-shared 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", + "foreign-types-shared", ] [[package]] name = "foreign-types-shared" version = "0.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "00b0228411908ca8685dba7fc2cdd70ec9990a6e753e89b6ac91a84c40fbaf4b" [[package]] name = "fragile" version = "0.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "05f8140122fa0d5dcb9fc8627cfce2b37cc1500f752636d46ea28bc26785c2f9" [[package]] name = "fuchsia-cprng" version = "0.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a06f77d526c1a601b7c4cdd98f54b5eaabffc14d5f2f0296febdc7f357c6d3ba" [[package]] name = "fuchsia-zircon" version = "0.3.3" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2e9763c69ebaae630ba35f74888db465e49e259ba1bc0eda7d06f4a067615d82" dependencies = [ - "bitflags 1.2.1 (registry+https://github.com/rust-lang/crates.io-index)", - "fuchsia-zircon-sys 0.3.3 (registry+https://github.com/rust-lang/crates.io-index)", + "bitflags", + "fuchsia-zircon-sys", ] [[package]] name = "fuchsia-zircon-sys" version = "0.3.3" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3dcaa9ae7725d12cdb85b3ad99a434db70b468c09ded17e012d86b5c1010f7a7" [[package]] name = "futf" version = "0.1.4" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7c9c1ce3fa9336301af935ab852c437817d14cd33690446569392e65170aac3b" dependencies = [ - "mac 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", - "new_debug_unreachable 1.0.4 (registry+https://github.com/rust-lang/crates.io-index)", + "mac", + "new_debug_unreachable", ] [[package]] name = "futures" version = "0.1.29" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1b980f2816d6ee8673b6517b52cb0e808a180efc92e5c19d02cdda79066703ef" [[package]] name = "futures-cpupool" version = "0.1.8" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ab90cde24b3319636588d0c35fe03b1333857621051837ed769faefb4c2162e4" dependencies = [ - "futures 0.1.29 (registry+https://github.com/rust-lang/crates.io-index)", - "num_cpus 1.12.0 (registry+https://github.com/rust-lang/crates.io-index)", + "futures", + "num_cpus", ] [[package]] name = "fxhash" version = "0.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c31b6d751ae2c7f11320402d34e41349dd1016f8d5d45e48c4312bc8625af50c" dependencies = [ - "byteorder 1.3.2 (registry+https://github.com/rust-lang/crates.io-index)", + "byteorder", ] [[package]] name = "gdk-pixbuf" version = "0.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9726408ee1bbada83094326a99b9c68fea275f9dbb515de242a69e72051f4fcc" dependencies = [ - "gdk-pixbuf-sys 0.9.1 (registry+https://github.com/rust-lang/crates.io-index)", - "gio 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)", - "gio-sys 0.9.1 (registry+https://github.com/rust-lang/crates.io-index)", - "glib 0.8.2 (registry+https://github.com/rust-lang/crates.io-index)", - "glib-sys 0.9.1 (registry+https://github.com/rust-lang/crates.io-index)", - "gobject-sys 0.9.1 (registry+https://github.com/rust-lang/crates.io-index)", - "libc 0.2.66 (registry+https://github.com/rust-lang/crates.io-index)", + "gdk-pixbuf-sys", + "gio", + "gio-sys", + "glib", + "glib-sys", + "gobject-sys", + "libc", ] [[package]] name = "gdk-pixbuf-sys" version = "0.9.1" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d8991b060a9e9161bafd09bf4a202e6fd404f5b4dd1a08d53a1e84256fb34ab0" dependencies = [ - "gio-sys 0.9.1 (registry+https://github.com/rust-lang/crates.io-index)", - "glib-sys 0.9.1 (registry+https://github.com/rust-lang/crates.io-index)", - "gobject-sys 0.9.1 (registry+https://github.com/rust-lang/crates.io-index)", - "libc 0.2.66 (registry+https://github.com/rust-lang/crates.io-index)", - "pkg-config 0.3.17 (registry+https://github.com/rust-lang/crates.io-index)", + "gio-sys", + "glib-sys", + "gobject-sys", + "libc", + "pkg-config", ] [[package]] name = "generic-array" version = "0.12.3" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c68f0274ae0e023facc3c97b2e00f076be70e254bc851d972503b328db79b2ec" dependencies = [ - "typenum 1.11.2 (registry+https://github.com/rust-lang/crates.io-index)", + "typenum", ] [[package]] name = "getopts" version = "0.2.21" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "14dbbfd5c71d70241ecf9e6f13737f7b5ce823821063188d7e46c41d371eebd5" dependencies = [ - "unicode-width 0.1.7 (registry+https://github.com/rust-lang/crates.io-index)", + "unicode-width", ] [[package]] name = "getrandom" version = "0.1.14" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7abc8dd8451921606d809ba32e95b6111925cd2906060d2dcc29c070220503eb" dependencies = [ - "cfg-if 0.1.10 (registry+https://github.com/rust-lang/crates.io-index)", - "libc 0.2.66 (registry+https://github.com/rust-lang/crates.io-index)", - "wasi 0.9.0+wasi-snapshot-preview1 (registry+https://github.com/rust-lang/crates.io-index)", + "cfg-if", + "libc", + "wasi", ] [[package]] name = "gio" version = "0.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6261b5d34c30c2d59f879e643704cf54cb44731f3a2038000b68790c03e360e3" dependencies = [ - "bitflags 1.2.1 (registry+https://github.com/rust-lang/crates.io-index)", - "fragile 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)", - "gio-sys 0.9.1 (registry+https://github.com/rust-lang/crates.io-index)", - "glib 0.8.2 (registry+https://github.com/rust-lang/crates.io-index)", - "glib-sys 0.9.1 (registry+https://github.com/rust-lang/crates.io-index)", - "gobject-sys 0.9.1 (registry+https://github.com/rust-lang/crates.io-index)", - "lazy_static 1.4.0 (registry+https://github.com/rust-lang/crates.io-index)", - "libc 0.2.66 (registry+https://github.com/rust-lang/crates.io-index)", + "bitflags", + "fragile", + "gio-sys", + "glib", + "glib-sys", + "gobject-sys", + "lazy_static", + "libc", ] [[package]] name = "gio-sys" version = "0.9.1" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4fad225242b9eae7ec8a063bb86974aca56885014672375e5775dc0ea3533911" dependencies = [ - "glib-sys 0.9.1 (registry+https://github.com/rust-lang/crates.io-index)", - "gobject-sys 0.9.1 (registry+https://github.com/rust-lang/crates.io-index)", - "libc 0.2.66 (registry+https://github.com/rust-lang/crates.io-index)", - "pkg-config 0.3.17 (registry+https://github.com/rust-lang/crates.io-index)", + "glib-sys", + "gobject-sys", + "libc", + "pkg-config", ] [[package]] name = "glib" version = "0.8.2" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "be27232841baa43e0fd5ae003f7941925735b2f733a336dc75f07b9eff415e7b" dependencies = [ - "bitflags 1.2.1 (registry+https://github.com/rust-lang/crates.io-index)", - "glib-sys 0.9.1 (registry+https://github.com/rust-lang/crates.io-index)", - "gobject-sys 0.9.1 (registry+https://github.com/rust-lang/crates.io-index)", - "lazy_static 1.4.0 (registry+https://github.com/rust-lang/crates.io-index)", - "libc 0.2.66 (registry+https://github.com/rust-lang/crates.io-index)", + "bitflags", + "glib-sys", + "gobject-sys", + "lazy_static", + "libc", ] [[package]] name = "glib-sys" version = "0.9.1" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "95856f3802f446c05feffa5e24859fe6a183a7cb849c8449afc35c86b1e316e2" dependencies = [ - "libc 0.2.66 (registry+https://github.com/rust-lang/crates.io-index)", - "pkg-config 0.3.17 (registry+https://github.com/rust-lang/crates.io-index)", + "libc", + "pkg-config", ] [[package]] name = "gobject-sys" version = "0.9.1" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "31d1a804f62034eccf370006ccaef3708a71c31d561fee88564abe71177553d9" dependencies = [ - "glib-sys 0.9.1 (registry+https://github.com/rust-lang/crates.io-index)", - "libc 0.2.66 (registry+https://github.com/rust-lang/crates.io-index)", - "pkg-config 0.3.17 (registry+https://github.com/rust-lang/crates.io-index)", + "glib-sys", + "libc", + "pkg-config", ] [[package]] name = "h2" version = "0.1.26" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a5b34c246847f938a410a03c5458c7fee2274436675e76d8b903c08efc29c462" dependencies = [ - "byteorder 1.3.2 (registry+https://github.com/rust-lang/crates.io-index)", - "bytes 0.4.12 (registry+https://github.com/rust-lang/crates.io-index)", - "fnv 1.0.6 (registry+https://github.com/rust-lang/crates.io-index)", - "futures 0.1.29 (registry+https://github.com/rust-lang/crates.io-index)", - "http 0.1.21 (registry+https://github.com/rust-lang/crates.io-index)", - "indexmap 1.3.1 (registry+https://github.com/rust-lang/crates.io-index)", - "log 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)", - "slab 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)", - "string 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)", - "tokio-io 0.1.12 (registry+https://github.com/rust-lang/crates.io-index)", + "byteorder", + "bytes", + "fnv", + "futures", + "http", + "indexmap", + "log", + "slab", + "string", + "tokio-io", ] [[package]] name = "heck" version = "0.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "20564e78d53d2bb135c343b3f47714a56af2061f1c928fdb541dc7b9fdd94205" dependencies = [ - "unicode-segmentation 1.6.0 (registry+https://github.com/rust-lang/crates.io-index)", + "unicode-segmentation", ] [[package]] name = "heradoc" version = "0.1.0" dependencies = [ - "backtrace 0.3.42 (registry+https://github.com/rust-lang/crates.io-index)", - "boolinator 2.4.0 (registry+https://github.com/rust-lang/crates.io-index)", - "cairo-rs 0.7.1 (registry+https://github.com/rust-lang/crates.io-index)", - "codespan 0.2.1 (git+https://github.com/oberien/codespan?rev=dc7b13739165fc58721415ce3120d05cf117ca81)", - "codespan-reporting 0.2.1 (git+https://github.com/oberien/codespan?rev=dc7b13739165fc58721415ce3120d05cf117ca81)", - "enum-kinds 0.4.1 (registry+https://github.com/rust-lang/crates.io-index)", - "env_logger 0.5.13 (registry+https://github.com/rust-lang/crates.io-index)", - "isolang 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)", - "itertools 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)", - "lazy_static 1.4.0 (registry+https://github.com/rust-lang/crates.io-index)", - "lexical 5.0.0 (registry+https://github.com/rust-lang/crates.io-index)", - "librsvg 2.47.2 (git+https://gitlab.gnome.org/GNOME/librsvg?rev=6ecab568)", - "log 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)", - "mime 0.3.16 (registry+https://github.com/rust-lang/crates.io-index)", - "pulldown-cmark 0.4.1 (registry+https://github.com/rust-lang/crates.io-index)", - "quoted-string 0.6.1 (registry+https://github.com/rust-lang/crates.io-index)", - "regex 1.3.3 (registry+https://github.com/rust-lang/crates.io-index)", - "reqwest 0.9.24 (registry+https://github.com/rust-lang/crates.io-index)", - "serde 1.0.104 (registry+https://github.com/rust-lang/crates.io-index)", - "sha2 0.8.1 (registry+https://github.com/rust-lang/crates.io-index)", - "single 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)", - "str-concat 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)", - "structopt 0.2.18 (registry+https://github.com/rust-lang/crates.io-index)", - "strum 0.11.0 (registry+https://github.com/rust-lang/crates.io-index)", - "strum_macros 0.11.0 (registry+https://github.com/rust-lang/crates.io-index)", - "svgbob 0.5.0-alpha.5 (registry+https://github.com/rust-lang/crates.io-index)", - "tempdir 0.3.7 (registry+https://github.com/rust-lang/crates.io-index)", - "toml 0.5.6 (registry+https://github.com/rust-lang/crates.io-index)", - "typed-arena 1.7.0 (registry+https://github.com/rust-lang/crates.io-index)", - "url 1.7.2 (registry+https://github.com/rust-lang/crates.io-index)", - "void 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)", + "backtrace", + "boolinator", + "cairo-rs", + "codespan", + "codespan-reporting", + "enum-kinds", + "env_logger", + "isolang", + "itertools 0.9.0", + "lazy_static", + "lexical", + "librsvg", + "log", + "mime", + "pulldown-cmark", + "quoted-string", + "regex", + "reqwest", + "serde", + "serde_json", + "sha2", + "single", + "str-concat", + "structopt", + "strum", + "strum_macros", + "svgbob", + "tempdir", + "toml", + "typed-arena", + "url 1.7.2", + "void", ] [[package]] name = "hermit-abi" version = "0.1.6" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "eff2656d88f158ce120947499e971d743c05dbcbed62e5bd2f38f1698bbc3772" dependencies = [ - "libc 0.2.66 (registry+https://github.com/rust-lang/crates.io-index)", + "libc", ] [[package]] name = "http" version = "0.1.21" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d6ccf5ede3a895d8856620237b2f02972c1bbc78d2965ad7fe8838d4a0ed41f0" dependencies = [ - "bytes 0.4.12 (registry+https://github.com/rust-lang/crates.io-index)", - "fnv 1.0.6 (registry+https://github.com/rust-lang/crates.io-index)", - "itoa 0.4.5 (registry+https://github.com/rust-lang/crates.io-index)", + "bytes", + "fnv", + "itoa", ] [[package]] name = "http-body" version = "0.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6741c859c1b2463a423a1dbce98d418e6c3c3fc720fb0d45528657320920292d" dependencies = [ - "bytes 0.4.12 (registry+https://github.com/rust-lang/crates.io-index)", - "futures 0.1.29 (registry+https://github.com/rust-lang/crates.io-index)", - "http 0.1.21 (registry+https://github.com/rust-lang/crates.io-index)", - "tokio-buf 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", + "bytes", + "futures", + "http", + "tokio-buf", ] [[package]] name = "httparse" version = "1.3.4" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cd179ae861f0c2e53da70d892f5f3029f9594be0c41dc5269cd371691b1dc2f9" [[package]] name = "humantime" version = "1.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "df004cfca50ef23c36850aaaa59ad52cc70d0e90243c3c7737a4dd32dc7a3c4f" dependencies = [ - "quick-error 1.2.3 (registry+https://github.com/rust-lang/crates.io-index)", + "quick-error", ] [[package]] name = "hyper" version = "0.12.35" source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "bytes 0.4.12 (registry+https://github.com/rust-lang/crates.io-index)", - "futures 0.1.29 (registry+https://github.com/rust-lang/crates.io-index)", - "futures-cpupool 0.1.8 (registry+https://github.com/rust-lang/crates.io-index)", - "h2 0.1.26 (registry+https://github.com/rust-lang/crates.io-index)", - "http 0.1.21 (registry+https://github.com/rust-lang/crates.io-index)", - "http-body 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)", - "httparse 1.3.4 (registry+https://github.com/rust-lang/crates.io-index)", - "iovec 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)", - "itoa 0.4.5 (registry+https://github.com/rust-lang/crates.io-index)", - "log 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)", - "net2 0.2.33 (registry+https://github.com/rust-lang/crates.io-index)", - "rustc_version 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)", - "time 0.1.42 (registry+https://github.com/rust-lang/crates.io-index)", - "tokio 0.1.22 (registry+https://github.com/rust-lang/crates.io-index)", - "tokio-buf 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", - "tokio-executor 0.1.9 (registry+https://github.com/rust-lang/crates.io-index)", - "tokio-io 0.1.12 (registry+https://github.com/rust-lang/crates.io-index)", - "tokio-reactor 0.1.11 (registry+https://github.com/rust-lang/crates.io-index)", - "tokio-tcp 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)", - "tokio-threadpool 0.1.17 (registry+https://github.com/rust-lang/crates.io-index)", - "tokio-timer 0.2.12 (registry+https://github.com/rust-lang/crates.io-index)", - "want 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)", +checksum = "9dbe6ed1438e1f8ad955a4701e9a944938e9519f6888d12d8558b645e247d5f6" +dependencies = [ + "bytes", + "futures", + "futures-cpupool", + "h2", + "http", + "http-body", + "httparse", + "iovec", + "itoa", + "log", + "net2", + "rustc_version", + "time", + "tokio", + "tokio-buf", + "tokio-executor", + "tokio-io", + "tokio-reactor", + "tokio-tcp", + "tokio-threadpool", + "tokio-timer", + "want", ] [[package]] name = "hyper-tls" version = "0.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3a800d6aa50af4b5850b2b0f659625ce9504df908e9733b635720483be26174f" dependencies = [ - "bytes 0.4.12 (registry+https://github.com/rust-lang/crates.io-index)", - "futures 0.1.29 (registry+https://github.com/rust-lang/crates.io-index)", - "hyper 0.12.35 (registry+https://github.com/rust-lang/crates.io-index)", - "native-tls 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)", - "tokio-io 0.1.12 (registry+https://github.com/rust-lang/crates.io-index)", + "bytes", + "futures", + "hyper", + "native-tls", + "tokio-io", ] [[package]] name = "idna" version = "0.1.5" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "38f09e0f0b1fb55fdee1f17470ad800da77af5186a1a76c026b679358b7e844e" dependencies = [ - "matches 0.1.8 (registry+https://github.com/rust-lang/crates.io-index)", - "unicode-bidi 0.3.4 (registry+https://github.com/rust-lang/crates.io-index)", - "unicode-normalization 0.1.12 (registry+https://github.com/rust-lang/crates.io-index)", + "matches", + "unicode-bidi", + "unicode-normalization", ] [[package]] name = "idna" version = "0.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "02e2673c30ee86b5b96a9cb52ad15718aa1f966f5ab9ad54a8b95d5ca33120a9" dependencies = [ - "matches 0.1.8 (registry+https://github.com/rust-lang/crates.io-index)", - "unicode-bidi 0.3.4 (registry+https://github.com/rust-lang/crates.io-index)", - "unicode-normalization 0.1.12 (registry+https://github.com/rust-lang/crates.io-index)", + "matches", + "unicode-bidi", + "unicode-normalization", ] [[package]] name = "indexmap" version = "1.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0b54058f0a6ff80b6803da8faf8997cde53872b38f4023728f6830b06cd3c0dc" dependencies = [ - "autocfg 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)", + "autocfg 1.0.0", ] [[package]] name = "iovec" version = "0.1.4" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b2b3ea6ff95e175473f8ffe6a7eb7c00d054240321b84c57051175fe3c1e075e" dependencies = [ - "libc 0.2.66 (registry+https://github.com/rust-lang/crates.io-index)", + "libc", ] [[package]] name = "isolang" version = "0.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9e5855a5a1ba5957e064977b94e5cd15ecbe83904a5191576be11615186cd868" dependencies = [ - "phf 0.7.24 (registry+https://github.com/rust-lang/crates.io-index)", - "phf_codegen 0.7.24 (registry+https://github.com/rust-lang/crates.io-index)", + "phf 0.7.24", + "phf_codegen 0.7.24", ] [[package]] name = "itertools" version = "0.8.2" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f56a2d0bc861f9165be4eb3442afd3c236d8a98afd426f65d92324ae1091a484" dependencies = [ - "either 1.5.3 (registry+https://github.com/rust-lang/crates.io-index)", + "either", ] [[package]] name = "itertools" version = "0.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "284f18f85651fe11e8a991b2adb42cb078325c996ed026d994719efcfca1d54b" dependencies = [ - "either 1.5.3 (registry+https://github.com/rust-lang/crates.io-index)", + "either", ] [[package]] name = "itoa" version = "0.4.5" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b8b7a7c0c47db5545ed3fef7468ee7bb5b74691498139e4b3f6a20685dc6dd8e" [[package]] name = "kernel32-sys" version = "0.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7507624b29483431c0ba2d82aece8ca6cdba9382bff4ddd0f7490560c056098d" dependencies = [ - "winapi 0.2.8 (registry+https://github.com/rust-lang/crates.io-index)", - "winapi-build 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", + "winapi 0.2.8", + "winapi-build", ] [[package]] name = "language-tags" version = "0.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a91d884b6667cd606bb5a69aa0c99ba811a115fc68915e7056ec08a46e93199a" [[package]] name = "lazy_static" version = "1.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e2abad23fbc42b3700f2f279844dc832adb2b2eb069b2df918f455c4e18cc646" [[package]] name = "lexical" version = "5.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dd84e95495f8eddaaa1ad1542e9810a3f0139f18fb985c960e9c74dc5dcf4498" dependencies = [ - "cfg-if 0.1.10 (registry+https://github.com/rust-lang/crates.io-index)", - "lexical-core 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)", + "cfg-if", + "lexical-core", ] [[package]] name = "lexical-core" version = "0.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "41aae02f4cbf67c1f57e1a1fa5418db722b5c9fa4a2c47b44d53d6c31cbe040a" dependencies = [ - "arrayvec 0.5.1 (registry+https://github.com/rust-lang/crates.io-index)", - "cfg-if 0.1.10 (registry+https://github.com/rust-lang/crates.io-index)", - "ryu 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)", - "static_assertions 1.1.0 (registry+https://github.com/rust-lang/crates.io-index)", + "arrayvec", + "cfg-if", + "ryu", + "static_assertions", ] [[package]] name = "libc" version = "0.2.66" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d515b1f41455adea1313a4a2ac8a8a477634fbae63cc6100e3aebb207ce61558" [[package]] name = "libm" version = "0.1.4" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7fc7aa29613bd6a620df431842069224d8bc9011086b1db4c0e0cd47fa03ec9a" [[package]] name = "librsvg" version = "2.47.2" source = "git+https://gitlab.gnome.org/GNOME/librsvg?rev=6ecab568#6ecab568ae60699ab2e1be9269e920d7ce69bd1d" dependencies = [ - "cairo-rs 0.7.1 (registry+https://github.com/rust-lang/crates.io-index)", - "gio 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)", - "glib 0.8.2 (registry+https://github.com/rust-lang/crates.io-index)", - "rsvg_internals 0.0.1 (git+https://gitlab.gnome.org/GNOME/librsvg?rev=6ecab568)", - "url 2.1.1 (registry+https://github.com/rust-lang/crates.io-index)", + "cairo-rs", + "gio", + "glib", + "rsvg_internals", + "url 2.1.1", ] [[package]] name = "locale_config" version = "0.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "08d2c35b16f4483f6c26f0e4e9550717a2f6575bcd6f12a53ff0c490a94a6934" dependencies = [ - "lazy_static 1.4.0 (registry+https://github.com/rust-lang/crates.io-index)", - "objc 0.2.7 (registry+https://github.com/rust-lang/crates.io-index)", - "objc-foundation 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", - "regex 1.3.3 (registry+https://github.com/rust-lang/crates.io-index)", - "winapi 0.3.8 (registry+https://github.com/rust-lang/crates.io-index)", + "lazy_static", + "objc", + "objc-foundation", + "regex", + "winapi 0.3.8", ] [[package]] name = "lock_api" version = "0.3.3" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "79b2de95ecb4691949fea4716ca53cdbcfccb2c612e19644a8bad05edcf9f47b" dependencies = [ - "scopeguard 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)", + "scopeguard", ] [[package]] name = "log" version = "0.4.8" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "14b6052be84e6b71ab17edffc2eeabf5c2c3ae1fdb464aae35ac50c67a44e1f7" dependencies = [ - "cfg-if 0.1.10 (registry+https://github.com/rust-lang/crates.io-index)", + "cfg-if", ] [[package]] name = "mac" version = "0.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c41e0c4fef86961ac6d6f8a82609f55f31b05e4fce149ac5710e439df7619ba4" [[package]] name = "malloc_buf" version = "0.0.6" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "62bb907fe88d54d8d9ce32a3cceab4218ed2f6b7d35617cafe9adf84e43919cb" dependencies = [ - "libc 0.2.66 (registry+https://github.com/rust-lang/crates.io-index)", + "libc", ] [[package]] name = "markup5ever" version = "0.10.0" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "aae38d669396ca9b707bfc3db254bc382ddb94f57cc5c235f34623a669a01dab" dependencies = [ - "log 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)", - "phf 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)", - "phf_codegen 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)", - "serde 1.0.104 (registry+https://github.com/rust-lang/crates.io-index)", - "serde_derive 1.0.104 (registry+https://github.com/rust-lang/crates.io-index)", - "serde_json 1.0.45 (registry+https://github.com/rust-lang/crates.io-index)", - "string_cache 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)", - "string_cache_codegen 0.5.1 (registry+https://github.com/rust-lang/crates.io-index)", - "tendril 0.4.1 (registry+https://github.com/rust-lang/crates.io-index)", + "log", + "phf 0.8.0", + "phf_codegen 0.8.0", + "serde", + "serde_derive", + "serde_json", + "string_cache", + "string_cache_codegen", + "tendril", ] [[package]] name = "matches" version = "0.1.8" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7ffc5c5338469d4d3ea17d269fa8ea3512ad247247c30bd2df69e68309ed0a08" [[package]] name = "matrixmultiply" version = "0.2.3" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d4f7ec66360130972f34830bfad9ef05c6610a43938a467bcc9ab9369ab3478f" dependencies = [ - "rawpointer 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)", + "rawpointer", ] [[package]] name = "maybe-uninit" version = "2.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "60302e4db3a61da70c0cb7991976248362f30319e88850c487b9b95bbf059e00" [[package]] name = "memchr" version = "2.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3197e20c7edb283f87c071ddfc7a2cca8f8e0b888c242959846a6fce03c72223" [[package]] name = "memoffset" version = "0.5.3" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "75189eb85871ea5c2e2c15abbdd541185f63b408415e5051f5cac122d8c774b9" dependencies = [ - "rustc_version 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)", + "rustc_version", ] [[package]] name = "mime" version = "0.3.16" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2a60c7ce501c71e03a9c9c0d35b861413ae925bd979cc7a4e30d060069aaac8d" [[package]] name = "mime_guess" version = "2.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1a0ed03949aef72dbdf3116a383d7b38b4768e6f960528cd6a6044aa9ed68599" dependencies = [ - "mime 0.3.16 (registry+https://github.com/rust-lang/crates.io-index)", - "unicase 2.6.0 (registry+https://github.com/rust-lang/crates.io-index)", + "mime", + "unicase", ] [[package]] name = "miniz_oxide" version = "0.3.5" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6f3f74f726ae935c3f514300cc6773a0c9492abc5e972d42ba0c0ebb88757625" dependencies = [ - "adler32 1.0.4 (registry+https://github.com/rust-lang/crates.io-index)", + "adler32", ] [[package]] name = "mio" version = "0.6.21" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "302dec22bcf6bae6dfb69c647187f4b4d0fb6f535521f7bc022430ce8e12008f" dependencies = [ - "cfg-if 0.1.10 (registry+https://github.com/rust-lang/crates.io-index)", - "fuchsia-zircon 0.3.3 (registry+https://github.com/rust-lang/crates.io-index)", - "fuchsia-zircon-sys 0.3.3 (registry+https://github.com/rust-lang/crates.io-index)", - "iovec 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)", - "kernel32-sys 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)", - "libc 0.2.66 (registry+https://github.com/rust-lang/crates.io-index)", - "log 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)", - "miow 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)", - "net2 0.2.33 (registry+https://github.com/rust-lang/crates.io-index)", - "slab 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)", - "winapi 0.2.8 (registry+https://github.com/rust-lang/crates.io-index)", + "cfg-if", + "fuchsia-zircon", + "fuchsia-zircon-sys", + "iovec", + "kernel32-sys", + "libc", + "log", + "miow", + "net2", + "slab", + "winapi 0.2.8", ] [[package]] name = "miow" version = "0.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8c1f2f3b1cf331de6896aabf6e9d55dca90356cc9960cca7eaaf408a355ae919" dependencies = [ - "kernel32-sys 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)", - "net2 0.2.33 (registry+https://github.com/rust-lang/crates.io-index)", - "winapi 0.2.8 (registry+https://github.com/rust-lang/crates.io-index)", - "ws2_32-sys 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)", + "kernel32-sys", + "net2", + "winapi 0.2.8", + "ws2_32-sys", ] [[package]] name = "nalgebra" version = "0.18.1" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "aaa9fddbc34c8c35dd2108515587b8ce0cab396f17977b8c738568e4edb521a2" dependencies = [ - "alga 0.9.2 (registry+https://github.com/rust-lang/crates.io-index)", - "approx 0.3.2 (registry+https://github.com/rust-lang/crates.io-index)", - "generic-array 0.12.3 (registry+https://github.com/rust-lang/crates.io-index)", - "matrixmultiply 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)", - "num-complex 0.2.4 (registry+https://github.com/rust-lang/crates.io-index)", - "num-rational 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)", - "num-traits 0.2.11 (registry+https://github.com/rust-lang/crates.io-index)", - "rand 0.6.5 (registry+https://github.com/rust-lang/crates.io-index)", - "typenum 1.11.2 (registry+https://github.com/rust-lang/crates.io-index)", + "alga", + "approx", + "generic-array", + "matrixmultiply", + "num-complex", + "num-rational", + "num-traits", + "rand 0.6.5", + "typenum", ] [[package]] name = "native-tls" version = "0.2.3" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4b2df1a4c22fd44a62147fd8f13dd0f95c9d8ca7b2610299b2a2f9cf8964274e" dependencies = [ - "lazy_static 1.4.0 (registry+https://github.com/rust-lang/crates.io-index)", - "libc 0.2.66 (registry+https://github.com/rust-lang/crates.io-index)", - "log 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)", - "openssl 0.10.26 (registry+https://github.com/rust-lang/crates.io-index)", - "openssl-probe 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)", - "openssl-sys 0.9.53 (registry+https://github.com/rust-lang/crates.io-index)", - "schannel 0.1.16 (registry+https://github.com/rust-lang/crates.io-index)", - "security-framework 0.3.4 (registry+https://github.com/rust-lang/crates.io-index)", - "security-framework-sys 0.3.3 (registry+https://github.com/rust-lang/crates.io-index)", - "tempfile 3.1.0 (registry+https://github.com/rust-lang/crates.io-index)", + "lazy_static", + "libc", + "log", + "openssl", + "openssl-probe", + "openssl-sys", + "schannel", + "security-framework", + "security-framework-sys", + "tempfile", ] [[package]] name = "ncollide2d" version = "0.19.2" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fd7791f03728b7fa45bd18af5adcb6f162a05e10853f273133547e9e12fa1910" dependencies = [ - "alga 0.9.2 (registry+https://github.com/rust-lang/crates.io-index)", - "approx 0.3.2 (registry+https://github.com/rust-lang/crates.io-index)", - "bitflags 1.2.1 (registry+https://github.com/rust-lang/crates.io-index)", - "downcast-rs 1.1.1 (registry+https://github.com/rust-lang/crates.io-index)", - "either 1.5.3 (registry+https://github.com/rust-lang/crates.io-index)", - "nalgebra 0.18.1 (registry+https://github.com/rust-lang/crates.io-index)", - "num-traits 0.2.11 (registry+https://github.com/rust-lang/crates.io-index)", - "petgraph 0.4.13 (registry+https://github.com/rust-lang/crates.io-index)", - "rand 0.6.5 (registry+https://github.com/rust-lang/crates.io-index)", - "slab 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)", - "smallvec 0.6.13 (registry+https://github.com/rust-lang/crates.io-index)", + "alga", + "approx", + "bitflags", + "downcast-rs", + "either", + "nalgebra", + "num-traits", + "petgraph", + "rand 0.6.5", + "slab", + "smallvec 0.6.13", ] [[package]] name = "net2" version = "0.2.33" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "42550d9fb7b6684a6d404d9fa7250c2eb2646df731d1c06afc06dcee9e1bcf88" dependencies = [ - "cfg-if 0.1.10 (registry+https://github.com/rust-lang/crates.io-index)", - "libc 0.2.66 (registry+https://github.com/rust-lang/crates.io-index)", - "winapi 0.3.8 (registry+https://github.com/rust-lang/crates.io-index)", + "cfg-if", + "libc", + "winapi 0.3.8", ] [[package]] name = "new_debug_unreachable" version = "1.0.4" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e4a24736216ec316047a1fc4252e27dabb04218aa4a3f37c6e7ddbf1f9782b54" [[package]] name = "nodrop" version = "0.1.14" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "72ef4a56884ca558e5ddb05a1d1e7e1bfd9a68d9ed024c21704cc98872dae1bb" [[package]] name = "num-complex" version = "0.2.4" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b6b19411a9719e753aff12e5187b74d60d3dc449ec3f4dc21e3989c3f554bc95" dependencies = [ - "autocfg 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)", - "num-traits 0.2.11 (registry+https://github.com/rust-lang/crates.io-index)", + "autocfg 1.0.0", + "num-traits", ] [[package]] name = "num-integer" version = "0.1.42" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3f6ea62e9d81a77cd3ee9a2a5b9b609447857f3d358704331e4ef39eb247fcba" dependencies = [ - "autocfg 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)", - "num-traits 0.2.11 (registry+https://github.com/rust-lang/crates.io-index)", + "autocfg 1.0.0", + "num-traits", ] [[package]] name = "num-rational" version = "0.2.3" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "da4dc79f9e6c81bef96148c8f6b8e72ad4541caa4a24373e900a36da07de03a3" dependencies = [ - "autocfg 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)", - "num-integer 0.1.42 (registry+https://github.com/rust-lang/crates.io-index)", - "num-traits 0.2.11 (registry+https://github.com/rust-lang/crates.io-index)", + "autocfg 1.0.0", + "num-integer", + "num-traits", ] [[package]] name = "num-traits" version = "0.2.11" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c62be47e61d1842b9170f0fdeec8eba98e60e90e5446449a0545e5152acd7096" dependencies = [ - "autocfg 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)", + "autocfg 1.0.0", ] [[package]] name = "num_cpus" version = "1.12.0" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "46203554f085ff89c235cd12f7075f3233af9b11ed7c9e16dfe2560d03313ce6" dependencies = [ - "hermit-abi 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)", - "libc 0.2.66 (registry+https://github.com/rust-lang/crates.io-index)", + "hermit-abi", + "libc", ] [[package]] name = "objc" version = "0.2.7" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "915b1b472bc21c53464d6c8461c9d3af805ba1ef837e1cac254428f4a77177b1" dependencies = [ - "malloc_buf 0.0.6 (registry+https://github.com/rust-lang/crates.io-index)", + "malloc_buf", ] [[package]] name = "objc-foundation" version = "0.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1add1b659e36c9607c7aab864a76c7a4c2760cd0cd2e120f3fb8b952c7e22bf9" dependencies = [ - "block 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)", - "objc 0.2.7 (registry+https://github.com/rust-lang/crates.io-index)", - "objc_id 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", + "block", + "objc", + "objc_id", ] [[package]] name = "objc_id" version = "0.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c92d4ddb4bd7b50d730c215ff871754d0da6b2178849f8a2a2ab69712d0c073b" dependencies = [ - "objc 0.2.7 (registry+https://github.com/rust-lang/crates.io-index)", + "objc", ] [[package]] name = "once_cell" version = "1.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0b631f7e854af39a1739f401cf34a8a013dfe09eac4fa4dba91e9768bd28168d" [[package]] name = "opaque-debug" version = "0.2.3" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2839e79665f131bdb5782e51f2c6c9599c133c6098982a54c794358bf432529c" [[package]] name = "openssl" version = "0.10.26" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3a3cc5799d98e1088141b8e01ff760112bbd9f19d850c124500566ca6901a585" dependencies = [ - "bitflags 1.2.1 (registry+https://github.com/rust-lang/crates.io-index)", - "cfg-if 0.1.10 (registry+https://github.com/rust-lang/crates.io-index)", - "foreign-types 0.3.2 (registry+https://github.com/rust-lang/crates.io-index)", - "lazy_static 1.4.0 (registry+https://github.com/rust-lang/crates.io-index)", - "libc 0.2.66 (registry+https://github.com/rust-lang/crates.io-index)", - "openssl-sys 0.9.53 (registry+https://github.com/rust-lang/crates.io-index)", + "bitflags", + "cfg-if", + "foreign-types", + "lazy_static", + "libc", + "openssl-sys", ] [[package]] name = "openssl-probe" version = "0.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "77af24da69f9d9341038eba93a073b1fdaaa1b788221b00a69bce9e762cb32de" [[package]] name = "openssl-sys" version = "0.9.53" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "465d16ae7fc0e313318f7de5cecf57b2fbe7511fd213978b457e1c96ff46736f" dependencies = [ - "autocfg 0.1.7 (registry+https://github.com/rust-lang/crates.io-index)", - "cc 1.0.50 (registry+https://github.com/rust-lang/crates.io-index)", - "libc 0.2.66 (registry+https://github.com/rust-lang/crates.io-index)", - "pkg-config 0.3.17 (registry+https://github.com/rust-lang/crates.io-index)", - "vcpkg 0.2.8 (registry+https://github.com/rust-lang/crates.io-index)", + "autocfg 0.1.7", + "cc", + "libc", + "pkg-config", + "vcpkg", ] [[package]] name = "ordermap" version = "0.3.5" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a86ed3f5f244b372d6b1a00b72ef7f8876d0bc6a78a4c9985c53614041512063" [[package]] name = "pango" version = "0.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "393fa071b144f8ffb83ede273758983cf414ca3c0b1d2a5a9ce325b3ba3dd786" dependencies = [ - "bitflags 1.2.1 (registry+https://github.com/rust-lang/crates.io-index)", - "glib 0.8.2 (registry+https://github.com/rust-lang/crates.io-index)", - "glib-sys 0.9.1 (registry+https://github.com/rust-lang/crates.io-index)", - "gobject-sys 0.9.1 (registry+https://github.com/rust-lang/crates.io-index)", - "lazy_static 1.4.0 (registry+https://github.com/rust-lang/crates.io-index)", - "libc 0.2.66 (registry+https://github.com/rust-lang/crates.io-index)", - "pango-sys 0.9.1 (registry+https://github.com/rust-lang/crates.io-index)", + "bitflags", + "glib", + "glib-sys", + "gobject-sys", + "lazy_static", + "libc", + "pango-sys", ] [[package]] name = "pango-sys" version = "0.9.1" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "86b93d84907b3cf0819bff8f13598ba72843bee579d5ebc2502e4b0367b4be7d" dependencies = [ - "glib-sys 0.9.1 (registry+https://github.com/rust-lang/crates.io-index)", - "gobject-sys 0.9.1 (registry+https://github.com/rust-lang/crates.io-index)", - "libc 0.2.66 (registry+https://github.com/rust-lang/crates.io-index)", - "pkg-config 0.3.17 (registry+https://github.com/rust-lang/crates.io-index)", + "glib-sys", + "gobject-sys", + "libc", + "pkg-config", ] [[package]] name = "pangocairo" version = "0.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7486695787f206924b662cb8ca7b3c987fdbbff4ccff3612017cf471aee65162" dependencies = [ - "bitflags 1.2.1 (registry+https://github.com/rust-lang/crates.io-index)", - "cairo-rs 0.7.1 (registry+https://github.com/rust-lang/crates.io-index)", - "cairo-sys-rs 0.9.2 (registry+https://github.com/rust-lang/crates.io-index)", - "glib 0.8.2 (registry+https://github.com/rust-lang/crates.io-index)", - "glib-sys 0.9.1 (registry+https://github.com/rust-lang/crates.io-index)", - "gobject-sys 0.9.1 (registry+https://github.com/rust-lang/crates.io-index)", - "libc 0.2.66 (registry+https://github.com/rust-lang/crates.io-index)", - "pango 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)", - "pango-sys 0.9.1 (registry+https://github.com/rust-lang/crates.io-index)", - "pangocairo-sys 0.10.1 (registry+https://github.com/rust-lang/crates.io-index)", + "bitflags", + "cairo-rs", + "cairo-sys-rs", + "glib", + "glib-sys", + "gobject-sys", + "libc", + "pango", + "pango-sys", + "pangocairo-sys", ] [[package]] name = "pangocairo-sys" version = "0.10.1" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a3921b31ab776b23e28c8f6e474dda52fdc28bc2689101caeb362ba976719efe" dependencies = [ - "cairo-sys-rs 0.9.2 (registry+https://github.com/rust-lang/crates.io-index)", - "glib-sys 0.9.1 (registry+https://github.com/rust-lang/crates.io-index)", - "libc 0.2.66 (registry+https://github.com/rust-lang/crates.io-index)", - "pango-sys 0.9.1 (registry+https://github.com/rust-lang/crates.io-index)", - "pkg-config 0.3.17 (registry+https://github.com/rust-lang/crates.io-index)", + "cairo-sys-rs", + "glib-sys", + "libc", + "pango-sys", + "pkg-config", ] [[package]] name = "parking_lot" version = "0.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f842b1982eb6c2fe34036a4fbfb06dd185a3f5c8edfaacdf7d1ea10b07de6252" dependencies = [ - "lock_api 0.3.3 (registry+https://github.com/rust-lang/crates.io-index)", - "parking_lot_core 0.6.2 (registry+https://github.com/rust-lang/crates.io-index)", - "rustc_version 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)", + "lock_api", + "parking_lot_core", + "rustc_version", ] [[package]] name = "parking_lot_core" version = "0.6.2" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b876b1b9e7ac6e1a74a6da34d25c42e17e8862aa409cbbbdcfc8d86c6f3bc62b" dependencies = [ - "cfg-if 0.1.10 (registry+https://github.com/rust-lang/crates.io-index)", - "cloudabi 0.0.3 (registry+https://github.com/rust-lang/crates.io-index)", - "libc 0.2.66 (registry+https://github.com/rust-lang/crates.io-index)", - "redox_syscall 0.1.56 (registry+https://github.com/rust-lang/crates.io-index)", - "rustc_version 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)", - "smallvec 0.6.13 (registry+https://github.com/rust-lang/crates.io-index)", - "winapi 0.3.8 (registry+https://github.com/rust-lang/crates.io-index)", + "cfg-if", + "cloudabi", + "libc", + "redox_syscall", + "rustc_version", + "smallvec 0.6.13", + "winapi 0.3.8", ] [[package]] name = "percent-encoding" version = "1.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "31010dd2e1ac33d5b46a5b413495239882813e0369f8ed8a5e266f173602f831" [[package]] name = "percent-encoding" version = "2.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d4fd5641d01c8f18a23da7b6fe29298ff4b55afcccdf78973b24cf3175fee32e" [[package]] name = "petgraph" version = "0.4.13" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9c3659d1ee90221741f65dd128d9998311b0e40c5d3c23a62445938214abce4f" dependencies = [ - "fixedbitset 0.1.9 (registry+https://github.com/rust-lang/crates.io-index)", - "ordermap 0.3.5 (registry+https://github.com/rust-lang/crates.io-index)", + "fixedbitset", + "ordermap", ] [[package]] name = "phf" version = "0.7.24" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b3da44b85f8e8dfaec21adae67f95d93244b2ecf6ad2a692320598dcc8e6dd18" dependencies = [ - "phf_shared 0.7.24 (registry+https://github.com/rust-lang/crates.io-index)", + "phf_shared 0.7.24", ] [[package]] name = "phf" version = "0.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3dfb61232e34fcb633f43d12c58f83c1df82962dcdfa565a4e866ffc17dafe12" dependencies = [ - "phf_macros 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)", - "phf_shared 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)", - "proc-macro-hack 0.5.16 (registry+https://github.com/rust-lang/crates.io-index)", + "phf_macros", + "phf_shared 0.8.0", + "proc-macro-hack", ] [[package]] name = "phf_codegen" version = "0.7.24" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b03e85129e324ad4166b06b2c7491ae27fe3ec353af72e72cd1654c7225d517e" dependencies = [ - "phf_generator 0.7.24 (registry+https://github.com/rust-lang/crates.io-index)", - "phf_shared 0.7.24 (registry+https://github.com/rust-lang/crates.io-index)", + "phf_generator 0.7.24", + "phf_shared 0.7.24", ] [[package]] name = "phf_codegen" version = "0.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cbffee61585b0411840d3ece935cce9cb6321f01c45477d30066498cd5e1a815" dependencies = [ - "phf_generator 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)", - "phf_shared 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)", + "phf_generator 0.8.0", + "phf_shared 0.8.0", ] [[package]] name = "phf_generator" version = "0.7.24" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "09364cc93c159b8b06b1f4dd8a4398984503483891b0c26b867cf431fb132662" dependencies = [ - "phf_shared 0.7.24 (registry+https://github.com/rust-lang/crates.io-index)", - "rand 0.6.5 (registry+https://github.com/rust-lang/crates.io-index)", + "phf_shared 0.7.24", + "rand 0.6.5", ] [[package]] name = "phf_generator" version = "0.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "17367f0cc86f2d25802b2c26ee58a7b23faeccf78a396094c13dced0d0182526" dependencies = [ - "phf_shared 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)", - "rand 0.7.3 (registry+https://github.com/rust-lang/crates.io-index)", + "phf_shared 0.8.0", + "rand 0.7.3", ] [[package]] name = "phf_macros" version = "0.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7f6fde18ff429ffc8fe78e2bf7f8b7a5a5a6e2a8b58bc5a9ac69198bbda9189c" dependencies = [ - "phf_generator 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)", - "phf_shared 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)", - "proc-macro-hack 0.5.16 (registry+https://github.com/rust-lang/crates.io-index)", - "proc-macro2 1.0.8 (registry+https://github.com/rust-lang/crates.io-index)", - "quote 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)", - "syn 1.0.14 (registry+https://github.com/rust-lang/crates.io-index)", + "phf_generator 0.8.0", + "phf_shared 0.8.0", + "proc-macro-hack", + "proc-macro2 1.0.8", + "quote 1.0.2", + "syn 1.0.14", ] [[package]] name = "phf_shared" version = "0.7.24" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "234f71a15de2288bcb7e3b6515828d22af7ec8598ee6d24c3b526fa0a80b67a0" dependencies = [ - "siphasher 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)", + "siphasher 0.2.3", ] [[package]] name = "phf_shared" version = "0.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c00cf8b9eafe68dde5e9eaa2cef8ee84a9336a47d566ec55ca16589633b65af7" dependencies = [ - "siphasher 0.3.3 (registry+https://github.com/rust-lang/crates.io-index)", + "siphasher 0.3.3", ] [[package]] name = "pkg-config" version = "0.3.17" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "05da548ad6865900e60eaba7f589cc0783590a92e940c26953ff81ddbab2d677" [[package]] name = "pom" version = "3.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ef5cf7f52c12da93c26b63ee0d9f012bc82fb071851c546c030dc6ecb5f2994b" [[package]] name = "ppv-lite86" version = "0.2.6" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "74490b50b9fbe561ac330df47c08f3f33073d2d00c150f719147d7c54522fa1b" [[package]] name = "precomputed-hash" version = "0.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "925383efa346730478fb4838dbe9137d2a47675ad789c546d150a6e1dd4ab31c" [[package]] name = "proc-macro-hack" version = "0.5.16" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7e0456befd48169b9f13ef0f0ad46d492cf9d2dbb918bcf38e01eed4ce3ec5e4" [[package]] name = "proc-macro2" version = "0.2.3" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cd07deb3c6d1d9ff827999c7f9b04cdfd66b1b17ae508e14fe47b620f2282ae0" dependencies = [ - "unicode-xid 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)", + "unicode-xid 0.1.0", ] [[package]] name = "proc-macro2" version = "0.4.30" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cf3d2011ab5c909338f7887f4fc896d35932e29146c12c8d01da6b22a80ba759" dependencies = [ - "unicode-xid 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)", + "unicode-xid 0.1.0", ] [[package]] name = "proc-macro2" version = "1.0.8" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3acb317c6ff86a4e579dfa00fc5e6cca91ecbb4e7eb2df0468805b674eb88548" dependencies = [ - "unicode-xid 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)", + "unicode-xid 0.2.0", ] [[package]] name = "publicsuffix" version = "1.5.4" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3bbaa49075179162b49acac1c6aa45fb4dafb5f13cf6794276d77bc7fd95757b" dependencies = [ - "error-chain 0.12.1 (registry+https://github.com/rust-lang/crates.io-index)", - "idna 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)", - "lazy_static 1.4.0 (registry+https://github.com/rust-lang/crates.io-index)", - "regex 1.3.3 (registry+https://github.com/rust-lang/crates.io-index)", - "url 2.1.1 (registry+https://github.com/rust-lang/crates.io-index)", + "error-chain", + "idna 0.2.0", + "lazy_static", + "regex", + "url 2.1.1", ] [[package]] name = "pulldown-cmark" version = "0.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d1b74cc784b038a9921fd1a48310cc2e238101aa8ae0b94201e2d85121dd68b5" dependencies = [ - "bitflags 1.2.1 (registry+https://github.com/rust-lang/crates.io-index)", - "getopts 0.2.21 (registry+https://github.com/rust-lang/crates.io-index)", - "memchr 2.3.0 (registry+https://github.com/rust-lang/crates.io-index)", - "unicase 2.6.0 (registry+https://github.com/rust-lang/crates.io-index)", + "bitflags", + "getopts", + "memchr", + "unicase", ] [[package]] name = "quick-error" version = "1.2.3" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a1d01941d82fa2ab50be1e79e6714289dd7cde78eba4c074bc5a4374f650dfe0" [[package]] name = "quote" version = "0.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1eca14c727ad12702eb4b6bfb5a232287dcf8385cb8ca83a3eeaf6519c44c408" dependencies = [ - "proc-macro2 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)", + "proc-macro2 0.2.3", ] [[package]] name = "quote" version = "0.6.13" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6ce23b6b870e8f94f81fb0a363d65d86675884b34a09043c81e5562f11c1f8e1" dependencies = [ - "proc-macro2 0.4.30 (registry+https://github.com/rust-lang/crates.io-index)", + "proc-macro2 0.4.30", ] [[package]] name = "quote" version = "1.0.2" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "053a8c8bcc71fcce321828dc897a98ab9760bef03a4fc36693c231e5b3216cfe" dependencies = [ - "proc-macro2 1.0.8 (registry+https://github.com/rust-lang/crates.io-index)", + "proc-macro2 1.0.8", ] [[package]] name = "quoted-string" version = "0.6.1" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5a206a30ce37189d1340e7da2ee0b4d65e342590af676541c23a4f3959ba272e" [[package]] name = "rand" version = "0.4.6" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "552840b97013b1a26992c11eac34bdd778e464601a4c2054b5f0bff7c6761293" dependencies = [ - "fuchsia-cprng 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", - "libc 0.2.66 (registry+https://github.com/rust-lang/crates.io-index)", - "rand_core 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)", - "rdrand 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)", - "winapi 0.3.8 (registry+https://github.com/rust-lang/crates.io-index)", + "fuchsia-cprng", + "libc", + "rand_core 0.3.1", + "rdrand", + "winapi 0.3.8", ] [[package]] name = "rand" version = "0.6.5" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6d71dacdc3c88c1fde3885a3be3fbab9f35724e6ce99467f7d9c5026132184ca" dependencies = [ - "autocfg 0.1.7 (registry+https://github.com/rust-lang/crates.io-index)", - "libc 0.2.66 (registry+https://github.com/rust-lang/crates.io-index)", - "rand_chacha 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", - "rand_core 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)", - "rand_hc 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)", - "rand_isaac 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", - "rand_jitter 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)", - "rand_os 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)", - "rand_pcg 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)", - "rand_xorshift 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", - "winapi 0.3.8 (registry+https://github.com/rust-lang/crates.io-index)", + "autocfg 0.1.7", + "libc", + "rand_chacha 0.1.1", + "rand_core 0.4.2", + "rand_hc 0.1.0", + "rand_isaac", + "rand_jitter", + "rand_os", + "rand_pcg 0.1.2", + "rand_xorshift", + "winapi 0.3.8", ] [[package]] name = "rand" version = "0.7.3" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6a6b1679d49b24bbfe0c803429aa1874472f50d9b363131f0e89fc356b544d03" dependencies = [ - "getrandom 0.1.14 (registry+https://github.com/rust-lang/crates.io-index)", - "libc 0.2.66 (registry+https://github.com/rust-lang/crates.io-index)", - "rand_chacha 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)", - "rand_core 0.5.1 (registry+https://github.com/rust-lang/crates.io-index)", - "rand_hc 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)", - "rand_pcg 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)", + "getrandom", + "libc", + "rand_chacha 0.2.1", + "rand_core 0.5.1", + "rand_hc 0.2.0", + "rand_pcg 0.2.1", ] [[package]] name = "rand_chacha" version = "0.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "556d3a1ca6600bfcbab7c7c91ccb085ac7fbbcd70e008a98742e7847f4f7bcef" dependencies = [ - "autocfg 0.1.7 (registry+https://github.com/rust-lang/crates.io-index)", - "rand_core 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)", + "autocfg 0.1.7", + "rand_core 0.3.1", ] [[package]] name = "rand_chacha" version = "0.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "03a2a90da8c7523f554344f921aa97283eadf6ac484a6d2a7d0212fa7f8d6853" dependencies = [ - "c2-chacha 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)", - "rand_core 0.5.1 (registry+https://github.com/rust-lang/crates.io-index)", + "c2-chacha", + "rand_core 0.5.1", ] [[package]] name = "rand_core" version = "0.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7a6fdeb83b075e8266dcc8762c22776f6877a63111121f5f8c7411e5be7eed4b" dependencies = [ - "rand_core 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)", + "rand_core 0.4.2", ] [[package]] name = "rand_core" version = "0.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9c33a3c44ca05fa6f1807d8e6743f3824e8509beca625669633be0acbdf509dc" [[package]] name = "rand_core" version = "0.5.1" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "90bde5296fc891b0cef12a6d03ddccc162ce7b2aff54160af9338f8d40df6d19" dependencies = [ - "getrandom 0.1.14 (registry+https://github.com/rust-lang/crates.io-index)", + "getrandom", ] [[package]] name = "rand_hc" version = "0.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7b40677c7be09ae76218dc623efbf7b18e34bced3f38883af07bb75630a21bc4" dependencies = [ - "rand_core 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)", + "rand_core 0.3.1", ] [[package]] name = "rand_hc" version = "0.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ca3129af7b92a17112d59ad498c6f81eaf463253766b90396d39ea7a39d6613c" dependencies = [ - "rand_core 0.5.1 (registry+https://github.com/rust-lang/crates.io-index)", + "rand_core 0.5.1", ] [[package]] name = "rand_isaac" version = "0.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ded997c9d5f13925be2a6fd7e66bf1872597f759fd9dd93513dd7e92e5a5ee08" dependencies = [ - "rand_core 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)", + "rand_core 0.3.1", ] [[package]] name = "rand_jitter" version = "0.1.4" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1166d5c91dc97b88d1decc3285bb0a99ed84b05cfd0bc2341bdf2d43fc41e39b" dependencies = [ - "libc 0.2.66 (registry+https://github.com/rust-lang/crates.io-index)", - "rand_core 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)", - "winapi 0.3.8 (registry+https://github.com/rust-lang/crates.io-index)", + "libc", + "rand_core 0.4.2", + "winapi 0.3.8", ] [[package]] name = "rand_os" version = "0.1.3" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7b75f676a1e053fc562eafbb47838d67c84801e38fc1ba459e8f180deabd5071" dependencies = [ - "cloudabi 0.0.3 (registry+https://github.com/rust-lang/crates.io-index)", - "fuchsia-cprng 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", - "libc 0.2.66 (registry+https://github.com/rust-lang/crates.io-index)", - "rand_core 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)", - "rdrand 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)", - "winapi 0.3.8 (registry+https://github.com/rust-lang/crates.io-index)", + "cloudabi", + "fuchsia-cprng", + "libc", + "rand_core 0.4.2", + "rdrand", + "winapi 0.3.8", ] [[package]] name = "rand_pcg" version = "0.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "abf9b09b01790cfe0364f52bf32995ea3c39f4d2dd011eac241d2914146d0b44" dependencies = [ - "autocfg 0.1.7 (registry+https://github.com/rust-lang/crates.io-index)", - "rand_core 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)", + "autocfg 0.1.7", + "rand_core 0.4.2", ] [[package]] name = "rand_pcg" version = "0.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "16abd0c1b639e9eb4d7c50c0b8100b0d0f849be2349829c740fe8e6eb4816429" dependencies = [ - "rand_core 0.5.1 (registry+https://github.com/rust-lang/crates.io-index)", + "rand_core 0.5.1", ] [[package]] name = "rand_xorshift" version = "0.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cbf7e9e623549b0e21f6e97cf8ecf247c1a8fd2e8a992ae265314300b2455d5c" dependencies = [ - "rand_core 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)", + "rand_core 0.3.1", ] [[package]] name = "rawpointer" version = "0.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "60a357793950651c4ed0f3f52338f53b2f809f32d83a07f72909fa13e4c6c1e3" [[package]] name = "rayon" version = "1.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "db6ce3297f9c85e16621bb8cca38a06779ffc31bb8184e1be4bed2be4678a098" dependencies = [ - "crossbeam-deque 0.7.2 (registry+https://github.com/rust-lang/crates.io-index)", - "either 1.5.3 (registry+https://github.com/rust-lang/crates.io-index)", - "rayon-core 1.7.0 (registry+https://github.com/rust-lang/crates.io-index)", + "crossbeam-deque", + "either", + "rayon-core", ] [[package]] name = "rayon-core" version = "1.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "08a89b46efaf957e52b18062fb2f4660f8b8a4dde1807ca002690868ef2c85a9" dependencies = [ - "crossbeam-deque 0.7.2 (registry+https://github.com/rust-lang/crates.io-index)", - "crossbeam-queue 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)", - "crossbeam-utils 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)", - "lazy_static 1.4.0 (registry+https://github.com/rust-lang/crates.io-index)", - "num_cpus 1.12.0 (registry+https://github.com/rust-lang/crates.io-index)", + "crossbeam-deque", + "crossbeam-queue 0.2.1", + "crossbeam-utils 0.7.0", + "lazy_static", + "num_cpus", ] [[package]] name = "rctree" version = "0.3.3" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "be9e29cb19c8fe84169fcb07f8f11e66bc9e6e0280efd4715c54818296f8a4a8" [[package]] name = "rdrand" version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "678054eb77286b51581ba43620cc911abf02758c91f93f479767aed0f90458b2" dependencies = [ - "rand_core 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)", + "rand_core 0.3.1", ] [[package]] name = "redox_syscall" version = "0.1.56" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2439c63f3f6139d1b57529d16bc3b8bb855230c8efcc5d3a896c8bea7c3b1e84" [[package]] name = "regex" version = "1.3.3" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b5508c1941e4e7cb19965abef075d35a9a8b5cdf0846f30b4050e9b55dc55e87" dependencies = [ - "aho-corasick 0.7.6 (registry+https://github.com/rust-lang/crates.io-index)", - "memchr 2.3.0 (registry+https://github.com/rust-lang/crates.io-index)", - "regex-syntax 0.6.13 (registry+https://github.com/rust-lang/crates.io-index)", - "thread_local 1.0.1 (registry+https://github.com/rust-lang/crates.io-index)", + "aho-corasick", + "memchr", + "regex-syntax", + "thread_local", ] [[package]] name = "regex-syntax" version = "0.6.13" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e734e891f5b408a29efbf8309e656876276f49ab6a6ac208600b4419bd893d90" [[package]] name = "remove_dir_all" version = "0.5.2" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4a83fa3702a688b9359eccba92d153ac33fd2e8462f9e0e3fdf155239ea7792e" dependencies = [ - "winapi 0.3.8 (registry+https://github.com/rust-lang/crates.io-index)", + "winapi 0.3.8", ] [[package]] name = "reqwest" version = "0.9.24" source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "base64 0.10.1 (registry+https://github.com/rust-lang/crates.io-index)", - "bytes 0.4.12 (registry+https://github.com/rust-lang/crates.io-index)", - "cookie 0.12.0 (registry+https://github.com/rust-lang/crates.io-index)", - "cookie_store 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)", - "encoding_rs 0.8.22 (registry+https://github.com/rust-lang/crates.io-index)", - "flate2 1.0.13 (registry+https://github.com/rust-lang/crates.io-index)", - "futures 0.1.29 (registry+https://github.com/rust-lang/crates.io-index)", - "http 0.1.21 (registry+https://github.com/rust-lang/crates.io-index)", - "hyper 0.12.35 (registry+https://github.com/rust-lang/crates.io-index)", - "hyper-tls 0.3.2 (registry+https://github.com/rust-lang/crates.io-index)", - "log 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)", - "mime 0.3.16 (registry+https://github.com/rust-lang/crates.io-index)", - "mime_guess 2.0.1 (registry+https://github.com/rust-lang/crates.io-index)", - "native-tls 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)", - "serde 1.0.104 (registry+https://github.com/rust-lang/crates.io-index)", - "serde_json 1.0.45 (registry+https://github.com/rust-lang/crates.io-index)", - "serde_urlencoded 0.5.5 (registry+https://github.com/rust-lang/crates.io-index)", - "time 0.1.42 (registry+https://github.com/rust-lang/crates.io-index)", - "tokio 0.1.22 (registry+https://github.com/rust-lang/crates.io-index)", - "tokio-executor 0.1.9 (registry+https://github.com/rust-lang/crates.io-index)", - "tokio-io 0.1.12 (registry+https://github.com/rust-lang/crates.io-index)", - "tokio-threadpool 0.1.17 (registry+https://github.com/rust-lang/crates.io-index)", - "tokio-timer 0.2.12 (registry+https://github.com/rust-lang/crates.io-index)", - "url 1.7.2 (registry+https://github.com/rust-lang/crates.io-index)", - "uuid 0.7.4 (registry+https://github.com/rust-lang/crates.io-index)", - "winreg 0.6.2 (registry+https://github.com/rust-lang/crates.io-index)", +checksum = "f88643aea3c1343c804950d7bf983bd2067f5ab59db6d613a08e05572f2714ab" +dependencies = [ + "base64", + "bytes", + "cookie", + "cookie_store", + "encoding_rs", + "flate2", + "futures", + "http", + "hyper", + "hyper-tls", + "log", + "mime", + "mime_guess", + "native-tls", + "serde", + "serde_json", + "serde_urlencoded", + "time", + "tokio", + "tokio-executor", + "tokio-io", + "tokio-threadpool", + "tokio-timer", + "url 1.7.2", + "uuid", + "winreg", ] [[package]] @@ -1878,1097 +2083,887 @@ name = "rsvg_internals" version = "0.0.1" source = "git+https://gitlab.gnome.org/GNOME/librsvg?rev=6ecab568#6ecab568ae60699ab2e1be9269e920d7ce69bd1d" dependencies = [ - "cairo-rs 0.7.1 (registry+https://github.com/rust-lang/crates.io-index)", - "cairo-sys-rs 0.9.2 (registry+https://github.com/rust-lang/crates.io-index)", - "cssparser 0.27.2 (registry+https://github.com/rust-lang/crates.io-index)", - "data-url 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)", - "downcast-rs 1.1.1 (registry+https://github.com/rust-lang/crates.io-index)", - "encoding 0.2.33 (registry+https://github.com/rust-lang/crates.io-index)", - "float-cmp 0.5.3 (registry+https://github.com/rust-lang/crates.io-index)", - "gdk-pixbuf 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)", - "gdk-pixbuf-sys 0.9.1 (registry+https://github.com/rust-lang/crates.io-index)", - "gio 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)", - "gio-sys 0.9.1 (registry+https://github.com/rust-lang/crates.io-index)", - "glib 0.8.2 (registry+https://github.com/rust-lang/crates.io-index)", - "glib-sys 0.9.1 (registry+https://github.com/rust-lang/crates.io-index)", - "itertools 0.8.2 (registry+https://github.com/rust-lang/crates.io-index)", - "language-tags 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)", - "libc 0.2.66 (registry+https://github.com/rust-lang/crates.io-index)", - "locale_config 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)", - "markup5ever 0.10.0 (registry+https://github.com/rust-lang/crates.io-index)", - "nalgebra 0.18.1 (registry+https://github.com/rust-lang/crates.io-index)", - "num-traits 0.2.11 (registry+https://github.com/rust-lang/crates.io-index)", - "once_cell 1.4.0 (registry+https://github.com/rust-lang/crates.io-index)", - "pango 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)", - "pango-sys 0.9.1 (registry+https://github.com/rust-lang/crates.io-index)", - "pangocairo 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)", - "phf 0.7.24 (registry+https://github.com/rust-lang/crates.io-index)", - "pkg-config 0.3.17 (registry+https://github.com/rust-lang/crates.io-index)", - "rayon 1.3.0 (registry+https://github.com/rust-lang/crates.io-index)", - "rctree 0.3.3 (registry+https://github.com/rust-lang/crates.io-index)", - "regex 1.3.3 (registry+https://github.com/rust-lang/crates.io-index)", - "selectors 0.22.0 (registry+https://github.com/rust-lang/crates.io-index)", - "url 2.1.1 (registry+https://github.com/rust-lang/crates.io-index)", - "xml-rs 0.8.3 (registry+https://github.com/rust-lang/crates.io-index)", + "cairo-rs", + "cairo-sys-rs", + "cssparser", + "data-url", + "downcast-rs", + "encoding", + "float-cmp", + "gdk-pixbuf", + "gdk-pixbuf-sys", + "gio", + "gio-sys", + "glib", + "glib-sys", + "itertools 0.8.2", + "language-tags", + "libc", + "locale_config", + "markup5ever", + "nalgebra", + "num-traits", + "once_cell", + "pango", + "pango-sys", + "pangocairo", + "phf 0.7.24", + "pkg-config", + "rayon", + "rctree", + "regex", + "selectors", + "url 2.1.1", + "xml-rs", ] [[package]] name = "rustc-demangle" version = "0.1.16" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4c691c0e608126e00913e33f0ccf3727d5fc84573623b8d65b2df340b5201783" [[package]] name = "rustc_version" version = "0.2.3" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "138e3e0acb6c9fb258b19b67cb8abd63c00679d2851805ea151465464fe9030a" dependencies = [ - "semver 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)", + "semver", ] [[package]] name = "ryu" version = "1.0.2" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bfa8506c1de11c9c4e4c38863ccbe02a305c8188e85a05a784c9e11e1c3910c8" [[package]] name = "sauron" version = "0.24.0" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2ac3055fbee8a35ca88282102f4d58a50b2465d52689b6fe06ae387c2c1525b6" dependencies = [ - "cfg-if 0.1.10 (registry+https://github.com/rust-lang/crates.io-index)", - "lazy_static 1.4.0 (registry+https://github.com/rust-lang/crates.io-index)", - "log 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)", - "sauron_vdom 0.24.0 (registry+https://github.com/rust-lang/crates.io-index)", - "thiserror 1.0.15 (registry+https://github.com/rust-lang/crates.io-index)", + "cfg-if", + "lazy_static", + "log", + "sauron_vdom", + "thiserror", ] [[package]] name = "sauron_vdom" version = "0.24.0" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "65977ca10d0b763d57f2c586199d368dcd6bd422d0ad1ca43e3a20734a8adb7e" dependencies = [ - "log 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)", + "log", ] [[package]] name = "schannel" version = "0.1.16" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "87f550b06b6cba9c8b8be3ee73f391990116bf527450d2556e9b9ce263b9a021" dependencies = [ - "lazy_static 1.4.0 (registry+https://github.com/rust-lang/crates.io-index)", - "winapi 0.3.8 (registry+https://github.com/rust-lang/crates.io-index)", + "lazy_static", + "winapi 0.3.8", ] [[package]] name = "scopeguard" version = "1.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b42e15e59b18a828bbf5c58ea01debb36b9b096346de35d941dcb89009f24a0d" [[package]] name = "security-framework" version = "0.3.4" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8ef2429d7cefe5fd28bd1d2ed41c944547d4ff84776f5935b456da44593a16df" dependencies = [ - "core-foundation 0.6.4 (registry+https://github.com/rust-lang/crates.io-index)", - "core-foundation-sys 0.6.2 (registry+https://github.com/rust-lang/crates.io-index)", - "libc 0.2.66 (registry+https://github.com/rust-lang/crates.io-index)", - "security-framework-sys 0.3.3 (registry+https://github.com/rust-lang/crates.io-index)", + "core-foundation", + "core-foundation-sys", + "libc", + "security-framework-sys", ] [[package]] name = "security-framework-sys" version = "0.3.3" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e31493fc37615debb8c5090a7aeb4a9730bc61e77ab10b9af59f1a202284f895" dependencies = [ - "core-foundation-sys 0.6.2 (registry+https://github.com/rust-lang/crates.io-index)", + "core-foundation-sys", ] [[package]] name = "selectors" version = "0.22.0" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "df320f1889ac4ba6bc0cdc9c9af7af4bd64bb927bccdf32d81140dc1f9be12fe" dependencies = [ - "bitflags 1.2.1 (registry+https://github.com/rust-lang/crates.io-index)", - "cssparser 0.27.2 (registry+https://github.com/rust-lang/crates.io-index)", - "derive_more 0.99.9 (registry+https://github.com/rust-lang/crates.io-index)", - "fxhash 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)", - "log 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)", - "matches 0.1.8 (registry+https://github.com/rust-lang/crates.io-index)", - "phf 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)", - "phf_codegen 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)", - "precomputed-hash 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", - "servo_arc 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", - "smallvec 1.1.0 (registry+https://github.com/rust-lang/crates.io-index)", - "thin-slice 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", + "bitflags", + "cssparser", + "derive_more", + "fxhash", + "log", + "matches", + "phf 0.8.0", + "phf_codegen 0.8.0", + "precomputed-hash", + "servo_arc", + "smallvec 1.1.0", + "thin-slice", ] [[package]] name = "semver" version = "0.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1d7eb9ef2c18661902cc47e535f9bc51b78acd254da71d375c2f6720d9a40403" dependencies = [ - "semver-parser 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)", + "semver-parser", ] [[package]] name = "semver-parser" version = "0.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "388a1df253eca08550bef6c72392cfe7c30914bf41df5269b68cbd6ff8f570a3" [[package]] name = "serde" version = "1.0.104" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "414115f25f818d7dfccec8ee535d76949ae78584fc4f79a6f45a904bf8ab4449" dependencies = [ - "serde_derive 1.0.104 (registry+https://github.com/rust-lang/crates.io-index)", + "serde_derive", ] [[package]] name = "serde_derive" version = "1.0.104" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "128f9e303a5a29922045a830221b8f78ec74a5f544944f3d5984f8ec3895ef64" dependencies = [ - "proc-macro2 1.0.8 (registry+https://github.com/rust-lang/crates.io-index)", - "quote 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)", - "syn 1.0.14 (registry+https://github.com/rust-lang/crates.io-index)", + "proc-macro2 1.0.8", + "quote 1.0.2", + "syn 1.0.14", ] [[package]] name = "serde_json" -version = "1.0.45" +version = "1.0.61" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4fceb2595057b6891a4ee808f70054bd2d12f0e97f1cbb78689b59f676df325a" dependencies = [ - "itoa 0.4.5 (registry+https://github.com/rust-lang/crates.io-index)", - "ryu 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)", - "serde 1.0.104 (registry+https://github.com/rust-lang/crates.io-index)", + "itoa", + "ryu", + "serde", ] [[package]] name = "serde_urlencoded" version = "0.5.5" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "642dd69105886af2efd227f75a520ec9b44a820d65bc133a9131f7d229fd165a" dependencies = [ - "dtoa 0.4.4 (registry+https://github.com/rust-lang/crates.io-index)", - "itoa 0.4.5 (registry+https://github.com/rust-lang/crates.io-index)", - "serde 1.0.104 (registry+https://github.com/rust-lang/crates.io-index)", - "url 1.7.2 (registry+https://github.com/rust-lang/crates.io-index)", + "dtoa", + "itoa", + "serde", + "url 1.7.2", ] [[package]] name = "servo_arc" version = "0.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d98238b800e0d1576d8b6e3de32827c2d74bee68bb97748dcf5071fb53965432" dependencies = [ - "nodrop 0.1.14 (registry+https://github.com/rust-lang/crates.io-index)", - "stable_deref_trait 1.1.1 (registry+https://github.com/rust-lang/crates.io-index)", + "nodrop", + "stable_deref_trait", ] [[package]] name = "sha2" version = "0.8.1" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "27044adfd2e1f077f649f59deb9490d3941d674002f7d062870a60ebe9bd47a0" dependencies = [ - "block-buffer 0.7.3 (registry+https://github.com/rust-lang/crates.io-index)", - "digest 0.8.1 (registry+https://github.com/rust-lang/crates.io-index)", - "fake-simd 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)", - "opaque-debug 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)", + "block-buffer", + "digest", + "fake-simd", + "opaque-debug", ] [[package]] name = "single" version = "1.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bd5add732a1ab689845591a1b50339cf5310b563e08dc5813c65991f30369ea2" dependencies = [ - "failure 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)", + "failure", ] [[package]] name = "siphasher" version = "0.2.3" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0b8de496cf83d4ed58b6be86c3a275b8602f6ffe98d3024a869e124147a9a3ac" [[package]] name = "siphasher" version = "0.3.3" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fa8f3741c7372e75519bd9346068370c9cdaabcc1f9599cbcf2a2719352286b7" [[package]] name = "slab" version = "0.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c111b5bd5695e56cffe5129854aa230b39c93a305372fdbb2668ca2394eea9f8" [[package]] name = "smallvec" version = "0.6.13" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f7b0758c52e15a8b5e3691eae6cc559f08eee9406e548a4477ba4e67770a82b6" dependencies = [ - "maybe-uninit 2.0.0 (registry+https://github.com/rust-lang/crates.io-index)", + "maybe-uninit", ] [[package]] name = "smallvec" version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "44e59e0c9fa00817912ae6e4e6e3c4fe04455e75699d06eedc7d85917ed8e8f4" [[package]] name = "stable_deref_trait" version = "1.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dba1a27d3efae4351c8051072d619e3ade2820635c3958d826bfea39d59b54c8" [[package]] name = "static_assertions" version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a2eb9349b6444b326872e140eb1cf5e7c522154d69e7a0ffb0fb81c06b37543f" [[package]] name = "str-concat" version = "0.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3468939e48401c4fe3cdf5e5cef50951c2808ed549d1467fde249f1fcb602634" [[package]] name = "string" version = "0.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d24114bfcceb867ca7f71a0d3fe45d45619ec47a6fbfa98cb14e14250bfa5d6d" dependencies = [ - "bytes 0.4.12 (registry+https://github.com/rust-lang/crates.io-index)", + "bytes", ] [[package]] name = "string_cache" version = "0.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2940c75beb4e3bf3a494cef919a747a2cb81e52571e212bfbd185074add7208a" dependencies = [ - "lazy_static 1.4.0 (registry+https://github.com/rust-lang/crates.io-index)", - "new_debug_unreachable 1.0.4 (registry+https://github.com/rust-lang/crates.io-index)", - "phf_shared 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)", - "precomputed-hash 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", - "serde 1.0.104 (registry+https://github.com/rust-lang/crates.io-index)", + "lazy_static", + "new_debug_unreachable", + "phf_shared 0.8.0", + "precomputed-hash", + "serde", ] [[package]] name = "string_cache_codegen" version = "0.5.1" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f24c8e5e19d22a726626f1a5e16fe15b132dcf21d10177fa5a45ce7962996b97" dependencies = [ - "phf_generator 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)", - "phf_shared 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)", - "proc-macro2 1.0.8 (registry+https://github.com/rust-lang/crates.io-index)", - "quote 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)", + "phf_generator 0.8.0", + "phf_shared 0.8.0", + "proc-macro2 1.0.8", + "quote 1.0.2", ] [[package]] name = "strsim" version = "0.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8ea5119cdb4c55b55d432abb513a0429384878c15dde60cc77b1c99de1a95a6a" [[package]] name = "structopt" version = "0.2.18" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "16c2cdbf9cc375f15d1b4141bc48aeef444806655cd0e904207edc8d68d86ed7" dependencies = [ - "clap 2.33.0 (registry+https://github.com/rust-lang/crates.io-index)", - "structopt-derive 0.2.18 (registry+https://github.com/rust-lang/crates.io-index)", + "clap", + "structopt-derive", ] [[package]] name = "structopt-derive" version = "0.2.18" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "53010261a84b37689f9ed7d395165029f9cc7abb9f56bbfe86bee2597ed25107" dependencies = [ - "heck 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)", - "proc-macro2 0.4.30 (registry+https://github.com/rust-lang/crates.io-index)", - "quote 0.6.13 (registry+https://github.com/rust-lang/crates.io-index)", - "syn 0.15.44 (registry+https://github.com/rust-lang/crates.io-index)", + "heck", + "proc-macro2 0.4.30", + "quote 0.6.13", + "syn 0.15.44", ] [[package]] name = "strum" version = "0.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f6c3a2071519ab6a48f465808c4c1ffdd00dfc8e93111d02b4fc5abab177676e" [[package]] name = "strum_macros" version = "0.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8baacebd7b7c9b864d83a6ba7a246232983e277b86fa5cdec77f565715a4b136" dependencies = [ - "heck 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)", - "proc-macro2 0.4.30 (registry+https://github.com/rust-lang/crates.io-index)", - "quote 0.6.13 (registry+https://github.com/rust-lang/crates.io-index)", - "syn 0.15.44 (registry+https://github.com/rust-lang/crates.io-index)", + "heck", + "proc-macro2 0.4.30", + "quote 0.6.13", + "syn 0.15.44", ] [[package]] name = "svgbob" version = "0.5.0-alpha.5" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "44bfc246633d2bbfaec823f5278edc631bbcb06ab25055589466d69ba2803bb4" dependencies = [ - "itertools 0.8.2 (registry+https://github.com/rust-lang/crates.io-index)", - "lazy_static 1.4.0 (registry+https://github.com/rust-lang/crates.io-index)", - "nalgebra 0.18.1 (registry+https://github.com/rust-lang/crates.io-index)", - "ncollide2d 0.19.2 (registry+https://github.com/rust-lang/crates.io-index)", - "pom 3.1.0 (registry+https://github.com/rust-lang/crates.io-index)", - "sauron 0.24.0 (registry+https://github.com/rust-lang/crates.io-index)", - "unicode-width 0.1.7 (registry+https://github.com/rust-lang/crates.io-index)", + "itertools 0.8.2", + "lazy_static", + "nalgebra", + "ncollide2d", + "pom", + "sauron", + "unicode-width", ] [[package]] name = "syn" version = "0.12.15" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c97c05b8ebc34ddd6b967994d5c6e9852fa92f8b82b3858c39451f97346dcce5" dependencies = [ - "proc-macro2 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)", - "quote 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)", - "unicode-xid 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)", + "proc-macro2 0.2.3", + "quote 0.4.2", + "unicode-xid 0.1.0", ] [[package]] name = "syn" version = "0.15.44" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9ca4b3b69a77cbe1ffc9e198781b7acb0c7365a883670e8f1c1bc66fba79a5c5" dependencies = [ - "proc-macro2 0.4.30 (registry+https://github.com/rust-lang/crates.io-index)", - "quote 0.6.13 (registry+https://github.com/rust-lang/crates.io-index)", - "unicode-xid 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)", + "proc-macro2 0.4.30", + "quote 0.6.13", + "unicode-xid 0.1.0", ] [[package]] name = "syn" version = "1.0.14" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "af6f3550d8dff9ef7dc34d384ac6f107e5d31c8f57d9f28e0081503f547ac8f5" dependencies = [ - "proc-macro2 1.0.8 (registry+https://github.com/rust-lang/crates.io-index)", - "quote 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)", - "unicode-xid 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)", + "proc-macro2 1.0.8", + "quote 1.0.2", + "unicode-xid 0.2.0", ] [[package]] name = "synstructure" version = "0.12.3" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "67656ea1dc1b41b1451851562ea232ec2e5a80242139f7e679ceccfb5d61f545" dependencies = [ - "proc-macro2 1.0.8 (registry+https://github.com/rust-lang/crates.io-index)", - "quote 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)", - "syn 1.0.14 (registry+https://github.com/rust-lang/crates.io-index)", - "unicode-xid 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)", + "proc-macro2 1.0.8", + "quote 1.0.2", + "syn 1.0.14", + "unicode-xid 0.2.0", ] [[package]] name = "tempdir" version = "0.3.7" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "15f2b5fb00ccdf689e0149d1b1b3c03fead81c2b37735d812fa8bddbbf41b6d8" dependencies = [ - "rand 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", - "remove_dir_all 0.5.2 (registry+https://github.com/rust-lang/crates.io-index)", + "rand 0.4.6", + "remove_dir_all", ] [[package]] name = "tempfile" version = "3.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7a6e24d9338a0a5be79593e2fa15a648add6138caa803e2d5bc782c371732ca9" dependencies = [ - "cfg-if 0.1.10 (registry+https://github.com/rust-lang/crates.io-index)", - "libc 0.2.66 (registry+https://github.com/rust-lang/crates.io-index)", - "rand 0.7.3 (registry+https://github.com/rust-lang/crates.io-index)", - "redox_syscall 0.1.56 (registry+https://github.com/rust-lang/crates.io-index)", - "remove_dir_all 0.5.2 (registry+https://github.com/rust-lang/crates.io-index)", - "winapi 0.3.8 (registry+https://github.com/rust-lang/crates.io-index)", + "cfg-if", + "libc", + "rand 0.7.3", + "redox_syscall", + "remove_dir_all", + "winapi 0.3.8", ] [[package]] name = "tendril" version = "0.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "707feda9f2582d5d680d733e38755547a3e8fb471e7ba11452ecfd9ce93a5d3b" dependencies = [ - "futf 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)", - "mac 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", - "utf-8 0.7.5 (registry+https://github.com/rust-lang/crates.io-index)", + "futf", + "mac", + "utf-8", ] [[package]] name = "termcolor" version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bb6bfa289a4d7c5766392812c0a1f4c1ba45afa1ad47803c11e1f407d846d75f" dependencies = [ - "winapi-util 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)", + "winapi-util", ] [[package]] name = "textwrap" version = "0.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d326610f408c7a4eb6f51c37c330e496b08506c9457c9d34287ecc38809fb060" dependencies = [ - "unicode-width 0.1.7 (registry+https://github.com/rust-lang/crates.io-index)", + "unicode-width", ] [[package]] name = "thin-slice" version = "0.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8eaa81235c7058867fa8c0e7314f33dcce9c215f535d1913822a2b3f5e289f3c" [[package]] name = "thiserror" version = "1.0.15" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "54b3d3d2ff68104100ab257bb6bb0cb26c901abe4bd4ba15961f3bf867924012" dependencies = [ - "thiserror-impl 1.0.15 (registry+https://github.com/rust-lang/crates.io-index)", + "thiserror-impl", ] [[package]] name = "thiserror-impl" version = "1.0.15" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ca972988113b7715266f91250ddb98070d033c62a011fa0fcc57434a649310dd" dependencies = [ - "proc-macro2 1.0.8 (registry+https://github.com/rust-lang/crates.io-index)", - "quote 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)", - "syn 1.0.14 (registry+https://github.com/rust-lang/crates.io-index)", + "proc-macro2 1.0.8", + "quote 1.0.2", + "syn 1.0.14", ] [[package]] name = "thread_local" version = "1.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d40c6d1b69745a6ec6fb1ca717914848da4b44ae29d9b3080cbee91d72a69b14" dependencies = [ - "lazy_static 1.4.0 (registry+https://github.com/rust-lang/crates.io-index)", + "lazy_static", ] [[package]] name = "time" version = "0.1.42" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "db8dcfca086c1143c9270ac42a2bbd8a7ee477b78ac8e45b19abfb0cbede4b6f" dependencies = [ - "libc 0.2.66 (registry+https://github.com/rust-lang/crates.io-index)", - "redox_syscall 0.1.56 (registry+https://github.com/rust-lang/crates.io-index)", - "winapi 0.3.8 (registry+https://github.com/rust-lang/crates.io-index)", + "libc", + "redox_syscall", + "winapi 0.3.8", ] [[package]] name = "tokio" version = "0.1.22" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5a09c0b5bb588872ab2f09afa13ee6e9dac11e10a0ec9e8e3ba39a5a5d530af6" dependencies = [ - "bytes 0.4.12 (registry+https://github.com/rust-lang/crates.io-index)", - "futures 0.1.29 (registry+https://github.com/rust-lang/crates.io-index)", - "mio 0.6.21 (registry+https://github.com/rust-lang/crates.io-index)", - "num_cpus 1.12.0 (registry+https://github.com/rust-lang/crates.io-index)", - "tokio-current-thread 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)", - "tokio-executor 0.1.9 (registry+https://github.com/rust-lang/crates.io-index)", - "tokio-io 0.1.12 (registry+https://github.com/rust-lang/crates.io-index)", - "tokio-reactor 0.1.11 (registry+https://github.com/rust-lang/crates.io-index)", - "tokio-tcp 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)", - "tokio-threadpool 0.1.17 (registry+https://github.com/rust-lang/crates.io-index)", - "tokio-timer 0.2.12 (registry+https://github.com/rust-lang/crates.io-index)", + "bytes", + "futures", + "mio", + "num_cpus", + "tokio-current-thread", + "tokio-executor", + "tokio-io", + "tokio-reactor", + "tokio-tcp", + "tokio-threadpool", + "tokio-timer", ] [[package]] name = "tokio-buf" version = "0.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8fb220f46c53859a4b7ec083e41dec9778ff0b1851c0942b211edb89e0ccdc46" dependencies = [ - "bytes 0.4.12 (registry+https://github.com/rust-lang/crates.io-index)", - "either 1.5.3 (registry+https://github.com/rust-lang/crates.io-index)", - "futures 0.1.29 (registry+https://github.com/rust-lang/crates.io-index)", + "bytes", + "either", + "futures", ] [[package]] name = "tokio-current-thread" version = "0.1.6" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d16217cad7f1b840c5a97dfb3c43b0c871fef423a6e8d2118c604e843662a443" dependencies = [ - "futures 0.1.29 (registry+https://github.com/rust-lang/crates.io-index)", - "tokio-executor 0.1.9 (registry+https://github.com/rust-lang/crates.io-index)", + "futures", + "tokio-executor", ] [[package]] name = "tokio-executor" version = "0.1.9" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ca6df436c42b0c3330a82d855d2ef017cd793090ad550a6bc2184f4b933532ab" dependencies = [ - "crossbeam-utils 0.6.6 (registry+https://github.com/rust-lang/crates.io-index)", - "futures 0.1.29 (registry+https://github.com/rust-lang/crates.io-index)", + "crossbeam-utils 0.6.6", + "futures", ] [[package]] name = "tokio-io" version = "0.1.12" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5090db468dad16e1a7a54c8c67280c5e4b544f3d3e018f0b913b400261f85926" dependencies = [ - "bytes 0.4.12 (registry+https://github.com/rust-lang/crates.io-index)", - "futures 0.1.29 (registry+https://github.com/rust-lang/crates.io-index)", - "log 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)", + "bytes", + "futures", + "log", ] [[package]] name = "tokio-reactor" version = "0.1.11" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6732fe6b53c8d11178dcb77ac6d9682af27fc6d4cb87789449152e5377377146" dependencies = [ - "crossbeam-utils 0.6.6 (registry+https://github.com/rust-lang/crates.io-index)", - "futures 0.1.29 (registry+https://github.com/rust-lang/crates.io-index)", - "lazy_static 1.4.0 (registry+https://github.com/rust-lang/crates.io-index)", - "log 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)", - "mio 0.6.21 (registry+https://github.com/rust-lang/crates.io-index)", - "num_cpus 1.12.0 (registry+https://github.com/rust-lang/crates.io-index)", - "parking_lot 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)", - "slab 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)", - "tokio-executor 0.1.9 (registry+https://github.com/rust-lang/crates.io-index)", - "tokio-io 0.1.12 (registry+https://github.com/rust-lang/crates.io-index)", - "tokio-sync 0.1.7 (registry+https://github.com/rust-lang/crates.io-index)", + "crossbeam-utils 0.6.6", + "futures", + "lazy_static", + "log", + "mio", + "num_cpus", + "parking_lot", + "slab", + "tokio-executor", + "tokio-io", + "tokio-sync", ] [[package]] name = "tokio-sync" version = "0.1.7" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d06554cce1ae4a50f42fba8023918afa931413aded705b560e29600ccf7c6d76" dependencies = [ - "fnv 1.0.6 (registry+https://github.com/rust-lang/crates.io-index)", - "futures 0.1.29 (registry+https://github.com/rust-lang/crates.io-index)", + "fnv", + "futures", ] [[package]] name = "tokio-tcp" version = "0.1.3" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1d14b10654be682ac43efee27401d792507e30fd8d26389e1da3b185de2e4119" dependencies = [ - "bytes 0.4.12 (registry+https://github.com/rust-lang/crates.io-index)", - "futures 0.1.29 (registry+https://github.com/rust-lang/crates.io-index)", - "iovec 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)", - "mio 0.6.21 (registry+https://github.com/rust-lang/crates.io-index)", - "tokio-io 0.1.12 (registry+https://github.com/rust-lang/crates.io-index)", - "tokio-reactor 0.1.11 (registry+https://github.com/rust-lang/crates.io-index)", + "bytes", + "futures", + "iovec", + "mio", + "tokio-io", + "tokio-reactor", ] [[package]] name = "tokio-threadpool" version = "0.1.17" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f0c32ffea4827978e9aa392d2f743d973c1dfa3730a2ed3f22ce1e6984da848c" dependencies = [ - "crossbeam-deque 0.7.2 (registry+https://github.com/rust-lang/crates.io-index)", - "crossbeam-queue 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)", - "crossbeam-utils 0.6.6 (registry+https://github.com/rust-lang/crates.io-index)", - "futures 0.1.29 (registry+https://github.com/rust-lang/crates.io-index)", - "lazy_static 1.4.0 (registry+https://github.com/rust-lang/crates.io-index)", - "log 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)", - "num_cpus 1.12.0 (registry+https://github.com/rust-lang/crates.io-index)", - "slab 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)", - "tokio-executor 0.1.9 (registry+https://github.com/rust-lang/crates.io-index)", + "crossbeam-deque", + "crossbeam-queue 0.1.2", + "crossbeam-utils 0.6.6", + "futures", + "lazy_static", + "log", + "num_cpus", + "slab", + "tokio-executor", ] [[package]] name = "tokio-timer" version = "0.2.12" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1739638e364e558128461fc1ad84d997702c8e31c2e6b18fb99842268199e827" dependencies = [ - "crossbeam-utils 0.6.6 (registry+https://github.com/rust-lang/crates.io-index)", - "futures 0.1.29 (registry+https://github.com/rust-lang/crates.io-index)", - "slab 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)", - "tokio-executor 0.1.9 (registry+https://github.com/rust-lang/crates.io-index)", + "crossbeam-utils 0.6.6", + "futures", + "slab", + "tokio-executor", ] [[package]] name = "toml" version = "0.5.6" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ffc92d160b1eef40665be3a05630d003936a3bc7da7421277846c2613e92c71a" dependencies = [ - "serde 1.0.104 (registry+https://github.com/rust-lang/crates.io-index)", + "serde", ] [[package]] name = "try-lock" version = "0.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e604eb7b43c06650e854be16a2a03155743d3752dd1c943f6829e26b7a36e382" [[package]] name = "try_from" version = "0.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "283d3b89e1368717881a9d51dad843cc435380d8109c9e47d38780a324698d8b" dependencies = [ - "cfg-if 0.1.10 (registry+https://github.com/rust-lang/crates.io-index)", + "cfg-if", ] [[package]] name = "typed-arena" version = "1.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a9b2228007eba4120145f785df0f6c92ea538f5a3635a612ecf4e334c8c1446d" [[package]] name = "typenum" version = "1.11.2" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6d2783fe2d6b8c1101136184eb41be8b1ad379e4657050b8aaff0c79ee7575f9" [[package]] name = "unicase" version = "2.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "50f37be617794602aabbeee0be4f259dc1778fabe05e2d67ee8f79326d5cb4f6" dependencies = [ - "version_check 0.9.1 (registry+https://github.com/rust-lang/crates.io-index)", + "version_check 0.9.1", ] [[package]] name = "unicode-bidi" version = "0.3.4" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "49f2bd0c6468a8230e1db229cff8029217cf623c767ea5d60bfbd42729ea54d5" dependencies = [ - "matches 0.1.8 (registry+https://github.com/rust-lang/crates.io-index)", + "matches", ] [[package]] name = "unicode-normalization" version = "0.1.12" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5479532badd04e128284890390c1e876ef7a993d0570b3597ae43dfa1d59afa4" dependencies = [ - "smallvec 1.1.0 (registry+https://github.com/rust-lang/crates.io-index)", + "smallvec 1.1.0", ] [[package]] name = "unicode-segmentation" version = "1.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e83e153d1053cbb5a118eeff7fd5be06ed99153f00dbcd8ae310c5fb2b22edc0" [[package]] name = "unicode-width" version = "0.1.7" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "caaa9d531767d1ff2150b9332433f32a24622147e5ebb1f26409d5da67afd479" [[package]] name = "unicode-xid" version = "0.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fc72304796d0818e357ead4e000d19c9c174ab23dc11093ac919054d20a6a7fc" [[package]] name = "unicode-xid" version = "0.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "826e7639553986605ec5979c7dd957c7895e93eabed50ab2ffa7f6128a75097c" [[package]] name = "url" version = "1.7.2" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dd4e7c0d531266369519a4aa4f399d748bd37043b00bde1e4ff1f60a120b355a" dependencies = [ - "idna 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)", - "matches 0.1.8 (registry+https://github.com/rust-lang/crates.io-index)", - "percent-encoding 1.0.1 (registry+https://github.com/rust-lang/crates.io-index)", + "idna 0.1.5", + "matches", + "percent-encoding 1.0.1", ] [[package]] name = "url" version = "2.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "829d4a8476c35c9bf0bbce5a3b23f4106f79728039b726d292bb93bc106787cb" dependencies = [ - "idna 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)", - "matches 0.1.8 (registry+https://github.com/rust-lang/crates.io-index)", - "percent-encoding 2.1.0 (registry+https://github.com/rust-lang/crates.io-index)", + "idna 0.2.0", + "matches", + "percent-encoding 2.1.0", ] [[package]] name = "utf-8" version = "0.7.5" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "05e42f7c18b8f902290b009cde6d651262f956c98bc51bca4cd1d511c9cd85c7" [[package]] name = "uuid" version = "0.7.4" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "90dbc611eb48397705a6b0f6e917da23ae517e4d127123d2cf7674206627d32a" dependencies = [ - "rand 0.6.5 (registry+https://github.com/rust-lang/crates.io-index)", + "rand 0.6.5", ] [[package]] name = "vcpkg" version = "0.2.8" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3fc439f2794e98976c88a2a2dafce96b930fe8010b0a256b3c2199a773933168" [[package]] name = "vec_map" version = "0.8.1" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "05c78687fb1a80548ae3250346c3db86a80a7cdd77bda190189f2d0a0987c81a" [[package]] name = "version_check" version = "0.1.5" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "914b1a6776c4c929a602fafd8bc742e06365d4bcbe48c30f9cca5824f70dc9dd" [[package]] name = "version_check" version = "0.9.1" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "078775d0255232fb988e6fccf26ddc9d1ac274299aaedcedce21c6f72cc533ce" [[package]] name = "void" version = "1.0.2" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6a02e4885ed3bc0f2de90ea6dd45ebcbb66dacffe03547fadbb0eeae2770887d" [[package]] name = "want" version = "0.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b6395efa4784b027708f7451087e647ec73cc74f5d9bc2e418404248d679a230" dependencies = [ - "futures 0.1.29 (registry+https://github.com/rust-lang/crates.io-index)", - "log 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)", - "try-lock 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)", + "futures", + "log", + "try-lock", ] [[package]] name = "wasi" version = "0.9.0+wasi-snapshot-preview1" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cccddf32554fecc6acb585f82a32a72e28b48f8c4c1883ddfeeeaa96f7d8e519" [[package]] name = "winapi" version = "0.2.8" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "167dc9d6949a9b857f3451275e911c3f44255842c1f7a76f33c55103a909087a" [[package]] name = "winapi" version = "0.3.8" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8093091eeb260906a183e6ae1abdba2ef5ef2257a21801128899c3fc699229c6" dependencies = [ - "winapi-i686-pc-windows-gnu 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)", - "winapi-x86_64-pc-windows-gnu 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)", + "winapi-i686-pc-windows-gnu", + "winapi-x86_64-pc-windows-gnu", ] [[package]] name = "winapi-build" version = "0.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2d315eee3b34aca4797b2da6b13ed88266e6d612562a0c46390af8299fc699bc" [[package]] name = "winapi-i686-pc-windows-gnu" version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6" [[package]] name = "winapi-util" version = "0.1.3" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4ccfbf554c6ad11084fb7517daca16cfdcaccbdadba4fc336f032a8b12c2ad80" dependencies = [ - "winapi 0.3.8 (registry+https://github.com/rust-lang/crates.io-index)", + "winapi 0.3.8", ] [[package]] name = "winapi-x86_64-pc-windows-gnu" version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" [[package]] name = "winreg" version = "0.6.2" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b2986deb581c4fe11b621998a5e53361efe6b48a151178d0cd9eeffa4dc6acc9" dependencies = [ - "winapi 0.3.8 (registry+https://github.com/rust-lang/crates.io-index)", + "winapi 0.3.8", ] [[package]] name = "ws2_32-sys" version = "0.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d59cefebd0c892fa2dd6de581e937301d8552cb44489cdff035c6187cb63fa5e" dependencies = [ - "winapi 0.2.8 (registry+https://github.com/rust-lang/crates.io-index)", - "winapi-build 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", + "winapi 0.2.8", + "winapi-build", ] [[package]] name = "xml-rs" version = "0.8.3" source = "registry+https://github.com/rust-lang/crates.io-index" - -[metadata] -"checksum adler32 1.0.4 (registry+https://github.com/rust-lang/crates.io-index)" = "5d2e7343e7fc9de883d1b0341e0b13970f764c14101234857d2ddafa1cb1cac2" -"checksum aho-corasick 0.7.6 (registry+https://github.com/rust-lang/crates.io-index)" = "58fb5e95d83b38284460a5fda7d6470aa0b8844d283a0b614b8535e880800d2d" -"checksum alga 0.9.2 (registry+https://github.com/rust-lang/crates.io-index)" = "658f9468113d34781f6ca9d014d174c74b73de870f1e0e3ad32079bbab253b19" -"checksum ansi_term 0.11.0 (registry+https://github.com/rust-lang/crates.io-index)" = "ee49baf6cb617b853aa8d93bf420db2383fab46d314482ca2803b40d5fde979b" -"checksum approx 0.3.2 (registry+https://github.com/rust-lang/crates.io-index)" = "f0e60b75072ecd4168020818c0107f2857bb6c4e64252d8d3983f6263b40a5c3" -"checksum arrayvec 0.5.1 (registry+https://github.com/rust-lang/crates.io-index)" = "cff77d8686867eceff3105329d4698d96c2391c176d5d03adc90c7389162b5b8" -"checksum atty 0.2.14 (registry+https://github.com/rust-lang/crates.io-index)" = "d9b39be18770d11421cdb1b9947a45dd3f37e93092cbf377614828a319d5fee8" -"checksum autocfg 0.1.7 (registry+https://github.com/rust-lang/crates.io-index)" = "1d49d90015b3c36167a20fe2810c5cd875ad504b39cff3d4eae7977e6b7c1cb2" -"checksum autocfg 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)" = "f8aac770f1885fd7e387acedd76065302551364496e46b3dd00860b2f8359b9d" -"checksum backtrace 0.3.42 (registry+https://github.com/rust-lang/crates.io-index)" = "b4b1549d804b6c73f4817df2ba073709e96e426f12987127c48e6745568c350b" -"checksum backtrace-sys 0.1.32 (registry+https://github.com/rust-lang/crates.io-index)" = "5d6575f128516de27e3ce99689419835fce9643a9b215a14d2b5b685be018491" -"checksum base64 0.10.1 (registry+https://github.com/rust-lang/crates.io-index)" = "0b25d992356d2eb0ed82172f5248873db5560c4721f564b13cb5193bda5e668e" -"checksum bitflags 1.2.1 (registry+https://github.com/rust-lang/crates.io-index)" = "cf1de2fe8c75bc145a2f577add951f8134889b4795d47466a54a5c846d691693" -"checksum block 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)" = "0d8c1fef690941d3e7788d328517591fecc684c084084702d6ff1641e993699a" -"checksum block-buffer 0.7.3 (registry+https://github.com/rust-lang/crates.io-index)" = "c0940dc441f31689269e10ac70eb1002a3a1d3ad1390e030043662eb7fe4688b" -"checksum block-padding 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)" = "fa79dedbb091f449f1f39e53edf88d5dbe95f895dae6135a8d7b881fb5af73f5" -"checksum boolinator 2.4.0 (registry+https://github.com/rust-lang/crates.io-index)" = "cfa8873f51c92e232f9bac4065cddef41b714152812bfc5f7672ba16d6ef8cd9" -"checksum byte-tools 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)" = "e3b5ca7a04898ad4bcd41c90c5285445ff5b791899bb1b0abdd2a2aa791211d7" -"checksum byteorder 1.3.2 (registry+https://github.com/rust-lang/crates.io-index)" = "a7c3dd8985a7111efc5c80b44e23ecdd8c007de8ade3b96595387e812b957cf5" -"checksum bytes 0.4.12 (registry+https://github.com/rust-lang/crates.io-index)" = "206fdffcfa2df7cbe15601ef46c813fce0965eb3286db6b56c583b814b51c81c" -"checksum c2-chacha 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)" = "214238caa1bf3a496ec3392968969cab8549f96ff30652c9e56885329315f6bb" -"checksum cairo-rs 0.7.1 (registry+https://github.com/rust-lang/crates.io-index)" = "e05db47de3b0f09a222fa4bba2eab957d920d4243962a86b2d77ab401e4a359c" -"checksum cairo-sys-rs 0.9.2 (registry+https://github.com/rust-lang/crates.io-index)" = "ff65ba02cac715be836f63429ab00a767d48336efc5497c5637afb53b4f14d63" -"checksum cc 1.0.50 (registry+https://github.com/rust-lang/crates.io-index)" = "95e28fa049fda1c330bcf9d723be7663a899c4679724b34c81e9f5a326aab8cd" -"checksum cfg-if 0.1.10 (registry+https://github.com/rust-lang/crates.io-index)" = "4785bdd1c96b2a846b2bd7cc02e86b6b3dbf14e7e53446c4f54c92a361040822" -"checksum clap 2.33.0 (registry+https://github.com/rust-lang/crates.io-index)" = "5067f5bb2d80ef5d68b4c87db81601f0b75bca627bc2ef76b141d7b846a3c6d9" -"checksum cloudabi 0.0.3 (registry+https://github.com/rust-lang/crates.io-index)" = "ddfc5b9aa5d4507acaf872de71051dfd0e309860e88966e1051e462a077aac4f" -"checksum codespan 0.2.1 (git+https://github.com/oberien/codespan?rev=dc7b13739165fc58721415ce3120d05cf117ca81)" = "" -"checksum codespan-reporting 0.2.1 (git+https://github.com/oberien/codespan?rev=dc7b13739165fc58721415ce3120d05cf117ca81)" = "" -"checksum cookie 0.12.0 (registry+https://github.com/rust-lang/crates.io-index)" = "888604f00b3db336d2af898ec3c1d5d0ddf5e6d462220f2ededc33a87ac4bbd5" -"checksum cookie_store 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)" = "46750b3f362965f197996c4448e4a0935e791bf7d6631bfce9ee0af3d24c919c" -"checksum core-foundation 0.6.4 (registry+https://github.com/rust-lang/crates.io-index)" = "25b9e03f145fd4f2bf705e07b900cd41fc636598fe5dc452fd0db1441c3f496d" -"checksum core-foundation-sys 0.6.2 (registry+https://github.com/rust-lang/crates.io-index)" = "e7ca8a5221364ef15ce201e8ed2f609fc312682a8f4e0e3d4aa5879764e0fa3b" -"checksum crc32fast 1.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "ba125de2af0df55319f41944744ad91c71113bf74a4646efff39afe1f6842db1" -"checksum crossbeam-deque 0.7.2 (registry+https://github.com/rust-lang/crates.io-index)" = "c3aa945d63861bfe624b55d153a39684da1e8c0bc8fba932f7ee3a3c16cea3ca" -"checksum crossbeam-epoch 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)" = "5064ebdbf05ce3cb95e45c8b086f72263f4166b29b97f6baff7ef7fe047b55ac" -"checksum crossbeam-queue 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)" = "7c979cd6cfe72335896575c6b5688da489e420d36a27a0b9eb0c73db574b4a4b" -"checksum crossbeam-queue 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)" = "c695eeca1e7173472a32221542ae469b3e9aac3a4fc81f7696bcad82029493db" -"checksum crossbeam-utils 0.6.6 (registry+https://github.com/rust-lang/crates.io-index)" = "04973fa96e96579258a5091af6003abde64af786b860f18622b82e026cca60e6" -"checksum crossbeam-utils 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)" = "ce446db02cdc3165b94ae73111e570793400d0794e46125cc4056c81cbb039f4" -"checksum cssparser 0.27.2 (registry+https://github.com/rust-lang/crates.io-index)" = "754b69d351cdc2d8ee09ae203db831e005560fc6030da058f86ad60c92a9cb0a" -"checksum cssparser-macros 0.6.0 (registry+https://github.com/rust-lang/crates.io-index)" = "dfae75de57f2b2e85e8768c3ea840fd159c8f33e2b6522c7835b7abac81be16e" -"checksum data-url 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "d33fe99ccedd6e84bc035f1931bb2e6be79739d6242bd895e7311c886c50dc9c" -"checksum derive_more 0.99.9 (registry+https://github.com/rust-lang/crates.io-index)" = "298998b1cf6b5b2c8a7b023dfd45821825ce3ba8a8af55c921a0e734e4653f76" -"checksum digest 0.8.1 (registry+https://github.com/rust-lang/crates.io-index)" = "f3d0c8c8752312f9713efd397ff63acb9f85585afbf179282e720e7704954dd5" -"checksum downcast-rs 1.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "52ba6eb47c2131e784a38b726eb54c1e1484904f013e576a25354d0124161af6" -"checksum dtoa 0.4.4 (registry+https://github.com/rust-lang/crates.io-index)" = "ea57b42383d091c85abcc2706240b94ab2a8fa1fc81c10ff23c4de06e2a90b5e" -"checksum dtoa-short 0.3.2 (registry+https://github.com/rust-lang/crates.io-index)" = "59020b8513b76630c49d918c33db9f4c91638e7d3404a28084083b87e33f76f2" -"checksum either 1.5.3 (registry+https://github.com/rust-lang/crates.io-index)" = "bb1f6b1ce1c140482ea30ddd3335fc0024ac7ee112895426e0a629a6c20adfe3" -"checksum encoding 0.2.33 (registry+https://github.com/rust-lang/crates.io-index)" = "6b0d943856b990d12d3b55b359144ff341533e516d94098b1d3fc1ac666d36ec" -"checksum encoding-index-japanese 1.20141219.5 (registry+https://github.com/rust-lang/crates.io-index)" = "04e8b2ff42e9a05335dbf8b5c6f7567e5591d0d916ccef4e0b1710d32a0d0c91" -"checksum encoding-index-korean 1.20141219.5 (registry+https://github.com/rust-lang/crates.io-index)" = "4dc33fb8e6bcba213fe2f14275f0963fd16f0a02c878e3095ecfdf5bee529d81" -"checksum encoding-index-simpchinese 1.20141219.5 (registry+https://github.com/rust-lang/crates.io-index)" = "d87a7194909b9118fc707194baa434a4e3b0fb6a5a757c73c3adb07aa25031f7" -"checksum encoding-index-singlebyte 1.20141219.5 (registry+https://github.com/rust-lang/crates.io-index)" = "3351d5acffb224af9ca265f435b859c7c01537c0849754d3db3fdf2bfe2ae84a" -"checksum encoding-index-tradchinese 1.20141219.5 (registry+https://github.com/rust-lang/crates.io-index)" = "fd0e20d5688ce3cab59eb3ef3a2083a5c77bf496cb798dc6fcdb75f323890c18" -"checksum encoding_index_tests 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)" = "a246d82be1c9d791c5dfde9a2bd045fc3cbba3fa2b11ad558f27d01712f00569" -"checksum encoding_rs 0.8.22 (registry+https://github.com/rust-lang/crates.io-index)" = "cd8d03faa7fe0c1431609dfad7bbe827af30f82e1e2ae6f7ee4fca6bd764bc28" -"checksum enum-kinds 0.4.1 (registry+https://github.com/rust-lang/crates.io-index)" = "d0f21c374dea848c19071b1504ca5ad03c9ad0d03d2e509e68f6623b8fcac4b5" -"checksum env_logger 0.5.13 (registry+https://github.com/rust-lang/crates.io-index)" = "15b0a4d2e39f8420210be8b27eeda28029729e2fd4291019455016c348240c38" -"checksum error-chain 0.12.1 (registry+https://github.com/rust-lang/crates.io-index)" = "3ab49e9dcb602294bc42f9a7dfc9bc6e936fca4418ea300dbfb84fe16de0b7d9" -"checksum failure 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)" = "f8273f13c977665c5db7eb2b99ae520952fe5ac831ae4cd09d80c4c7042b5ed9" -"checksum failure_derive 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)" = "0bc225b78e0391e4b8683440bf2e63c2deeeb2ce5189eab46e2b68c6d3725d08" -"checksum fake-simd 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)" = "e88a8acf291dafb59c2d96e8f59828f3838bb1a70398823ade51a84de6a6deed" -"checksum fixedbitset 0.1.9 (registry+https://github.com/rust-lang/crates.io-index)" = "86d4de0081402f5e88cdac65c8dcdcc73118c1a7a465e2a05f0da05843a8ea33" -"checksum flate2 1.0.13 (registry+https://github.com/rust-lang/crates.io-index)" = "6bd6d6f4752952feb71363cffc9ebac9411b75b87c6ab6058c40c8900cf43c0f" -"checksum float-cmp 0.5.3 (registry+https://github.com/rust-lang/crates.io-index)" = "75224bec9bfe1a65e2d34132933f2de7fe79900c96a0174307554244ece8150e" -"checksum fnv 1.0.6 (registry+https://github.com/rust-lang/crates.io-index)" = "2fad85553e09a6f881f739c29f0b00b0f01357c743266d478b68951ce23285f3" -"checksum foreign-types 0.3.2 (registry+https://github.com/rust-lang/crates.io-index)" = "f6f339eb8adc052cd2ca78910fda869aefa38d22d5cb648e6485e4d3fc06f3b1" -"checksum foreign-types-shared 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "00b0228411908ca8685dba7fc2cdd70ec9990a6e753e89b6ac91a84c40fbaf4b" -"checksum fragile 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)" = "05f8140122fa0d5dcb9fc8627cfce2b37cc1500f752636d46ea28bc26785c2f9" -"checksum fuchsia-cprng 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "a06f77d526c1a601b7c4cdd98f54b5eaabffc14d5f2f0296febdc7f357c6d3ba" -"checksum fuchsia-zircon 0.3.3 (registry+https://github.com/rust-lang/crates.io-index)" = "2e9763c69ebaae630ba35f74888db465e49e259ba1bc0eda7d06f4a067615d82" -"checksum fuchsia-zircon-sys 0.3.3 (registry+https://github.com/rust-lang/crates.io-index)" = "3dcaa9ae7725d12cdb85b3ad99a434db70b468c09ded17e012d86b5c1010f7a7" -"checksum futf 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)" = "7c9c1ce3fa9336301af935ab852c437817d14cd33690446569392e65170aac3b" -"checksum futures 0.1.29 (registry+https://github.com/rust-lang/crates.io-index)" = "1b980f2816d6ee8673b6517b52cb0e808a180efc92e5c19d02cdda79066703ef" -"checksum futures-cpupool 0.1.8 (registry+https://github.com/rust-lang/crates.io-index)" = "ab90cde24b3319636588d0c35fe03b1333857621051837ed769faefb4c2162e4" -"checksum fxhash 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)" = "c31b6d751ae2c7f11320402d34e41349dd1016f8d5d45e48c4312bc8625af50c" -"checksum gdk-pixbuf 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)" = "9726408ee1bbada83094326a99b9c68fea275f9dbb515de242a69e72051f4fcc" -"checksum gdk-pixbuf-sys 0.9.1 (registry+https://github.com/rust-lang/crates.io-index)" = "d8991b060a9e9161bafd09bf4a202e6fd404f5b4dd1a08d53a1e84256fb34ab0" -"checksum generic-array 0.12.3 (registry+https://github.com/rust-lang/crates.io-index)" = "c68f0274ae0e023facc3c97b2e00f076be70e254bc851d972503b328db79b2ec" -"checksum getopts 0.2.21 (registry+https://github.com/rust-lang/crates.io-index)" = "14dbbfd5c71d70241ecf9e6f13737f7b5ce823821063188d7e46c41d371eebd5" -"checksum getrandom 0.1.14 (registry+https://github.com/rust-lang/crates.io-index)" = "7abc8dd8451921606d809ba32e95b6111925cd2906060d2dcc29c070220503eb" -"checksum gio 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)" = "6261b5d34c30c2d59f879e643704cf54cb44731f3a2038000b68790c03e360e3" -"checksum gio-sys 0.9.1 (registry+https://github.com/rust-lang/crates.io-index)" = "4fad225242b9eae7ec8a063bb86974aca56885014672375e5775dc0ea3533911" -"checksum glib 0.8.2 (registry+https://github.com/rust-lang/crates.io-index)" = "be27232841baa43e0fd5ae003f7941925735b2f733a336dc75f07b9eff415e7b" -"checksum glib-sys 0.9.1 (registry+https://github.com/rust-lang/crates.io-index)" = "95856f3802f446c05feffa5e24859fe6a183a7cb849c8449afc35c86b1e316e2" -"checksum gobject-sys 0.9.1 (registry+https://github.com/rust-lang/crates.io-index)" = "31d1a804f62034eccf370006ccaef3708a71c31d561fee88564abe71177553d9" -"checksum h2 0.1.26 (registry+https://github.com/rust-lang/crates.io-index)" = "a5b34c246847f938a410a03c5458c7fee2274436675e76d8b903c08efc29c462" -"checksum heck 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)" = "20564e78d53d2bb135c343b3f47714a56af2061f1c928fdb541dc7b9fdd94205" -"checksum hermit-abi 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)" = "eff2656d88f158ce120947499e971d743c05dbcbed62e5bd2f38f1698bbc3772" -"checksum http 0.1.21 (registry+https://github.com/rust-lang/crates.io-index)" = "d6ccf5ede3a895d8856620237b2f02972c1bbc78d2965ad7fe8838d4a0ed41f0" -"checksum http-body 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "6741c859c1b2463a423a1dbce98d418e6c3c3fc720fb0d45528657320920292d" -"checksum httparse 1.3.4 (registry+https://github.com/rust-lang/crates.io-index)" = "cd179ae861f0c2e53da70d892f5f3029f9594be0c41dc5269cd371691b1dc2f9" -"checksum humantime 1.3.0 (registry+https://github.com/rust-lang/crates.io-index)" = "df004cfca50ef23c36850aaaa59ad52cc70d0e90243c3c7737a4dd32dc7a3c4f" -"checksum hyper 0.12.35 (registry+https://github.com/rust-lang/crates.io-index)" = "9dbe6ed1438e1f8ad955a4701e9a944938e9519f6888d12d8558b645e247d5f6" -"checksum hyper-tls 0.3.2 (registry+https://github.com/rust-lang/crates.io-index)" = "3a800d6aa50af4b5850b2b0f659625ce9504df908e9733b635720483be26174f" -"checksum idna 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)" = "38f09e0f0b1fb55fdee1f17470ad800da77af5186a1a76c026b679358b7e844e" -"checksum idna 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "02e2673c30ee86b5b96a9cb52ad15718aa1f966f5ab9ad54a8b95d5ca33120a9" -"checksum indexmap 1.3.1 (registry+https://github.com/rust-lang/crates.io-index)" = "0b54058f0a6ff80b6803da8faf8997cde53872b38f4023728f6830b06cd3c0dc" -"checksum iovec 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)" = "b2b3ea6ff95e175473f8ffe6a7eb7c00d054240321b84c57051175fe3c1e075e" -"checksum isolang 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)" = "9e5855a5a1ba5957e064977b94e5cd15ecbe83904a5191576be11615186cd868" -"checksum itertools 0.8.2 (registry+https://github.com/rust-lang/crates.io-index)" = "f56a2d0bc861f9165be4eb3442afd3c236d8a98afd426f65d92324ae1091a484" -"checksum itertools 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)" = "284f18f85651fe11e8a991b2adb42cb078325c996ed026d994719efcfca1d54b" -"checksum itoa 0.4.5 (registry+https://github.com/rust-lang/crates.io-index)" = "b8b7a7c0c47db5545ed3fef7468ee7bb5b74691498139e4b3f6a20685dc6dd8e" -"checksum kernel32-sys 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)" = "7507624b29483431c0ba2d82aece8ca6cdba9382bff4ddd0f7490560c056098d" -"checksum language-tags 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)" = "a91d884b6667cd606bb5a69aa0c99ba811a115fc68915e7056ec08a46e93199a" -"checksum lazy_static 1.4.0 (registry+https://github.com/rust-lang/crates.io-index)" = "e2abad23fbc42b3700f2f279844dc832adb2b2eb069b2df918f455c4e18cc646" -"checksum lexical 5.0.0 (registry+https://github.com/rust-lang/crates.io-index)" = "dd84e95495f8eddaaa1ad1542e9810a3f0139f18fb985c960e9c74dc5dcf4498" -"checksum lexical-core 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)" = "41aae02f4cbf67c1f57e1a1fa5418db722b5c9fa4a2c47b44d53d6c31cbe040a" -"checksum libc 0.2.66 (registry+https://github.com/rust-lang/crates.io-index)" = "d515b1f41455adea1313a4a2ac8a8a477634fbae63cc6100e3aebb207ce61558" -"checksum libm 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)" = "7fc7aa29613bd6a620df431842069224d8bc9011086b1db4c0e0cd47fa03ec9a" -"checksum librsvg 2.47.2 (git+https://gitlab.gnome.org/GNOME/librsvg?rev=6ecab568)" = "" -"checksum locale_config 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)" = "08d2c35b16f4483f6c26f0e4e9550717a2f6575bcd6f12a53ff0c490a94a6934" -"checksum lock_api 0.3.3 (registry+https://github.com/rust-lang/crates.io-index)" = "79b2de95ecb4691949fea4716ca53cdbcfccb2c612e19644a8bad05edcf9f47b" -"checksum log 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)" = "14b6052be84e6b71ab17edffc2eeabf5c2c3ae1fdb464aae35ac50c67a44e1f7" -"checksum mac 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "c41e0c4fef86961ac6d6f8a82609f55f31b05e4fce149ac5710e439df7619ba4" -"checksum malloc_buf 0.0.6 (registry+https://github.com/rust-lang/crates.io-index)" = "62bb907fe88d54d8d9ce32a3cceab4218ed2f6b7d35617cafe9adf84e43919cb" -"checksum markup5ever 0.10.0 (registry+https://github.com/rust-lang/crates.io-index)" = "aae38d669396ca9b707bfc3db254bc382ddb94f57cc5c235f34623a669a01dab" -"checksum matches 0.1.8 (registry+https://github.com/rust-lang/crates.io-index)" = "7ffc5c5338469d4d3ea17d269fa8ea3512ad247247c30bd2df69e68309ed0a08" -"checksum matrixmultiply 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)" = "d4f7ec66360130972f34830bfad9ef05c6610a43938a467bcc9ab9369ab3478f" -"checksum maybe-uninit 2.0.0 (registry+https://github.com/rust-lang/crates.io-index)" = "60302e4db3a61da70c0cb7991976248362f30319e88850c487b9b95bbf059e00" -"checksum memchr 2.3.0 (registry+https://github.com/rust-lang/crates.io-index)" = "3197e20c7edb283f87c071ddfc7a2cca8f8e0b888c242959846a6fce03c72223" -"checksum memoffset 0.5.3 (registry+https://github.com/rust-lang/crates.io-index)" = "75189eb85871ea5c2e2c15abbdd541185f63b408415e5051f5cac122d8c774b9" -"checksum mime 0.3.16 (registry+https://github.com/rust-lang/crates.io-index)" = "2a60c7ce501c71e03a9c9c0d35b861413ae925bd979cc7a4e30d060069aaac8d" -"checksum mime_guess 2.0.1 (registry+https://github.com/rust-lang/crates.io-index)" = "1a0ed03949aef72dbdf3116a383d7b38b4768e6f960528cd6a6044aa9ed68599" -"checksum miniz_oxide 0.3.5 (registry+https://github.com/rust-lang/crates.io-index)" = "6f3f74f726ae935c3f514300cc6773a0c9492abc5e972d42ba0c0ebb88757625" -"checksum mio 0.6.21 (registry+https://github.com/rust-lang/crates.io-index)" = "302dec22bcf6bae6dfb69c647187f4b4d0fb6f535521f7bc022430ce8e12008f" -"checksum miow 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)" = "8c1f2f3b1cf331de6896aabf6e9d55dca90356cc9960cca7eaaf408a355ae919" -"checksum nalgebra 0.18.1 (registry+https://github.com/rust-lang/crates.io-index)" = "aaa9fddbc34c8c35dd2108515587b8ce0cab396f17977b8c738568e4edb521a2" -"checksum native-tls 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)" = "4b2df1a4c22fd44a62147fd8f13dd0f95c9d8ca7b2610299b2a2f9cf8964274e" -"checksum ncollide2d 0.19.2 (registry+https://github.com/rust-lang/crates.io-index)" = "fd7791f03728b7fa45bd18af5adcb6f162a05e10853f273133547e9e12fa1910" -"checksum net2 0.2.33 (registry+https://github.com/rust-lang/crates.io-index)" = "42550d9fb7b6684a6d404d9fa7250c2eb2646df731d1c06afc06dcee9e1bcf88" -"checksum new_debug_unreachable 1.0.4 (registry+https://github.com/rust-lang/crates.io-index)" = "e4a24736216ec316047a1fc4252e27dabb04218aa4a3f37c6e7ddbf1f9782b54" -"checksum nodrop 0.1.14 (registry+https://github.com/rust-lang/crates.io-index)" = "72ef4a56884ca558e5ddb05a1d1e7e1bfd9a68d9ed024c21704cc98872dae1bb" -"checksum num-complex 0.2.4 (registry+https://github.com/rust-lang/crates.io-index)" = "b6b19411a9719e753aff12e5187b74d60d3dc449ec3f4dc21e3989c3f554bc95" -"checksum num-integer 0.1.42 (registry+https://github.com/rust-lang/crates.io-index)" = "3f6ea62e9d81a77cd3ee9a2a5b9b609447857f3d358704331e4ef39eb247fcba" -"checksum num-rational 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)" = "da4dc79f9e6c81bef96148c8f6b8e72ad4541caa4a24373e900a36da07de03a3" -"checksum num-traits 0.2.11 (registry+https://github.com/rust-lang/crates.io-index)" = "c62be47e61d1842b9170f0fdeec8eba98e60e90e5446449a0545e5152acd7096" -"checksum num_cpus 1.12.0 (registry+https://github.com/rust-lang/crates.io-index)" = "46203554f085ff89c235cd12f7075f3233af9b11ed7c9e16dfe2560d03313ce6" -"checksum objc 0.2.7 (registry+https://github.com/rust-lang/crates.io-index)" = "915b1b472bc21c53464d6c8461c9d3af805ba1ef837e1cac254428f4a77177b1" -"checksum objc-foundation 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "1add1b659e36c9607c7aab864a76c7a4c2760cd0cd2e120f3fb8b952c7e22bf9" -"checksum objc_id 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "c92d4ddb4bd7b50d730c215ff871754d0da6b2178849f8a2a2ab69712d0c073b" -"checksum once_cell 1.4.0 (registry+https://github.com/rust-lang/crates.io-index)" = "0b631f7e854af39a1739f401cf34a8a013dfe09eac4fa4dba91e9768bd28168d" -"checksum opaque-debug 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)" = "2839e79665f131bdb5782e51f2c6c9599c133c6098982a54c794358bf432529c" -"checksum openssl 0.10.26 (registry+https://github.com/rust-lang/crates.io-index)" = "3a3cc5799d98e1088141b8e01ff760112bbd9f19d850c124500566ca6901a585" -"checksum openssl-probe 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)" = "77af24da69f9d9341038eba93a073b1fdaaa1b788221b00a69bce9e762cb32de" -"checksum openssl-sys 0.9.53 (registry+https://github.com/rust-lang/crates.io-index)" = "465d16ae7fc0e313318f7de5cecf57b2fbe7511fd213978b457e1c96ff46736f" -"checksum ordermap 0.3.5 (registry+https://github.com/rust-lang/crates.io-index)" = "a86ed3f5f244b372d6b1a00b72ef7f8876d0bc6a78a4c9985c53614041512063" -"checksum pango 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)" = "393fa071b144f8ffb83ede273758983cf414ca3c0b1d2a5a9ce325b3ba3dd786" -"checksum pango-sys 0.9.1 (registry+https://github.com/rust-lang/crates.io-index)" = "86b93d84907b3cf0819bff8f13598ba72843bee579d5ebc2502e4b0367b4be7d" -"checksum pangocairo 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)" = "7486695787f206924b662cb8ca7b3c987fdbbff4ccff3612017cf471aee65162" -"checksum pangocairo-sys 0.10.1 (registry+https://github.com/rust-lang/crates.io-index)" = "a3921b31ab776b23e28c8f6e474dda52fdc28bc2689101caeb362ba976719efe" -"checksum parking_lot 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)" = "f842b1982eb6c2fe34036a4fbfb06dd185a3f5c8edfaacdf7d1ea10b07de6252" -"checksum parking_lot_core 0.6.2 (registry+https://github.com/rust-lang/crates.io-index)" = "b876b1b9e7ac6e1a74a6da34d25c42e17e8862aa409cbbbdcfc8d86c6f3bc62b" -"checksum percent-encoding 1.0.1 (registry+https://github.com/rust-lang/crates.io-index)" = "31010dd2e1ac33d5b46a5b413495239882813e0369f8ed8a5e266f173602f831" -"checksum percent-encoding 2.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "d4fd5641d01c8f18a23da7b6fe29298ff4b55afcccdf78973b24cf3175fee32e" -"checksum petgraph 0.4.13 (registry+https://github.com/rust-lang/crates.io-index)" = "9c3659d1ee90221741f65dd128d9998311b0e40c5d3c23a62445938214abce4f" -"checksum phf 0.7.24 (registry+https://github.com/rust-lang/crates.io-index)" = "b3da44b85f8e8dfaec21adae67f95d93244b2ecf6ad2a692320598dcc8e6dd18" -"checksum phf 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)" = "3dfb61232e34fcb633f43d12c58f83c1df82962dcdfa565a4e866ffc17dafe12" -"checksum phf_codegen 0.7.24 (registry+https://github.com/rust-lang/crates.io-index)" = "b03e85129e324ad4166b06b2c7491ae27fe3ec353af72e72cd1654c7225d517e" -"checksum phf_codegen 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)" = "cbffee61585b0411840d3ece935cce9cb6321f01c45477d30066498cd5e1a815" -"checksum phf_generator 0.7.24 (registry+https://github.com/rust-lang/crates.io-index)" = "09364cc93c159b8b06b1f4dd8a4398984503483891b0c26b867cf431fb132662" -"checksum phf_generator 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)" = "17367f0cc86f2d25802b2c26ee58a7b23faeccf78a396094c13dced0d0182526" -"checksum phf_macros 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)" = "7f6fde18ff429ffc8fe78e2bf7f8b7a5a5a6e2a8b58bc5a9ac69198bbda9189c" -"checksum phf_shared 0.7.24 (registry+https://github.com/rust-lang/crates.io-index)" = "234f71a15de2288bcb7e3b6515828d22af7ec8598ee6d24c3b526fa0a80b67a0" -"checksum phf_shared 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)" = "c00cf8b9eafe68dde5e9eaa2cef8ee84a9336a47d566ec55ca16589633b65af7" -"checksum pkg-config 0.3.17 (registry+https://github.com/rust-lang/crates.io-index)" = "05da548ad6865900e60eaba7f589cc0783590a92e940c26953ff81ddbab2d677" -"checksum pom 3.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "ef5cf7f52c12da93c26b63ee0d9f012bc82fb071851c546c030dc6ecb5f2994b" -"checksum ppv-lite86 0.2.6 (registry+https://github.com/rust-lang/crates.io-index)" = "74490b50b9fbe561ac330df47c08f3f33073d2d00c150f719147d7c54522fa1b" -"checksum precomputed-hash 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "925383efa346730478fb4838dbe9137d2a47675ad789c546d150a6e1dd4ab31c" -"checksum proc-macro-hack 0.5.16 (registry+https://github.com/rust-lang/crates.io-index)" = "7e0456befd48169b9f13ef0f0ad46d492cf9d2dbb918bcf38e01eed4ce3ec5e4" -"checksum proc-macro2 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)" = "cd07deb3c6d1d9ff827999c7f9b04cdfd66b1b17ae508e14fe47b620f2282ae0" -"checksum proc-macro2 0.4.30 (registry+https://github.com/rust-lang/crates.io-index)" = "cf3d2011ab5c909338f7887f4fc896d35932e29146c12c8d01da6b22a80ba759" -"checksum proc-macro2 1.0.8 (registry+https://github.com/rust-lang/crates.io-index)" = "3acb317c6ff86a4e579dfa00fc5e6cca91ecbb4e7eb2df0468805b674eb88548" -"checksum publicsuffix 1.5.4 (registry+https://github.com/rust-lang/crates.io-index)" = "3bbaa49075179162b49acac1c6aa45fb4dafb5f13cf6794276d77bc7fd95757b" -"checksum pulldown-cmark 0.4.1 (registry+https://github.com/rust-lang/crates.io-index)" = "d1b74cc784b038a9921fd1a48310cc2e238101aa8ae0b94201e2d85121dd68b5" -"checksum quick-error 1.2.3 (registry+https://github.com/rust-lang/crates.io-index)" = "a1d01941d82fa2ab50be1e79e6714289dd7cde78eba4c074bc5a4374f650dfe0" -"checksum quote 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)" = "1eca14c727ad12702eb4b6bfb5a232287dcf8385cb8ca83a3eeaf6519c44c408" -"checksum quote 0.6.13 (registry+https://github.com/rust-lang/crates.io-index)" = "6ce23b6b870e8f94f81fb0a363d65d86675884b34a09043c81e5562f11c1f8e1" -"checksum quote 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)" = "053a8c8bcc71fcce321828dc897a98ab9760bef03a4fc36693c231e5b3216cfe" -"checksum quoted-string 0.6.1 (registry+https://github.com/rust-lang/crates.io-index)" = "5a206a30ce37189d1340e7da2ee0b4d65e342590af676541c23a4f3959ba272e" -"checksum rand 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)" = "552840b97013b1a26992c11eac34bdd778e464601a4c2054b5f0bff7c6761293" -"checksum rand 0.6.5 (registry+https://github.com/rust-lang/crates.io-index)" = "6d71dacdc3c88c1fde3885a3be3fbab9f35724e6ce99467f7d9c5026132184ca" -"checksum rand 0.7.3 (registry+https://github.com/rust-lang/crates.io-index)" = "6a6b1679d49b24bbfe0c803429aa1874472f50d9b363131f0e89fc356b544d03" -"checksum rand_chacha 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "556d3a1ca6600bfcbab7c7c91ccb085ac7fbbcd70e008a98742e7847f4f7bcef" -"checksum rand_chacha 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)" = "03a2a90da8c7523f554344f921aa97283eadf6ac484a6d2a7d0212fa7f8d6853" -"checksum rand_core 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)" = "7a6fdeb83b075e8266dcc8762c22776f6877a63111121f5f8c7411e5be7eed4b" -"checksum rand_core 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)" = "9c33a3c44ca05fa6f1807d8e6743f3824e8509beca625669633be0acbdf509dc" -"checksum rand_core 0.5.1 (registry+https://github.com/rust-lang/crates.io-index)" = "90bde5296fc891b0cef12a6d03ddccc162ce7b2aff54160af9338f8d40df6d19" -"checksum rand_hc 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "7b40677c7be09ae76218dc623efbf7b18e34bced3f38883af07bb75630a21bc4" -"checksum rand_hc 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "ca3129af7b92a17112d59ad498c6f81eaf463253766b90396d39ea7a39d6613c" -"checksum rand_isaac 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "ded997c9d5f13925be2a6fd7e66bf1872597f759fd9dd93513dd7e92e5a5ee08" -"checksum rand_jitter 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)" = "1166d5c91dc97b88d1decc3285bb0a99ed84b05cfd0bc2341bdf2d43fc41e39b" -"checksum rand_os 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)" = "7b75f676a1e053fc562eafbb47838d67c84801e38fc1ba459e8f180deabd5071" -"checksum rand_pcg 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)" = "abf9b09b01790cfe0364f52bf32995ea3c39f4d2dd011eac241d2914146d0b44" -"checksum rand_pcg 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)" = "16abd0c1b639e9eb4d7c50c0b8100b0d0f849be2349829c740fe8e6eb4816429" -"checksum rand_xorshift 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "cbf7e9e623549b0e21f6e97cf8ecf247c1a8fd2e8a992ae265314300b2455d5c" -"checksum rawpointer 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)" = "60a357793950651c4ed0f3f52338f53b2f809f32d83a07f72909fa13e4c6c1e3" -"checksum rayon 1.3.0 (registry+https://github.com/rust-lang/crates.io-index)" = "db6ce3297f9c85e16621bb8cca38a06779ffc31bb8184e1be4bed2be4678a098" -"checksum rayon-core 1.7.0 (registry+https://github.com/rust-lang/crates.io-index)" = "08a89b46efaf957e52b18062fb2f4660f8b8a4dde1807ca002690868ef2c85a9" -"checksum rctree 0.3.3 (registry+https://github.com/rust-lang/crates.io-index)" = "be9e29cb19c8fe84169fcb07f8f11e66bc9e6e0280efd4715c54818296f8a4a8" -"checksum rdrand 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)" = "678054eb77286b51581ba43620cc911abf02758c91f93f479767aed0f90458b2" -"checksum redox_syscall 0.1.56 (registry+https://github.com/rust-lang/crates.io-index)" = "2439c63f3f6139d1b57529d16bc3b8bb855230c8efcc5d3a896c8bea7c3b1e84" -"checksum regex 1.3.3 (registry+https://github.com/rust-lang/crates.io-index)" = "b5508c1941e4e7cb19965abef075d35a9a8b5cdf0846f30b4050e9b55dc55e87" -"checksum regex-syntax 0.6.13 (registry+https://github.com/rust-lang/crates.io-index)" = "e734e891f5b408a29efbf8309e656876276f49ab6a6ac208600b4419bd893d90" -"checksum remove_dir_all 0.5.2 (registry+https://github.com/rust-lang/crates.io-index)" = "4a83fa3702a688b9359eccba92d153ac33fd2e8462f9e0e3fdf155239ea7792e" -"checksum reqwest 0.9.24 (registry+https://github.com/rust-lang/crates.io-index)" = "f88643aea3c1343c804950d7bf983bd2067f5ab59db6d613a08e05572f2714ab" -"checksum rsvg_internals 0.0.1 (git+https://gitlab.gnome.org/GNOME/librsvg?rev=6ecab568)" = "" -"checksum rustc-demangle 0.1.16 (registry+https://github.com/rust-lang/crates.io-index)" = "4c691c0e608126e00913e33f0ccf3727d5fc84573623b8d65b2df340b5201783" -"checksum rustc_version 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)" = "138e3e0acb6c9fb258b19b67cb8abd63c00679d2851805ea151465464fe9030a" -"checksum ryu 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)" = "bfa8506c1de11c9c4e4c38863ccbe02a305c8188e85a05a784c9e11e1c3910c8" -"checksum sauron 0.24.0 (registry+https://github.com/rust-lang/crates.io-index)" = "2ac3055fbee8a35ca88282102f4d58a50b2465d52689b6fe06ae387c2c1525b6" -"checksum sauron_vdom 0.24.0 (registry+https://github.com/rust-lang/crates.io-index)" = "65977ca10d0b763d57f2c586199d368dcd6bd422d0ad1ca43e3a20734a8adb7e" -"checksum schannel 0.1.16 (registry+https://github.com/rust-lang/crates.io-index)" = "87f550b06b6cba9c8b8be3ee73f391990116bf527450d2556e9b9ce263b9a021" -"checksum scopeguard 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)" = "b42e15e59b18a828bbf5c58ea01debb36b9b096346de35d941dcb89009f24a0d" -"checksum security-framework 0.3.4 (registry+https://github.com/rust-lang/crates.io-index)" = "8ef2429d7cefe5fd28bd1d2ed41c944547d4ff84776f5935b456da44593a16df" -"checksum security-framework-sys 0.3.3 (registry+https://github.com/rust-lang/crates.io-index)" = "e31493fc37615debb8c5090a7aeb4a9730bc61e77ab10b9af59f1a202284f895" -"checksum selectors 0.22.0 (registry+https://github.com/rust-lang/crates.io-index)" = "df320f1889ac4ba6bc0cdc9c9af7af4bd64bb927bccdf32d81140dc1f9be12fe" -"checksum semver 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)" = "1d7eb9ef2c18661902cc47e535f9bc51b78acd254da71d375c2f6720d9a40403" -"checksum semver-parser 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)" = "388a1df253eca08550bef6c72392cfe7c30914bf41df5269b68cbd6ff8f570a3" -"checksum serde 1.0.104 (registry+https://github.com/rust-lang/crates.io-index)" = "414115f25f818d7dfccec8ee535d76949ae78584fc4f79a6f45a904bf8ab4449" -"checksum serde_derive 1.0.104 (registry+https://github.com/rust-lang/crates.io-index)" = "128f9e303a5a29922045a830221b8f78ec74a5f544944f3d5984f8ec3895ef64" -"checksum serde_json 1.0.45 (registry+https://github.com/rust-lang/crates.io-index)" = "eab8f15f15d6c41a154c1b128a22f2dfabe350ef53c40953d84e36155c91192b" -"checksum serde_urlencoded 0.5.5 (registry+https://github.com/rust-lang/crates.io-index)" = "642dd69105886af2efd227f75a520ec9b44a820d65bc133a9131f7d229fd165a" -"checksum servo_arc 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "d98238b800e0d1576d8b6e3de32827c2d74bee68bb97748dcf5071fb53965432" -"checksum sha2 0.8.1 (registry+https://github.com/rust-lang/crates.io-index)" = "27044adfd2e1f077f649f59deb9490d3941d674002f7d062870a60ebe9bd47a0" -"checksum single 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)" = "bd5add732a1ab689845591a1b50339cf5310b563e08dc5813c65991f30369ea2" -"checksum siphasher 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)" = "0b8de496cf83d4ed58b6be86c3a275b8602f6ffe98d3024a869e124147a9a3ac" -"checksum siphasher 0.3.3 (registry+https://github.com/rust-lang/crates.io-index)" = "fa8f3741c7372e75519bd9346068370c9cdaabcc1f9599cbcf2a2719352286b7" -"checksum slab 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)" = "c111b5bd5695e56cffe5129854aa230b39c93a305372fdbb2668ca2394eea9f8" -"checksum smallvec 0.6.13 (registry+https://github.com/rust-lang/crates.io-index)" = "f7b0758c52e15a8b5e3691eae6cc559f08eee9406e548a4477ba4e67770a82b6" -"checksum smallvec 1.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "44e59e0c9fa00817912ae6e4e6e3c4fe04455e75699d06eedc7d85917ed8e8f4" -"checksum stable_deref_trait 1.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "dba1a27d3efae4351c8051072d619e3ade2820635c3958d826bfea39d59b54c8" -"checksum static_assertions 1.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "a2eb9349b6444b326872e140eb1cf5e7c522154d69e7a0ffb0fb81c06b37543f" -"checksum str-concat 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "3468939e48401c4fe3cdf5e5cef50951c2808ed549d1467fde249f1fcb602634" -"checksum string 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)" = "d24114bfcceb867ca7f71a0d3fe45d45619ec47a6fbfa98cb14e14250bfa5d6d" -"checksum string_cache 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)" = "2940c75beb4e3bf3a494cef919a747a2cb81e52571e212bfbd185074add7208a" -"checksum string_cache_codegen 0.5.1 (registry+https://github.com/rust-lang/crates.io-index)" = "f24c8e5e19d22a726626f1a5e16fe15b132dcf21d10177fa5a45ce7962996b97" -"checksum strsim 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)" = "8ea5119cdb4c55b55d432abb513a0429384878c15dde60cc77b1c99de1a95a6a" -"checksum structopt 0.2.18 (registry+https://github.com/rust-lang/crates.io-index)" = "16c2cdbf9cc375f15d1b4141bc48aeef444806655cd0e904207edc8d68d86ed7" -"checksum structopt-derive 0.2.18 (registry+https://github.com/rust-lang/crates.io-index)" = "53010261a84b37689f9ed7d395165029f9cc7abb9f56bbfe86bee2597ed25107" -"checksum strum 0.11.0 (registry+https://github.com/rust-lang/crates.io-index)" = "f6c3a2071519ab6a48f465808c4c1ffdd00dfc8e93111d02b4fc5abab177676e" -"checksum strum_macros 0.11.0 (registry+https://github.com/rust-lang/crates.io-index)" = "8baacebd7b7c9b864d83a6ba7a246232983e277b86fa5cdec77f565715a4b136" -"checksum svgbob 0.5.0-alpha.5 (registry+https://github.com/rust-lang/crates.io-index)" = "44bfc246633d2bbfaec823f5278edc631bbcb06ab25055589466d69ba2803bb4" -"checksum syn 0.12.15 (registry+https://github.com/rust-lang/crates.io-index)" = "c97c05b8ebc34ddd6b967994d5c6e9852fa92f8b82b3858c39451f97346dcce5" -"checksum syn 0.15.44 (registry+https://github.com/rust-lang/crates.io-index)" = "9ca4b3b69a77cbe1ffc9e198781b7acb0c7365a883670e8f1c1bc66fba79a5c5" -"checksum syn 1.0.14 (registry+https://github.com/rust-lang/crates.io-index)" = "af6f3550d8dff9ef7dc34d384ac6f107e5d31c8f57d9f28e0081503f547ac8f5" -"checksum synstructure 0.12.3 (registry+https://github.com/rust-lang/crates.io-index)" = "67656ea1dc1b41b1451851562ea232ec2e5a80242139f7e679ceccfb5d61f545" -"checksum tempdir 0.3.7 (registry+https://github.com/rust-lang/crates.io-index)" = "15f2b5fb00ccdf689e0149d1b1b3c03fead81c2b37735d812fa8bddbbf41b6d8" -"checksum tempfile 3.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "7a6e24d9338a0a5be79593e2fa15a648add6138caa803e2d5bc782c371732ca9" -"checksum tendril 0.4.1 (registry+https://github.com/rust-lang/crates.io-index)" = "707feda9f2582d5d680d733e38755547a3e8fb471e7ba11452ecfd9ce93a5d3b" -"checksum termcolor 1.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "bb6bfa289a4d7c5766392812c0a1f4c1ba45afa1ad47803c11e1f407d846d75f" -"checksum textwrap 0.11.0 (registry+https://github.com/rust-lang/crates.io-index)" = "d326610f408c7a4eb6f51c37c330e496b08506c9457c9d34287ecc38809fb060" -"checksum thin-slice 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "8eaa81235c7058867fa8c0e7314f33dcce9c215f535d1913822a2b3f5e289f3c" -"checksum thiserror 1.0.15 (registry+https://github.com/rust-lang/crates.io-index)" = "54b3d3d2ff68104100ab257bb6bb0cb26c901abe4bd4ba15961f3bf867924012" -"checksum thiserror-impl 1.0.15 (registry+https://github.com/rust-lang/crates.io-index)" = "ca972988113b7715266f91250ddb98070d033c62a011fa0fcc57434a649310dd" -"checksum thread_local 1.0.1 (registry+https://github.com/rust-lang/crates.io-index)" = "d40c6d1b69745a6ec6fb1ca717914848da4b44ae29d9b3080cbee91d72a69b14" -"checksum time 0.1.42 (registry+https://github.com/rust-lang/crates.io-index)" = "db8dcfca086c1143c9270ac42a2bbd8a7ee477b78ac8e45b19abfb0cbede4b6f" -"checksum tokio 0.1.22 (registry+https://github.com/rust-lang/crates.io-index)" = "5a09c0b5bb588872ab2f09afa13ee6e9dac11e10a0ec9e8e3ba39a5a5d530af6" -"checksum tokio-buf 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "8fb220f46c53859a4b7ec083e41dec9778ff0b1851c0942b211edb89e0ccdc46" -"checksum tokio-current-thread 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)" = "d16217cad7f1b840c5a97dfb3c43b0c871fef423a6e8d2118c604e843662a443" -"checksum tokio-executor 0.1.9 (registry+https://github.com/rust-lang/crates.io-index)" = "ca6df436c42b0c3330a82d855d2ef017cd793090ad550a6bc2184f4b933532ab" -"checksum tokio-io 0.1.12 (registry+https://github.com/rust-lang/crates.io-index)" = "5090db468dad16e1a7a54c8c67280c5e4b544f3d3e018f0b913b400261f85926" -"checksum tokio-reactor 0.1.11 (registry+https://github.com/rust-lang/crates.io-index)" = "6732fe6b53c8d11178dcb77ac6d9682af27fc6d4cb87789449152e5377377146" -"checksum tokio-sync 0.1.7 (registry+https://github.com/rust-lang/crates.io-index)" = "d06554cce1ae4a50f42fba8023918afa931413aded705b560e29600ccf7c6d76" -"checksum tokio-tcp 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)" = "1d14b10654be682ac43efee27401d792507e30fd8d26389e1da3b185de2e4119" -"checksum tokio-threadpool 0.1.17 (registry+https://github.com/rust-lang/crates.io-index)" = "f0c32ffea4827978e9aa392d2f743d973c1dfa3730a2ed3f22ce1e6984da848c" -"checksum tokio-timer 0.2.12 (registry+https://github.com/rust-lang/crates.io-index)" = "1739638e364e558128461fc1ad84d997702c8e31c2e6b18fb99842268199e827" -"checksum toml 0.5.6 (registry+https://github.com/rust-lang/crates.io-index)" = "ffc92d160b1eef40665be3a05630d003936a3bc7da7421277846c2613e92c71a" -"checksum try-lock 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)" = "e604eb7b43c06650e854be16a2a03155743d3752dd1c943f6829e26b7a36e382" -"checksum try_from 0.3.2 (registry+https://github.com/rust-lang/crates.io-index)" = "283d3b89e1368717881a9d51dad843cc435380d8109c9e47d38780a324698d8b" -"checksum typed-arena 1.7.0 (registry+https://github.com/rust-lang/crates.io-index)" = "a9b2228007eba4120145f785df0f6c92ea538f5a3635a612ecf4e334c8c1446d" -"checksum typenum 1.11.2 (registry+https://github.com/rust-lang/crates.io-index)" = "6d2783fe2d6b8c1101136184eb41be8b1ad379e4657050b8aaff0c79ee7575f9" -"checksum unicase 2.6.0 (registry+https://github.com/rust-lang/crates.io-index)" = "50f37be617794602aabbeee0be4f259dc1778fabe05e2d67ee8f79326d5cb4f6" -"checksum unicode-bidi 0.3.4 (registry+https://github.com/rust-lang/crates.io-index)" = "49f2bd0c6468a8230e1db229cff8029217cf623c767ea5d60bfbd42729ea54d5" -"checksum unicode-normalization 0.1.12 (registry+https://github.com/rust-lang/crates.io-index)" = "5479532badd04e128284890390c1e876ef7a993d0570b3597ae43dfa1d59afa4" -"checksum unicode-segmentation 1.6.0 (registry+https://github.com/rust-lang/crates.io-index)" = "e83e153d1053cbb5a118eeff7fd5be06ed99153f00dbcd8ae310c5fb2b22edc0" -"checksum unicode-width 0.1.7 (registry+https://github.com/rust-lang/crates.io-index)" = "caaa9d531767d1ff2150b9332433f32a24622147e5ebb1f26409d5da67afd479" -"checksum unicode-xid 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "fc72304796d0818e357ead4e000d19c9c174ab23dc11093ac919054d20a6a7fc" -"checksum unicode-xid 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "826e7639553986605ec5979c7dd957c7895e93eabed50ab2ffa7f6128a75097c" -"checksum url 1.7.2 (registry+https://github.com/rust-lang/crates.io-index)" = "dd4e7c0d531266369519a4aa4f399d748bd37043b00bde1e4ff1f60a120b355a" -"checksum url 2.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "829d4a8476c35c9bf0bbce5a3b23f4106f79728039b726d292bb93bc106787cb" -"checksum utf-8 0.7.5 (registry+https://github.com/rust-lang/crates.io-index)" = "05e42f7c18b8f902290b009cde6d651262f956c98bc51bca4cd1d511c9cd85c7" -"checksum uuid 0.7.4 (registry+https://github.com/rust-lang/crates.io-index)" = "90dbc611eb48397705a6b0f6e917da23ae517e4d127123d2cf7674206627d32a" -"checksum vcpkg 0.2.8 (registry+https://github.com/rust-lang/crates.io-index)" = "3fc439f2794e98976c88a2a2dafce96b930fe8010b0a256b3c2199a773933168" -"checksum vec_map 0.8.1 (registry+https://github.com/rust-lang/crates.io-index)" = "05c78687fb1a80548ae3250346c3db86a80a7cdd77bda190189f2d0a0987c81a" -"checksum version_check 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)" = "914b1a6776c4c929a602fafd8bc742e06365d4bcbe48c30f9cca5824f70dc9dd" -"checksum version_check 0.9.1 (registry+https://github.com/rust-lang/crates.io-index)" = "078775d0255232fb988e6fccf26ddc9d1ac274299aaedcedce21c6f72cc533ce" -"checksum void 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)" = "6a02e4885ed3bc0f2de90ea6dd45ebcbb66dacffe03547fadbb0eeae2770887d" -"checksum want 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "b6395efa4784b027708f7451087e647ec73cc74f5d9bc2e418404248d679a230" -"checksum wasi 0.9.0+wasi-snapshot-preview1 (registry+https://github.com/rust-lang/crates.io-index)" = "cccddf32554fecc6acb585f82a32a72e28b48f8c4c1883ddfeeeaa96f7d8e519" -"checksum winapi 0.2.8 (registry+https://github.com/rust-lang/crates.io-index)" = "167dc9d6949a9b857f3451275e911c3f44255842c1f7a76f33c55103a909087a" -"checksum winapi 0.3.8 (registry+https://github.com/rust-lang/crates.io-index)" = "8093091eeb260906a183e6ae1abdba2ef5ef2257a21801128899c3fc699229c6" -"checksum winapi-build 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "2d315eee3b34aca4797b2da6b13ed88266e6d612562a0c46390af8299fc699bc" -"checksum winapi-i686-pc-windows-gnu 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)" = "ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6" -"checksum winapi-util 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)" = "4ccfbf554c6ad11084fb7517daca16cfdcaccbdadba4fc336f032a8b12c2ad80" -"checksum winapi-x86_64-pc-windows-gnu 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)" = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" -"checksum winreg 0.6.2 (registry+https://github.com/rust-lang/crates.io-index)" = "b2986deb581c4fe11b621998a5e53361efe6b48a151178d0cd9eeffa4dc6acc9" -"checksum ws2_32-sys 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)" = "d59cefebd0c892fa2dd6de581e937301d8552cb44489cdff035c6187cb63fa5e" -"checksum xml-rs 0.8.3 (registry+https://github.com/rust-lang/crates.io-index)" = "b07db065a5cf61a7e4ba64f29e67db906fb1787316516c4e6e5ff0fea1efcd8a" +checksum = "b07db065a5cf61a7e4ba64f29e67db906fb1787316516c4e6e5ff0fea1efcd8a" diff --git a/Cargo.toml b/Cargo.toml index 4ab18ee..f1b1584 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -15,6 +15,7 @@ typed-arena = "1.4.1" url = "1.7.1" reqwest = "0.9.2" serde = { version = "1.0.89", features = ["derive"] } +serde_json = "1.0.61" toml = "0.5.0" log = "0.4.5" env_logger = "0.5.13" diff --git a/src/frontend/rustdoc/mod.rs b/src/frontend/rustdoc/mod.rs index 6f8b3de..3a19cc8 100644 --- a/src/frontend/rustdoc/mod.rs +++ b/src/frontend/rustdoc/mod.rs @@ -1 +1,237 @@ +use std::borrow::Cow; +use std::collections::VecDeque; +use std::fs::File; +use std::sync::Arc; +use std::path::PathBuf; +use std::process::Command; + +use crate::config::Config; +use crate::diagnostics::Diagnostics; +use crate::error::{Fatal, FatalResult}; +use crate::frontend::{self, Event, Tag}; +use crate::frontend::range::WithRange; + +/// Contains the type definitions, all implementing Deserialize. mod types; + +use types::{Item, ItemEnum}; + +pub struct Rustdoc<'a> { + cfg: &'a Config, + diagnostics: Arc>, + krate: types::Crate, + /// The dynamic state. Implements the actual traversal methods, taking references to the crate + /// data. + appender: RustdocAppender<'a>, +} + +struct RustdocAppender<'a> { + /// Stack of started, but not yet finished, portions of the documentation. + stack: Vec, + /// A buffer of events, yielded before continuing with the stack. + buffered: VecDeque>, +} + +pub enum Crate { + Local(PathBuf), +} + +/// Denotes some part of the crate which we have not yet fully documented. +#[derive(Debug)] +enum Traversal { + Root, + Module(types::Id), +} + +impl<'a> Iterator for Rustdoc<'a> { + type Item = Event<'a>; + fn next(&mut self) -> Option { + loop { + if let Some(buffered) = self.appender.buffered.pop_front() { + return Some(buffered); + } + + if let Some(traverse) = self.appender.stack.pop() { + if let Some(item) = self.traverse(traverse) { + return Some(item); + } + } else { + return None; + } + } + } +} + +impl Crate { + /// Invoke rustdoc to generate the json for this target. + pub fn generate(&self, diag: &Diagnostics<'_>) -> FatalResult { + match self { + Crate::Local(path) => { + let metadata = Command::new("cargo") + .args(&["metadata", "--format-version", "1"]) + .output()?; + + if !metadata.status.success() { + diag + .error("Cargo metadata failed for crate") + .note(String::from_utf8_lossy(&metadata.stderr)) + .emit(); + return Err(Fatal::Output(std::io::Error::new( + std::io::ErrorKind::InvalidData, + "Metadata call failed", + ))); + } + + let meta: types::WorkspaceMetadata = match serde_json::from_slice(&metadata.stdout) { + Ok(meta) => meta, + Err(err) => { + diag + .error("Failed to parse cargo metadata") + .emit(); + return Err(Fatal::Output(err.into())); + } + }; + + let format = Command::new("cargo") + .args(&["+nightly", "rustdoc", "--", "--output-format", "json"]) + .current_dir(&path) + .output()?; + + let mut target = PathBuf::from(meta.target_directory); + target.push("doc"); + target.push(format!("{}.json", meta.packages[0].name)); + + let file = File::open(target)?; + + match serde_json::from_reader(file) { + Ok(krate) => Ok(krate), + Err(err) => { + diag + .error("Cargo metadata failed for crate") + .note(String::from_utf8_lossy(&format.stderr)) + .emit(); + return Err(Fatal::Output(err.into())); + } + } + } + } + } +} + +impl<'a> Rustdoc<'a> { + pub fn new(cfg: &'a Config, krate: types::Crate, diagnostics: Arc>) -> Rustdoc<'a> { + Rustdoc { + cfg, + diagnostics, + krate, + appender: RustdocAppender::default(), + } + } +} + +macro_rules! handle_item_by_id { + (match ($self:ident, $what:expr) { + $($variant:ident (id) as ItemEnum::$kind:ident => $handler:ident),* + }) => { + let what = $what; + match &what { + $( + Traversal::$variant(id) => { + if let Some(Item { inner: ItemEnum::$kind(inner), .. }) + = $self.krate.index.get(id) + { + let item = $self.krate.index.get(id).unwrap(); + return $self.appender.$handler(item, inner); + } else { + $self.invalid_item(what); + return None; + } + }, + ),* + _ => {}, + }; + }; +} + +impl<'a> Rustdoc<'a> { + /// Get the next item while traversing a particular item. + /// This will also push more items or a remaining tail to its stack. + fn traverse(&mut self, what: Traversal) -> Option> { + if let Traversal::Root = &what { + return self.appender.root(&self.krate); + } + + // FIXME: use @ before subpatterns (https://github.com/rust-lang/rust/issues/65490), + // instead of macro + handle_item_by_id!(match (self, what) { + Module(id) as ItemEnum::ModuleItem => module + }); + + // unhandled kind of item, probably. + None + } + + /// Invoked when we encounter an unexpected item/reference. + fn invalid_item(&mut self, what: Traversal) { + let mut builder = self.diagnostics + .bug("Unexpected item in rustdoc json output") + .note(format!("Traversing {:?}", what)); + + if let Traversal::Module(id) = what { + if let Some(item) = self.krate.index.get(&id) { + if let Some(name) = &item.name { + builder = builder.note(name); + } + + builder = builder.note(format!("Source Span {:?}", item.source)); + } + } + + builder.emit(); + } +} + +impl Default for RustdocAppender<'_> { + fn default() -> Self { + RustdocAppender { + stack: vec![Traversal::Root], + buffered: VecDeque::new(), + } + } +} + +impl<'a> RustdocAppender<'a> { + fn root(&mut self, krate: &types::Crate) -> Option> { + let label = self.label_for_id(&krate.root, krate).unwrap(); + let header = frontend::Header { + label: WithRange(Cow::Owned(label), (0..0).into()), + level: 0, + }; + + self.buffered.push_back(Event::Start(Tag::Header(header.clone()))); + self.buffered.push_back(Event::Text({ + let root = krate.paths.get(&krate.root).unwrap(); + let lib_name = root.path[0].clone(); + Cow::Owned(lib_name) + })); + self.buffered.push_back(Event::End(Tag::Header(header))); + + self.stack.push(Traversal::Module(krate.root.clone())); + None + } + + fn module(&mut self, item: &Item, module: &types::Module) -> Option> { + None + } + + fn label_for_id(&self, path: &types::Id, krate: &types::Crate) -> Option { + match krate.paths.get(path) { + Some(summary) => Some(self.label_for_item_at_path(&summary.path)), + None => None, + } + } + + fn label_for_item_at_path(&self, path: &[String]) -> String { + path.join("-") + } +} diff --git a/src/frontend/rustdoc/types.rs b/src/frontend/rustdoc/types.rs index 1076b1a..fab5c1d 100644 --- a/src/frontend/rustdoc/types.rs +++ b/src/frontend/rustdoc/types.rs @@ -4,10 +4,26 @@ //! 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. +/// Parser cargo metadata json output, format 1. +#[derive(Deserialize)] +pub struct WorkspaceMetadata { + pub packages: Vec, + pub target_directory: String, +} + +#[derive(Deserialize)] +pub struct CrateMetadata { + pub name: String, + pub version: String, + pub description: String, + pub authors: Vec, + pub readme: String, +} + use std::path::PathBuf; use std::collections::HashMap; -use serde::{Deserialize}; +use serde::Deserialize; /// 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 diff --git a/src/generator/iter.rs b/src/generator/iter.rs index 4d0f200..7346639 100644 --- a/src/generator/iter.rs +++ b/src/generator/iter.rs @@ -12,7 +12,7 @@ use crate::generator::event::{Event, Tag, Image, Pdf, Svg}; use crate::generator::Generator; use crate::resolve::{Include, ContextType, ResolveSecurity}; -pub struct Iter<'a> { +pub struct MarkdownIter<'a> { frontend: Fuse>, peek: VecDeque<(WithRange>, FeEventKind)>, /// Contains the kind of the last FeEvent returned from `Self::next()`. @@ -22,9 +22,9 @@ pub struct Iter<'a> { last_kind: FeEventKind, } -impl<'a> Iter<'a> { +impl<'a> MarkdownIter<'a> { pub fn new(frontend: Frontend<'a>) -> Self { - Iter { frontend: frontend.fuse(), peek: VecDeque::new(), last_kind: FeEventKind::Start } + MarkdownIter { frontend: frontend.fuse(), peek: VecDeque::new(), last_kind: FeEventKind::Start } } /// Retrieves and converts the next event that needs to be handled. diff --git a/src/generator/mod.rs b/src/generator/mod.rs index c3d1311..53f96be 100644 --- a/src/generator/mod.rs +++ b/src/generator/mod.rs @@ -23,7 +23,7 @@ pub use self::stack::Stack; use self::code_gen_units::StackElement; use self::event::Event; use crate::error::{Error, FatalResult, Result}; -use crate::generator::iter::Iter; +use crate::generator::iter::MarkdownIter; pub struct Generator<'a, B: Backend<'a>, W: Write> { arena: &'a Arena, @@ -37,7 +37,7 @@ pub struct Generator<'a, B: Backend<'a>, W: Write> { } pub struct Events<'a> { - events: Iter<'a>, + events: MarkdownIter<'a>, diagnostics: Arc>, context: Context, } @@ -45,7 +45,7 @@ pub struct Events<'a> { impl<'a> fmt::Debug for Events<'a> { fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { f.debug_struct("Events") - .field("events", &"Iter") + .field("events", &"MarkdownIter") .field("diagnostics", &self.diagnostics) .field("context", &self.context) .finish() @@ -77,7 +77,7 @@ impl<'a, B: Backend<'a>, W: Write> Generator<'a, B, W> { let markdown = self.arena.alloc(markdown); let diagnostics = Arc::new(Diagnostics::new(markdown, input, Arc::clone(&self.stderr))); let frontend = Frontend::new(self.cfg, markdown, Arc::clone(&diagnostics)); - let events = Iter::new(frontend); + let events = MarkdownIter::new(frontend); Events { events, diagnostics, context } } From 9047ce8821654846eaaac58e3777ea514b03389f Mon Sep 17 00:00:00 2001 From: Andreas Molzer Date: Thu, 21 Jan 2021 00:42:47 +0100 Subject: [PATCH 06/28] Hookup rustdoc include frontend to generator --- src/frontend/mod.rs | 2 +- src/frontend/rustdoc/mod.rs | 2 ++ src/generator/event.rs | 2 ++ src/generator/iter.rs | 18 +++++++++++++++- src/generator/mod.rs | 43 ++++++++++++++++++++++++++++++------- src/resolve/include.rs | 1 + src/resolve/target.rs | 40 ++++++++++++++++++++++++++++++++-- 7 files changed, 96 insertions(+), 12 deletions(-) diff --git a/src/frontend/mod.rs b/src/frontend/mod.rs index 5d00a6e..ea18fa6 100644 --- a/src/frontend/mod.rs +++ b/src/frontend/mod.rs @@ -15,7 +15,7 @@ mod convert_cow; mod event; pub mod range; mod refs; -mod rustdoc; +pub mod rustdoc; mod size; mod table_layout; diff --git a/src/frontend/rustdoc/mod.rs b/src/frontend/rustdoc/mod.rs index 3a19cc8..1eb0bd3 100644 --- a/src/frontend/rustdoc/mod.rs +++ b/src/frontend/rustdoc/mod.rs @@ -16,6 +16,7 @@ mod types; use types::{Item, ItemEnum}; +#[derive(Debug)] pub struct Rustdoc<'a> { cfg: &'a Config, diagnostics: Arc>, @@ -25,6 +26,7 @@ pub struct Rustdoc<'a> { appender: RustdocAppender<'a>, } +#[derive(Debug)] struct RustdocAppender<'a> { /// Stack of started, but not yet finished, portions of the documentation. stack: Vec, diff --git a/src/generator/event.rs b/src/generator/event.rs index d3c8938..803d818 100644 --- a/src/generator/event.rs +++ b/src/generator/event.rs @@ -22,6 +22,7 @@ pub use crate::frontend::{ Table, TaskListMarker, Url, + rustdoc::Rustdoc, }; pub use pulldown_cmark::Alignment; @@ -40,6 +41,7 @@ pub enum Event<'a> { InlineHtml(Cow<'a, str>), Latex(Cow<'a, str>), IncludeMarkdown(Box>), + IncludeRustdoc(Box>), FootnoteReference(FootnoteReference<'a>), BiberReferences(Vec>), /// Url without content diff --git a/src/generator/iter.rs b/src/generator/iter.rs index 7346639..83c38fc 100644 --- a/src/generator/iter.rs +++ b/src/generator/iter.rs @@ -8,12 +8,15 @@ use crate::diagnostics::Input; use crate::error::{Error, FatalResult, Result}; use crate::frontend::{Event as FeEvent, EventKind as FeEventKind, Frontend, Include as FeInclude, Graphviz}; use crate::frontend::range::WithRange; +use crate::frontend::rustdoc::{Crate, Rustdoc}; use crate::generator::event::{Event, Tag, Image, Pdf, Svg}; use crate::generator::Generator; use crate::resolve::{Include, ContextType, ResolveSecurity}; +type FeEvents<'a> = dyn Iterator>> + 'a; + pub struct MarkdownIter<'a> { - frontend: Fuse>, + frontend: Fuse>>, peek: VecDeque<(WithRange>, FeEventKind)>, /// Contains the kind of the last FeEvent returned from `Self::next()`. /// @@ -24,6 +27,15 @@ pub struct MarkdownIter<'a> { impl<'a> MarkdownIter<'a> { pub fn new(frontend: Frontend<'a>) -> Self { + let frontend: Box> = Box::new(frontend); + MarkdownIter { frontend: frontend.fuse(), peek: VecDeque::new(), last_kind: FeEventKind::Start } + } + + pub fn with_rustdoc(rustdoc: Rustdoc<'a>) -> Self { + let frontend: Box> = Box::new(rustdoc.map(|event| { + WithRange(event, (0..0).into()) + })); + MarkdownIter { frontend: frontend.fuse(), peek: VecDeque::new(), last_kind: FeEventKind::Start } } @@ -181,6 +193,10 @@ impl<'a> MarkdownIter<'a> { height, })) }, + Include::Rustdoc(path) => { + let events = gen.get_rustdoc(Crate::Local(path))?; + Ok(Event::IncludeRustdoc(Box::new(events))) + }, Include::Svg(path) => { Ok(Event::Svg(Svg { label, diff --git a/src/generator/mod.rs b/src/generator/mod.rs index 53f96be..f5e1f6c 100644 --- a/src/generator/mod.rs +++ b/src/generator/mod.rs @@ -11,6 +11,7 @@ use crate::config::{Config, FileOrStdio}; use crate::diagnostics::{Diagnostics, Input}; use crate::frontend::Frontend; use crate::frontend::range::{SourceRange, WithRange}; +use crate::frontend::rustdoc::{Crate, Rustdoc}; use crate::resolve::{Context, Include, Resolver, ResolveSecurity}; mod code_gen_units; @@ -81,6 +82,12 @@ impl<'a, B: Backend<'a>, W: Write> Generator<'a, B, W> { Events { events, diagnostics, context } } + pub fn get_rustdoc(&mut self, target: Crate) -> FatalResult> { + let target = target.generate(self.diagnostics())?; + let diagnostics = Arc::new(Diagnostics::new("", Input::Stdin, Arc::clone(&self.stderr))); + Ok(Rustdoc::new(self.cfg, target, diagnostics)) + } + pub fn generate(&mut self, markdown: String) -> FatalResult<()> { let context = Context::from_project_root(); @@ -107,8 +114,34 @@ impl<'a, B: Backend<'a>, W: Write> Generator<'a, B, W> { pub fn generate_body(&mut self, events: Events<'a>) -> FatalResult<()> { self.stack.push(StackElement::Context(events.context, events.diagnostics)); - let mut events = events.events; + self.generate_markdown(events.events)?; + match self.stack.pop() { + Some(StackElement::Context(..)) => (), + element => panic!( + "Expected context as stack element after body generation is finished, got {:?}", + element + ), + } + Ok(()) + } + + pub fn generate_rustdoc(&mut self, events: Rustdoc<'a>) -> FatalResult<()> { + // TODO: we should push some context.. + // self.stack.push(StackElement::Context()); + self.generate_markdown(MarkdownIter::with_rustdoc(events))?; + /* Re-enable when we push a context + match self.stack.pop() { + Some(StackElement::Context(..)) => (), + element => panic!( + "Expected context as stack element after body generation is finished, got {:?}", + element + ), + } + */ + Ok(()) + } + fn generate_markdown(&mut self, mut events: MarkdownIter<'a>) -> FatalResult<()> { while let Some(WithRange(event, range)) = events.next(self)? { let peek = events.peek(self)?; match self.visit_event(WithRange(event, range), self.cfg, peek) { @@ -117,13 +150,6 @@ impl<'a, B: Backend<'a>, W: Write> Generator<'a, B, W> { Err(Error::Fatal(fatal)) => return Err(fatal), } } - match self.stack.pop() { - Some(StackElement::Context(..)) => (), - element => panic!( - "Expected context as stack element after body generation is finished, got {:?}", - element - ), - } Ok(()) } @@ -148,6 +174,7 @@ impl<'a, B: Backend<'a>, W: Write> Generator<'a, B, W> { Event::InlineHtml(html) => B::Text::new(config, WithRange(html, range), self)?.finish(self, peek)?, Event::Latex(latex) => B::Latex::new(config, WithRange(latex, range), self)?.finish(self, peek)?, Event::IncludeMarkdown(events) => self.generate_body(*events)?, + Event::IncludeRustdoc(events) => self.generate_rustdoc(*events)?, Event::FootnoteReference(fnote) => { B::FootnoteReference::new(config, WithRange(fnote, range), self)?.finish(self, peek)? }, diff --git a/src/resolve/include.rs b/src/resolve/include.rs index 5d37924..f23766c 100644 --- a/src/resolve/include.rs +++ b/src/resolve/include.rs @@ -84,6 +84,7 @@ pub enum Include { Svg(PathBuf), Pdf(PathBuf), Graphviz(PathBuf), + Rustdoc(PathBuf), } /// A direct command to the generator. diff --git a/src/resolve/target.rs b/src/resolve/target.rs index 594e724..82d2fcd 100644 --- a/src/resolve/target.rs +++ b/src/resolve/target.rs @@ -73,6 +73,15 @@ enum TargetInner { /// /// Ex: `![](https://foo.bar/baz.md)` Remote(Url), + /// An URL with the custom rustdoc scheme. + /// + /// There must be a cargo project and a `Cargo.toml` at the target directory. It will point to + /// the first crate in the workspace for now. Planned is to use the domain for selecting the + /// target crate in the future, including maybe retrieving a particular version from the + /// registry? + /// + /// Ex: `![](rustdoc:path/to/Cargo.toml)` + Rustdoc(PathBuf), } impl<'a, 'd> Target<'a, 'd> { @@ -111,6 +120,27 @@ impl<'a, 'd> Target<'a, 'd> { return Err(Error::Diagnostic); } }, + "rustdoc" => match url.domain() { + None => match url.to_file_path() { + Ok(path) => TargetInner::Rustdoc(path), + Err(()) => { + diagnostics + .error("error converting path to cargo project") + .with_info_section(range, "defined here") + .help("this could be due to a malformed path") + .emit(); + return Err(Error::Diagnostic); + } + } + Some(domain) => { + diagnostics + .error("rustdoc URLs must not provide a domain") + .with_error_section(range, "defined here") + .note(format!("uses the domain `{}`", domain)) + .emit(); + return Err(Error::Diagnostic); + } + }, "file" => match url.to_file_path() { Ok(path) => TargetInner::LocalAbsolute(path), Err(()) => { @@ -160,6 +190,7 @@ impl<'a, 'd> Target<'a, 'd> { inner @ TargetInner::Implementation(_) => inner, inner @ TargetInner::Remote(_) => inner, TargetInner::LocalAbsolute(abs) => TargetInner::LocalAbsolute(canonicalize(abs)?), + TargetInner::Rustdoc(abs) => TargetInner::Rustdoc(canonicalize(abs)?), TargetInner::LocalDocumentRelative(rel) => { assert!(rel.is_relative(), "TargetInner::LocalDocumentRelative not relative before canonicalizing: {:?}", rel); TargetInner::LocalDocumentRelative(canonicalize(meta.document_root.join(rel))?) @@ -197,12 +228,14 @@ impl <'a, 'd> TargetCanonicalized<'a, 'd> { (ContextType::LocalRelative, TargetInner::Implementation(_)) | (ContextType::LocalRelative, TargetInner::LocalProjectRelative(_)) | (ContextType::LocalRelative, TargetInner::LocalDocumentRelative(_)) - | (ContextType::LocalRelative, TargetInner::Remote(_)) => (), + | (ContextType::LocalRelative, TargetInner::Remote(_)) + | (ContextType::LocalRelative, TargetInner::Rustdoc(_)) => (), (ContextType::LocalAbsolute, TargetInner::Implementation(_)) => (), (ContextType::LocalAbsolute, TargetInner::LocalProjectRelative(_)) | (ContextType::LocalAbsolute, TargetInner::LocalDocumentRelative(_)) - | (ContextType::LocalAbsolute, TargetInner::Remote(_)) => { + | (ContextType::LocalAbsolute, TargetInner::Remote(_)) + | (ContextType::LocalAbsolute, TargetInner::Rustdoc(_)) => { meta.diagnostics .error("permission denied") .with_error_section(meta.range, "trying to include this") @@ -337,6 +370,9 @@ impl<'a, 'd> TargetChecked<'a, 'd> { None => to_include(path, context, meta.range, meta.diagnostics), } }, + TargetInner::Rustdoc(path) => { + Ok(Include::Rustdoc(path)) + }, } } } From 5e1ca1bd9c122153569930122e3a3516c5c5ae10 Mon Sep 17 00:00:00 2001 From: Andreas Molzer Date: Thu, 21 Jan 2021 03:24:25 +0100 Subject: [PATCH 07/28] Fix bugs in rustdoc pipeline --- src/frontend/rustdoc/mod.rs | 17 ++++++++++++++--- src/frontend/rustdoc/types.rs | 10 +++++++--- src/resolve/target.rs | 2 +- 3 files changed, 22 insertions(+), 7 deletions(-) diff --git a/src/frontend/rustdoc/mod.rs b/src/frontend/rustdoc/mod.rs index 1eb0bd3..cc384f2 100644 --- a/src/frontend/rustdoc/mod.rs +++ b/src/frontend/rustdoc/mod.rs @@ -71,6 +71,7 @@ impl Crate { Crate::Local(path) => { let metadata = Command::new("cargo") .args(&["metadata", "--format-version", "1"]) + .current_dir(&path) .output()?; if !metadata.status.success() { @@ -101,9 +102,19 @@ impl Crate { let mut target = PathBuf::from(meta.target_directory); target.push("doc"); - target.push(format!("{}.json", meta.packages[0].name)); + let krate = meta.workspace_members[0].split(" ").next().unwrap(); + target.push(format!("{}.json", krate)); - let file = File::open(target)?; + let file = match File::open(&target) { + Ok(file) => file, + Err(err) => { + diag + .error("Failed to open rustdoc output data") + .note(target.display().to_string()) + .emit(); + return Err(Fatal::Output(err)); + } + }; match serde_json::from_reader(file) { Ok(krate) => Ok(krate), @@ -207,7 +218,7 @@ impl<'a> RustdocAppender<'a> { let label = self.label_for_id(&krate.root, krate).unwrap(); let header = frontend::Header { label: WithRange(Cow::Owned(label), (0..0).into()), - level: 0, + level: 1, }; self.buffered.push_back(Event::Start(Tag::Header(header.clone()))); diff --git a/src/frontend/rustdoc/types.rs b/src/frontend/rustdoc/types.rs index fab5c1d..4d6030d 100644 --- a/src/frontend/rustdoc/types.rs +++ b/src/frontend/rustdoc/types.rs @@ -9,15 +9,19 @@ pub struct WorkspaceMetadata { pub packages: Vec, pub target_directory: String, + pub workspace_members: Vec, } #[derive(Deserialize)] pub struct CrateMetadata { pub name: String, - pub version: String, - pub description: String, + #[serde(default)] + pub version: Option, + #[serde(default)] + pub description: Option, pub authors: Vec, - pub readme: String, + #[serde(default)] + pub readme: Option, } use std::path::PathBuf; diff --git a/src/resolve/target.rs b/src/resolve/target.rs index 82d2fcd..d6c3e37 100644 --- a/src/resolve/target.rs +++ b/src/resolve/target.rs @@ -121,7 +121,7 @@ impl<'a, 'd> Target<'a, 'd> { } }, "rustdoc" => match url.domain() { - None => match url.to_file_path() { + None | Some("") => match url.to_file_path() { Ok(path) => TargetInner::Rustdoc(path), Err(()) => { diagnostics From 6fec236c3eb75cb8db3bf7c2f16e7798e71663da Mon Sep 17 00:00:00 2001 From: Andreas Molzer Date: Sat, 23 Jan 2021 15:31:43 +0100 Subject: [PATCH 08/28] Implement struct and fields formatting --- src/frontend/rustdoc/mod.rs | 322 ++++++++++++++++++++++++++++++------ 1 file changed, 275 insertions(+), 47 deletions(-) diff --git a/src/frontend/rustdoc/mod.rs b/src/frontend/rustdoc/mod.rs index cc384f2..808cbda 100644 --- a/src/frontend/rustdoc/mod.rs +++ b/src/frontend/rustdoc/mod.rs @@ -1,6 +1,7 @@ use std::borrow::Cow; use std::collections::VecDeque; use std::fs::File; +use std::fmt::Write as _; use std::sync::Arc; use std::path::PathBuf; use std::process::Command; @@ -41,8 +42,10 @@ pub enum Crate { /// Denotes some part of the crate which we have not yet fully documented. #[derive(Debug)] enum Traversal { + /// Initially gather crate state, and put root item on stack. Root, - Module(types::Id), + /// Traverse into an item, dispatching on its kind. + Item(types::Id), } impl<'a> Iterator for Rustdoc<'a> { @@ -54,9 +57,7 @@ impl<'a> Iterator for Rustdoc<'a> { } if let Some(traverse) = self.appender.stack.pop() { - if let Some(item) = self.traverse(traverse) { - return Some(item); - } + self.traverse(traverse); } else { return None; } @@ -102,7 +103,7 @@ impl Crate { let mut target = PathBuf::from(meta.target_directory); target.push("doc"); - let krate = meta.workspace_members[0].split(" ").next().unwrap(); + let krate = meta.workspace_members[0].split(' ').next().unwrap(); target.push(format!("{}.json", krate)); let file = match File::open(&target) { @@ -123,7 +124,7 @@ impl Crate { .error("Cargo metadata failed for crate") .note(String::from_utf8_lossy(&format.stderr)) .emit(); - return Err(Fatal::Output(err.into())); + Err(Fatal::Output(err.into())) } } } @@ -142,46 +143,31 @@ impl<'a> Rustdoc<'a> { } } -macro_rules! handle_item_by_id { - (match ($self:ident, $what:expr) { - $($variant:ident (id) as ItemEnum::$kind:ident => $handler:ident),* - }) => { - let what = $what; - match &what { - $( - Traversal::$variant(id) => { - if let Some(Item { inner: ItemEnum::$kind(inner), .. }) - = $self.krate.index.get(id) - { - let item = $self.krate.index.get(id).unwrap(); - return $self.appender.$handler(item, inner); - } else { - $self.invalid_item(what); - return None; - } - }, - ),* - _ => {}, - }; - }; -} - impl<'a> Rustdoc<'a> { /// Get the next item while traversing a particular item. /// This will also push more items or a remaining tail to its stack. - fn traverse(&mut self, what: Traversal) -> Option> { - if let Traversal::Root = &what { - return self.appender.root(&self.krate); + fn traverse(&mut self, what: Traversal) { + match what { + Traversal::Root => self.appender.root(&self.krate), + Traversal::Item(id) => self.append_item_by_id(&id), } + } - // FIXME: use @ before subpatterns (https://github.com/rust-lang/rust/issues/65490), - // instead of macro - handle_item_by_id!(match (self, what) { - Module(id) as ItemEnum::ModuleItem => module - }); - - // unhandled kind of item, probably. - None + fn append_item_by_id(&mut self, id: &types::Id) { + if let Some(item) = self.krate.index.get(id) { + let krate = &self.krate; + match item { + Item { inner: ItemEnum::ModuleItem(inner), .. } => { + self.appender.module(krate, item, inner); + }, + Item { inner: ItemEnum::StructItem(inner), .. } => { + self.appender.struct_(krate, item, inner); + }, + _ => eprintln!("Unimplemented {:?}", item), + } + } else { + self.invalid_item(Traversal::Item(id.clone())); + } } /// Invoked when we encounter an unexpected item/reference. @@ -190,7 +176,7 @@ impl<'a> Rustdoc<'a> { .bug("Unexpected item in rustdoc json output") .note(format!("Traversing {:?}", what)); - if let Traversal::Module(id) = what { + if let Traversal::Item(id) = what { if let Some(item) = self.krate.index.get(&id) { if let Some(name) = &item.name { builder = builder.note(name); @@ -214,7 +200,7 @@ impl Default for RustdocAppender<'_> { } impl<'a> RustdocAppender<'a> { - fn root(&mut self, krate: &types::Crate) -> Option> { + fn root(&mut self, krate: &types::Crate) { let label = self.label_for_id(&krate.root, krate).unwrap(); let header = frontend::Header { label: WithRange(Cow::Owned(label), (0..0).into()), @@ -229,12 +215,177 @@ impl<'a> RustdocAppender<'a> { })); self.buffered.push_back(Event::End(Tag::Header(header))); - self.stack.push(Traversal::Module(krate.root.clone())); - None + if krate.includes_private { + self.buffered.push_back(Event::Text(Cow::Borrowed( + "Note: This development documentation includes private items which are not accessible from the outside.", + ))); + } + + self.stack.push(Traversal::Item(krate.root.clone())); } - fn module(&mut self, item: &Item, module: &types::Module) -> Option> { - None + // Handle the individual items. + // Each methods types the crate environment, the full item, and its specialized enum internals. + + fn module(&mut self, krate: &types::Crate, item: &Item, module: &types::Module) { + let summary = krate.paths.get(&item.id) + // FIXME: this should fail and diagnose the rendering process, not panic. + .expect("Bad item ID"); + let label = self.label_for_item_at_path(&summary.path); + + let header = frontend::Header { + label: WithRange(Cow::Owned(label), (0..0).into()), + level: 2, + }; + + // Add a header. + self.buffered.push_back(Event::Start(Tag::Header(header.clone()))); + self.buffered.push_back(Event::Text({ + let qualifier = if module.is_crate { "Crate" } else { "Module" }; + let meta = match &item.visibility { + types::Visibility::Public => "pub ".to_string(), + types::Visibility::Default => "".to_string(), + types::Visibility::Crate => "pub(crate) ".to_string(), + types::Visibility::Restricted { parent: _, path } => { + format!("pub({}) ", path) + }, + }; + let module_name = self.name_for_item_at_path(&summary.path); + Cow::Owned(format!("{} {}{}", qualifier, meta, module_name)) + })); + self.buffered.push_back(Event::End(Tag::Header(header))); + + // Describe all children in text. + self.buffered.push_back(Event::Start(Tag::List)); + for child in &module.items { + self.buffered.push_back(Event::Start(Tag::Item)); + if let Some(target) = krate.paths.get(child) { + let child_label = self.label_for_item_at_path(&target.path); + + let link = frontend::InterLink { + label: Cow::Owned(child_label), + uppercase: false, + }; + + self.buffered.push_back(Event::Start(Tag::InterLink(link.clone()))); + self.buffered.push_back(Event::Text({ + let item_name = self.name_for_item_at_path(&target.path); + Cow::Owned(item_name) + })); + self.buffered.push_back(Event::End(Tag::InterLink(link))); + } else if let Some(Item { name: Some(name), .. }) = krate.index.get(child) { + self.buffered.push_back(Event::Text(name.clone().into())); + } else if let Some(item) = krate.index.get(child) { + eprintln!("Encountered weird module child: {:?}", item); + } else { + eprintln!("Encountered weird module child with no item: {:?}", child); + } + + self.buffered.push_back(Event::End(Tag::Item)); + } + self.buffered.push_back(Event::End(Tag::List)); + + // And queue to dispatch into children. + for child in module.items.iter().rev() { + self.stack.push(Traversal::Item(child.clone())) + } + } + + fn struct_(&mut self, krate: &types::Crate, item: &Item, struct_: &types::Struct) { + let summary = krate.paths.get(&item.id) + // FIXME: this should fail and diagnose the rendering process, not panic. + .expect("Bad item ID"); + let label = self.label_for_item_at_path(&summary.path); + + // Avoid allocating too much below.. + if struct_.fields.len() >= 1_000_000 { + panic!("Number of fields too large, considering opening a pull request to turn this into an iterative procedure."); + } + + let header = frontend::Header { + label: WithRange(Cow::Owned(label.clone()), (0..0).into()), + level: 3, + }; + + let meta = Self::codify_visibility(&item.visibility); + let struct_name = self.name_for_item_at_path(&summary.path); + let mut def = item.attrs.join("\n"); + writeln!(&mut def, "{}struct {} {{", meta, struct_name) + .expect("Writing to string succeeds"); + + self.buffered.push_back(Event::Start(Tag::Header(header.clone()))); + self.buffered.push_back(Event::Text({ + Cow::Owned(format!("Struct {}{}", meta, struct_name)) + })); + // TODO: generics? + self.buffered.push_back(Event::End(Tag::Header(header.clone()))); + + let mut field_documentation = vec![]; + for field_id in &struct_.fields { + if let Some(Item { + inner: ItemEnum::StructFieldItem(field), + name: Some(name), + visibility, + docs, + .. + }) = krate.index.get(field_id) { + let meta = Self::codify_visibility(visibility); + let type_name = Self::codify_type(krate, field); + writeln!(&mut def, " {}{}: {}", meta, name, type_name) + .expect("Writing to string succeeds"); + field_documentation.push((name, field, type_name, docs)); + } else { + // FIXME: should not occur. + } + } + + if struct_.fields_stripped { + def.push_str(" // some fields omitted\n"); + } + def.push('}'); + + let def_block_tag = frontend::CodeBlock { + label: None, + caption: None, + language: Some(WithRange(Cow::Borrowed("rust"), (0..0).into())), + }; + self.buffered.push_back(Event::Start(Tag::CodeBlock(def_block_tag.clone()))); + self.buffered.push_back(Event::Text(Cow::Owned(def))); + self.buffered.push_back(Event::End(Tag::CodeBlock(def_block_tag.clone()))); + + // FIXME: we would like a level-4 header.. + if !field_documentation.is_empty() { + self.buffered.push_back(Event::Start(Tag::Paragraph)); + self.buffered.push_back(Event::Start(Tag::InlineEmphasis)); + self.buffered.push_back(Event::Text(Cow::Borrowed("Fields"))); + self.buffered.push_back(Event::End(Tag::InlineEmphasis)); + self.buffered.push_back(Event::End(Tag::Paragraph)); + } + + for (name, _field_type, type_name, docs) in field_documentation { + self.buffered.push_back(Event::Start(Tag::Paragraph)); + + self.buffered.push_back(Event::Start(Tag::InlineCode)); + self.buffered.push_back(Event::Text(Cow::Owned(name.clone()))); + self.buffered.push_back(Event::Text(Cow::Borrowed(": "))); + // FIXME: link to the type, if appropriate. + // self.buffered.push_back(Event::Start(Tag::InterLink(field_type_link.clone()))); + self.buffered.push_back(Event::Text(Cow::Owned(type_name.clone()))); + // self.buffered.push_back(Event::End(Tag::InterLink(field_type_link.clone()))); + self.buffered.push_back(Event::End(Tag::InlineCode)); + + self.buffered.push_back(Event::Text(Cow::Borrowed(" "))); + // FIXME: treat as recursive markdown? + self.buffered.push_back(Event::Text(Cow::Owned(docs.clone()))); + + self.buffered.push_back(Event::End(Tag::Paragraph)); + } + + if !item.docs.is_empty() { + self.buffered.push_back(Event::Start(Tag::Paragraph)); + self.buffered.push_back(Event::Text(item.docs.clone().into())); + self.buffered.push_back(Event::End(Tag::Paragraph)); + } } fn label_for_id(&self, path: &types::Id, krate: &types::Crate) -> Option { @@ -244,6 +395,83 @@ impl<'a> RustdocAppender<'a> { } } + fn codify_visibility(visibility: &types::Visibility) -> String { + match visibility { + types::Visibility::Public => "pub ".to_string(), + types::Visibility::Default => "".to_string(), + types::Visibility::Crate => "pub(crate) ".to_string(), + types::Visibility::Restricted { parent: _, path } => { + format!("pub({}) ", path) + }, + } + } + + fn codify_type(krate: &types::Crate, type_: &types::Type) -> String { + #[allow(clippy::enum_glob_use)] + use types::Type::*; + match type_ { + ResolvedPath { name, args, param_names, .. } => { + let name = name.clone(); + match args.as_ref().map(|a| &**a) { + None => {}, + Some(types::GenericArgs::AngleBracketed { args, bindings }) => { + // Wait, do we need to map TypeBinding to args via names? + // FIXME: handle them, important for showing structs. + // todo!("Unhandled generic arguments to type"); + } + Some(types::GenericArgs::Parenthesized { .. }) => { + // FIXME: handle as error, probably? + todo!("Can this occur?"); + } + } + name + }, + Generic(st) | Primitive(st) => st.clone(), + Tuple(items) => { + let mut items = items.iter(); + let first = match items.next() { + None => return "()".into(), + Some(first) => first, + }; + let mut name = format!("({}", Self::codify_type(krate, first)); + for type_ in items { + name.push(','); + name.push_str(&Self::codify_type(krate, type_)); + } + name.push(')'); + name + }, + Slice(inner) => format!("[{}]", Self::codify_type(krate, inner)), + Array { type_, len } => { + format!("[{}; {}]", Self::codify_type(krate, type_), len) + }, + // ImplTrait.. + Never => "!".into(), + Infer => "_".into(), + RawPointer { mutable, type_ } => { + let qualifier = if *mutable { "mut" } else { "const" }; + format!("*{} {}", qualifier, Self::codify_type(krate, type_)) + } + BorrowedRef { lifetime, mutable, type_ } => { + let lifetime = lifetime.as_ref().map_or("", |st| st.as_str()); + let qualifier = if *mutable { "mut " } else { "" }; + let type_ = Self::codify_type(krate, type_); + format!("&{}{}{}", lifetime, qualifier, type_) + } + QualifiedPath { name, self_type, trait_ } => { + let self_type = Self::codify_type(krate, self_type); + let trait_ = Self::codify_type(krate, trait_); + format!("<{} as {}>::{}", self_type, trait_, name) + } + // FIXME: where can we test this best? + ImplTrait(_) | FunctionPointer(_) => todo!("Not yet implemented kind of named type encountered"), + } + } + + fn name_for_item_at_path(&self, path: &[String]) -> String { + path.join("::") + } + fn label_for_item_at_path(&self, path: &[String]) -> String { path.join("-") } From 83dec0e9330dfd8691752ca1779058521429c60a Mon Sep 17 00:00:00 2001 From: Andreas Molzer Date: Sat, 23 Jan 2021 20:24:26 +0100 Subject: [PATCH 09/28] Implement constant, static, enum, functions --- src/frontend/rustdoc/mod.rs | 336 ++++++++++++++++++++++++++++++++---- 1 file changed, 306 insertions(+), 30 deletions(-) diff --git a/src/frontend/rustdoc/mod.rs b/src/frontend/rustdoc/mod.rs index 808cbda..83f4292 100644 --- a/src/frontend/rustdoc/mod.rs +++ b/src/frontend/rustdoc/mod.rs @@ -6,6 +6,8 @@ use std::sync::Arc; use std::path::PathBuf; use std::process::Command; +use itertools::Itertools as _; + use crate::config::Config; use crate::diagnostics::Diagnostics; use crate::error::{Fatal, FatalResult}; @@ -97,7 +99,7 @@ impl Crate { }; let format = Command::new("cargo") - .args(&["+nightly", "rustdoc", "--", "--output-format", "json"]) + .args(&["+nightly", "rustdoc", "--", "--no-deps", "--output-format", "json"]) .current_dir(&path) .output()?; @@ -163,6 +165,20 @@ impl<'a> Rustdoc<'a> { Item { inner: ItemEnum::StructItem(inner), .. } => { self.appender.struct_(krate, item, inner); }, + Item { inner: ItemEnum::EnumItem(inner), .. } => { + self.appender.enum_(krate, item, inner); + }, + Item { inner: ItemEnum::ConstantItem(inner), .. } => { + self.appender.constant(krate, item, inner); + }, + Item { inner: ItemEnum::StaticItem(inner), .. } => { + self.appender.static_(krate, item, inner); + }, + Item { inner: ItemEnum::FunctionItem(inner), .. } => { + self.appender.function(krate, item, inner); + }, + Item { kind: types::ItemKind::Primitive, .. } + | Item { kind: types::ItemKind::Keyword, .. } => {}, _ => eprintln!("Unimplemented {:?}", item), } } else { @@ -242,14 +258,7 @@ impl<'a> RustdocAppender<'a> { self.buffered.push_back(Event::Start(Tag::Header(header.clone()))); self.buffered.push_back(Event::Text({ let qualifier = if module.is_crate { "Crate" } else { "Module" }; - let meta = match &item.visibility { - types::Visibility::Public => "pub ".to_string(), - types::Visibility::Default => "".to_string(), - types::Visibility::Crate => "pub(crate) ".to_string(), - types::Visibility::Restricted { parent: _, path } => { - format!("pub({}) ", path) - }, - }; + let meta = Self::codify_visibility(&item.visibility); let module_name = self.name_for_item_at_path(&summary.path); Cow::Owned(format!("{} {}{}", qualifier, meta, module_name)) })); @@ -295,30 +304,24 @@ impl<'a> RustdocAppender<'a> { let summary = krate.paths.get(&item.id) // FIXME: this should fail and diagnose the rendering process, not panic. .expect("Bad item ID"); - let label = self.label_for_item_at_path(&summary.path); // Avoid allocating too much below.. if struct_.fields.len() >= 1_000_000 { panic!("Number of fields too large, considering opening a pull request to turn this into an iterative procedure."); } - let header = frontend::Header { - label: WithRange(Cow::Owned(label.clone()), (0..0).into()), - level: 3, - }; - let meta = Self::codify_visibility(&item.visibility); let struct_name = self.name_for_item_at_path(&summary.path); - let mut def = item.attrs.join("\n"); + + let mut def: String = item.attrs + .iter() + .map(String::as_str) + .interleave(std::iter::repeat("\n")) + .collect(); + writeln!(&mut def, "{}struct {} {{", meta, struct_name) .expect("Writing to string succeeds"); - - self.buffered.push_back(Event::Start(Tag::Header(header.clone()))); - self.buffered.push_back(Event::Text({ - Cow::Owned(format!("Struct {}{}", meta, struct_name)) - })); - // TODO: generics? - self.buffered.push_back(Event::End(Tag::Header(header.clone()))); + self.append_header_for_inner_item("Struct", item, summary); let mut field_documentation = vec![]; for field_id in &struct_.fields { @@ -344,14 +347,9 @@ impl<'a> RustdocAppender<'a> { } def.push('}'); - let def_block_tag = frontend::CodeBlock { - label: None, - caption: None, - language: Some(WithRange(Cow::Borrowed("rust"), (0..0).into())), - }; - self.buffered.push_back(Event::Start(Tag::CodeBlock(def_block_tag.clone()))); + self.buffered.push_back(Event::Start(Tag::CodeBlock(Self::RUST_CODE_BLOCK))); self.buffered.push_back(Event::Text(Cow::Owned(def))); - self.buffered.push_back(Event::End(Tag::CodeBlock(def_block_tag.clone()))); + self.buffered.push_back(Event::End(Tag::CodeBlock(Self::RUST_CODE_BLOCK))); // FIXME: we would like a level-4 header.. if !field_documentation.is_empty() { @@ -388,6 +386,176 @@ impl<'a> RustdocAppender<'a> { } } + fn constant(&mut self, krate: &types::Crate, item: &Item, constant: &types::Constant) { + let summary = krate.paths.get(&item.id) + // FIXME: this should fail and diagnose the rendering process, not panic. + .expect("Bad item ID"); + self.append_header_for_inner_item("Constant", item, summary); + + let meta = Self::codify_visibility(&item.visibility); + let mut def = format!("{}const ", meta); + match &item.name { + Some(name) => def.push_str(name), + // FIXME: error handling. + _ => panic!("Const without a name"), + } + def.push_str(": "); + def.push_str(&Self::codify_type(krate, &constant.type_)); + def.push_str(" = "); + // TODO: what about constant.value?? + def.push_str(&constant.expr); + def.push(';'); + + self.buffered.push_back(Event::Start(Tag::CodeBlock(Self::RUST_CODE_BLOCK))); + self.buffered.push_back(Event::Text(Cow::Owned(def))); + self.buffered.push_back(Event::End(Tag::CodeBlock(Self::RUST_CODE_BLOCK))); + + if !item.docs.is_empty() { + self.buffered.push_back(Event::Start(Tag::Paragraph)); + self.buffered.push_back(Event::Text(item.docs.clone().into())); + self.buffered.push_back(Event::End(Tag::Paragraph)); + } + } + + fn static_(&mut self, krate: &types::Crate, item: &Item, constant: &types::Static) { + let summary = krate.paths.get(&item.id) + // FIXME: this should fail and diagnose the rendering process, not panic. + .expect("Bad item ID"); + self.append_header_for_inner_item("Static", item, summary); + + let meta = Self::codify_visibility(&item.visibility); + let mut def = format!("{}static ", meta); + if constant.mutable { + def.push_str("mut "); + } + match &item.name { + Some(name) => def.push_str(name), + // FIXME: error handling. + _ => panic!("Static without a name"), + } + def.push_str(": "); + def.push_str(&Self::codify_type(krate, &constant.type_)); + // TODO: or don't ignore `expr`? + def.push(';'); + + self.buffered.push_back(Event::Start(Tag::CodeBlock(Self::RUST_CODE_BLOCK))); + self.buffered.push_back(Event::Text(Cow::Owned(def))); + self.buffered.push_back(Event::End(Tag::CodeBlock(Self::RUST_CODE_BLOCK))); + + if !item.docs.is_empty() { + self.buffered.push_back(Event::Start(Tag::Paragraph)); + self.buffered.push_back(Event::Text(item.docs.clone().into())); + self.buffered.push_back(Event::End(Tag::Paragraph)); + } + } + + fn function(&mut self, krate: &types::Crate, item: &Item, function: &types::Function) { + let summary = krate.paths.get(&item.id) + // FIXME: this should fail and diagnose the rendering process, not panic. + .expect("Bad item ID"); + let name = item.name + .as_ref() + .expect("Unnamed method"); + self.append_header_for_inner_item("Function", item, summary); + + let meta = Self::codify_visibility(&item.visibility); + let abi = Self::codify_abi(&function.abi); + let signature = Self::codify_fn_decl(krate, &function.decl); + // FIXME: generics, bounds. + let def = format!("{}{}fn {}{}", meta, abi, name, signature); + + self.buffered.push_back(Event::Start(Tag::CodeBlock(Self::RUST_CODE_BLOCK))); + self.buffered.push_back(Event::Text(Cow::Owned(def))); + self.buffered.push_back(Event::End(Tag::CodeBlock(Self::RUST_CODE_BLOCK))); + + if !item.docs.is_empty() { + self.buffered.push_back(Event::Start(Tag::Paragraph)); + self.buffered.push_back(Event::Text(item.docs.clone().into())); + self.buffered.push_back(Event::End(Tag::Paragraph)); + } + } + + fn enum_(&mut self, krate: &types::Crate, item: &Item, enum_: &types::Enum) { + let summary = krate.paths.get(&item.id) + // FIXME: this should fail and diagnose the rendering process, not panic. + .expect("Bad item ID"); + + // Avoid allocating too much below.. + if enum_.variants.len() >= 1_000_000 { + panic!("Number of variants too large, considering opening a pull request to turn this into an iterative procedure."); + } + + let meta = Self::codify_visibility(&item.visibility); + let enum_name = self.name_for_item_at_path(&summary.path); + + let mut def: String = item.attrs + .iter() + .map(String::as_str) + .interleave(std::iter::repeat("\n")) + .collect(); + + writeln!(&mut def, "{}enum {} {{", meta, enum_name) + .expect("Writing to string succeeds"); + self.append_header_for_inner_item("Union", item, summary); + + let mut variant_documentation = vec![]; + for variant_id in &enum_.variants { + if let Some(Item { + inner: ItemEnum::VariantItem(variant), + name: Some(name), + visibility, + docs, + .. + }) = krate.index.get(variant_id) { + let meta = Self::codify_visibility(visibility); + // FIXME: Different variant kinds. + writeln!(&mut def, " {}", name); + variant_documentation.push((name, variant, docs)); + } else { + // FIXME: should not occur. + } + } + + if enum_.variants_stripped { + def.push_str(" // some variants omitted\n"); + } + def.push('}'); + + self.buffered.push_back(Event::Start(Tag::CodeBlock(Self::RUST_CODE_BLOCK))); + self.buffered.push_back(Event::Text(Cow::Owned(def))); + self.buffered.push_back(Event::End(Tag::CodeBlock(Self::RUST_CODE_BLOCK))); + + // FIXME: we would like a level-4 header.. + if !variant_documentation.is_empty() { + self.buffered.push_back(Event::Start(Tag::Paragraph)); + self.buffered.push_back(Event::Start(Tag::InlineEmphasis)); + self.buffered.push_back(Event::Text(Cow::Borrowed("Variants"))); + self.buffered.push_back(Event::End(Tag::InlineEmphasis)); + self.buffered.push_back(Event::End(Tag::Paragraph)); + } + + for (name, _variant, docs) in variant_documentation { + self.buffered.push_back(Event::Start(Tag::Paragraph)); + + self.buffered.push_back(Event::Start(Tag::InlineCode)); + // FIXME: struct variants, including links. + self.buffered.push_back(Event::Text(Cow::Owned(name.clone()))); + self.buffered.push_back(Event::End(Tag::InlineCode)); + + self.buffered.push_back(Event::Text(Cow::Borrowed(" "))); + // FIXME: treat as recursive markdown? + self.buffered.push_back(Event::Text(Cow::Owned(docs.clone()))); + + self.buffered.push_back(Event::End(Tag::Paragraph)); + } + + if !item.docs.is_empty() { + self.buffered.push_back(Event::Start(Tag::Paragraph)); + self.buffered.push_back(Event::Text(item.docs.clone().into())); + self.buffered.push_back(Event::End(Tag::Paragraph)); + } + } + fn label_for_id(&self, path: &types::Id, krate: &types::Crate) -> Option { match krate.paths.get(path) { Some(summary) => Some(self.label_for_item_at_path(&summary.path)), @@ -406,6 +574,13 @@ impl<'a> RustdocAppender<'a> { } } + fn codify_abi(abi: &str) -> String { + match abi { + "\"Rust\"" => String::new(), + other => format!("extern {} ", other), + } + } + fn codify_type(krate: &types::Crate, type_: &types::Type) -> String { #[allow(clippy::enum_glob_use)] use types::Type::*; @@ -468,6 +643,73 @@ impl<'a> RustdocAppender<'a> { } } + fn codify_fn_decl(krate: &types::Crate, decl: &types::FnDecl) -> String { + let inputs: Vec<_> = decl.inputs + .iter() + .map(|(name, type_)| { + format!("{}: {}", name, Self::codify_type(krate, type_)) + }) + .collect(); + + let in_len: usize = inputs.iter().map(|st| st.chars().count()).sum(); + + let output = if let Some(type_) = &decl.output { + format!(" -> {}", Self::codify_type(krate, type_)) + } else { + "".into() + }; + + let out_len: usize = output.chars().count(); + + // FIXME: this simplistic model counts unicode code points. + // It would be more accurate to use something else. + + // We have three styles: + // * (arg, arg, arg) -> Output + // * (arg, arg, arg) + // -> Output + // * ( + // arg1, + // arg2, + // ) -> Output + // * + // Break around (), break between args, break before output. + let (list_break, arg_break, out_break) = if in_len + out_len < 80 { + // Same line for everything, arguments and output + (false, false, false) + } else if in_len < 120 { + (true, false, true) + } else { + (true, true, true) + }; + + let mut decl = String::from("("); + if list_break { + decl.push_str("\n "); + } + let mut inputs = inputs.into_iter(); + if let Some(first) = inputs.next() { + decl.push_str(&first); + for rest in inputs { + if arg_break { + decl.push_str(",\n "); + } else { + decl.push_str(", "); + } + decl.push_str(&rest); + } + } + if list_break { + decl.push_str("\n"); + } + decl.push(')'); + if out_break { + decl.push_str("\n "); + } + decl.push_str(&output); + decl + } + fn name_for_item_at_path(&self, path: &[String]) -> String { path.join("::") } @@ -475,4 +717,38 @@ impl<'a> RustdocAppender<'a> { fn label_for_item_at_path(&self, path: &[String]) -> String { path.join("-") } + + fn append_header_for_inner_item( + &mut self, + kind: &str, + item: &Item, + summary: &types::ItemSummary, + ) { + let label = self.label_for_item_at_path(&summary.path); + + let header = frontend::Header { + label: WithRange(Cow::Owned(label.clone()), (0..0).into()), + level: 3, + }; + + let meta = Self::codify_visibility(&item.visibility); + self.buffered.push_back(Event::Start(Tag::Header(header.clone()))); + self.buffered.push_back(Event::Text({ + let const_name = self.name_for_item_at_path(&summary.path); + Cow::Owned(format!("{} {}{}", kind, meta, const_name)) + })); + self.buffered.push_back(Event::End(Tag::Header(header.clone()))); + } + + const RUST_CODE_BLOCK: frontend::CodeBlock<'static> = frontend::CodeBlock { + label: None, + caption: None, + language: Some(WithRange( + Cow::Borrowed("rust"), + crate::frontend::range::SourceRange { + start: 0, + end: 0, + } + )), + }; } From 4824e189ed7e085423c5c05edd9525d0312e19cd Mon Sep 17 00:00:00 2001 From: Andreas Molzer Date: Sat, 23 Jan 2021 20:32:29 +0100 Subject: [PATCH 10/28] Add an example crate --- examples/crate/.gitignore | 5 ++++ examples/crate/Cargo.lock | 5 ++++ examples/crate/Cargo.toml | 9 +++++++ examples/crate/src/lib.rs | 54 +++++++++++++++++++++++++++++++++++++++ examples/rustdoc.md | 1 + 5 files changed, 74 insertions(+) create mode 100644 examples/crate/.gitignore create mode 100644 examples/crate/Cargo.lock create mode 100644 examples/crate/Cargo.toml create mode 100644 examples/crate/src/lib.rs create mode 100644 examples/rustdoc.md diff --git a/examples/crate/.gitignore b/examples/crate/.gitignore new file mode 100644 index 0000000..2526a8b --- /dev/null +++ b/examples/crate/.gitignore @@ -0,0 +1,5 @@ +/target +**/*.rs.bk + +*.iml +.idea/ diff --git a/examples/crate/Cargo.lock b/examples/crate/Cargo.lock new file mode 100644 index 0000000..ba84263 --- /dev/null +++ b/examples/crate/Cargo.lock @@ -0,0 +1,5 @@ +# This file is automatically @generated by Cargo. +# It is not intended for manual editing. +[[package]] +name = "example-crate" +version = "0.1.0" diff --git a/examples/crate/Cargo.toml b/examples/crate/Cargo.toml new file mode 100644 index 0000000..d18608c --- /dev/null +++ b/examples/crate/Cargo.toml @@ -0,0 +1,9 @@ +[package] +name = "example-crate" +version = "0.1.0" +authors = ["Andreas Molzer "] +edition = "2018" + +# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html + +[dependencies] diff --git a/examples/crate/src/lib.rs b/examples/crate/src/lib.rs new file mode 100644 index 0000000..5a1b8c0 --- /dev/null +++ b/examples/crate/src/lib.rs @@ -0,0 +1,54 @@ +#![allow(dead_code)] +#![allow(unused_variables)] + +/// Documented module abc. +pub mod abc { + /// A simple type. + pub struct SimpleType; +} + +/// A struct with repr annotation. +#[repr(C)] +pub struct KindOfReprC(pub u8); + +/// This is used as a return type. +pub struct ReturnType; + +/// An enum with different variants. +pub enum AnEnum { + VariantA, + VariantB, + VariantStruct { + a: ReturnType, + b: usize, + }, +} + +/// A normal function. +pub fn function_item(param: usize) -> ReturnType { + ReturnType +} + +/// A function with a very long signature. +pub fn complicated_function( + long_parameter_name_but_still_okay: usize, + oh_no_a_second_parameter: usize, + and_a_third_one_definitely_makes_the_signature_long: usize, +) -> usize { + 0 +} + +/// A function with a non-Rust ABI. +pub extern "C" fn extern_c() {} + +/// A static, not a constant. +pub static A_STATIC: KindOfReprC = KindOfReprC(0); + +/// A constant with some arbitrary type. +pub const A_CONST: KindOfReprC = KindOfReprC(0u8); +/// A literal number. +pub const A_CONST_LITERAL: u8 = 0u8; +/// Wow, more literals. +pub const A_STR_LITERAL: &'static str = "string literal"; +/// So hidden from public view. +const PRIVATE_CONST: u8 = 0; diff --git a/examples/rustdoc.md b/examples/rustdoc.md new file mode 100644 index 0000000..44eddfd --- /dev/null +++ b/examples/rustdoc.md @@ -0,0 +1 @@ +![](rustdoc:/home/andreas/code/projects/heradoc/examples/crate) From eaee7b4f995965e697967adb8e839782473aef19 Mon Sep 17 00:00:00 2001 From: Andreas Molzer Date: Sat, 23 Jan 2021 21:13:16 +0100 Subject: [PATCH 11/28] Adjust implementation of some items Fixes infinite recursion when we hit a specific case of an itertools iterator, a few visual glitches (too many or few line breaks), and adds the struct type distinction. --- .gitignore | 2 ++ src/frontend/rustdoc/mod.rs | 57 ++++++++++++++++++++++++++----------- 2 files changed, 42 insertions(+), 17 deletions(-) diff --git a/.gitignore b/.gitignore index 2526a8b..b577009 100644 --- a/.gitignore +++ b/.gitignore @@ -3,3 +3,5 @@ *.iml .idea/ +pdflatex_stderr.log +pdflatex_stdout.log diff --git a/src/frontend/rustdoc/mod.rs b/src/frontend/rustdoc/mod.rs index 83f4292..32ddbb6 100644 --- a/src/frontend/rustdoc/mod.rs +++ b/src/frontend/rustdoc/mod.rs @@ -98,15 +98,22 @@ impl Crate { } }; + let mut target = PathBuf::from(meta.target_directory); + target.push("doc"); + let krate = meta.workspace_members[0].split(' ').next().unwrap(); + let format = Command::new("cargo") - .args(&["+nightly", "rustdoc", "--", "--no-deps", "--output-format", "json"]) + .args(&["+nightly", "rustdoc", "-p"]) + .arg(&krate) + .args(&["--", "--no-deps", "--output-format", "json"]) .current_dir(&path) .output()?; - let mut target = PathBuf::from(meta.target_directory); - target.push("doc"); - let krate = meta.workspace_members[0].split(' ').next().unwrap(); - target.push(format!("{}.json", krate)); + target.push({ + // FIXME: support actually renamed library targets? + let lib_name = format!("{}.json", krate); + lib_name.replace("-", "_") + }); let file = match File::open(&target) { Ok(file) => file, @@ -304,6 +311,9 @@ impl<'a> RustdocAppender<'a> { let summary = krate.paths.get(&item.id) // FIXME: this should fail and diagnose the rendering process, not panic. .expect("Bad item ID"); + let name = item.name + .as_ref() + .expect("Struct without a name"); // Avoid allocating too much below.. if struct_.fields.len() >= 1_000_000 { @@ -316,13 +326,20 @@ impl<'a> RustdocAppender<'a> { let mut def: String = item.attrs .iter() .map(String::as_str) - .interleave(std::iter::repeat("\n")) + .interleave_shortest(std::iter::repeat("\n")) .collect(); - writeln!(&mut def, "{}struct {} {{", meta, struct_name) - .expect("Writing to string succeeds"); self.append_header_for_inner_item("Struct", item, summary); + write!(&mut def, "{}struct {}", meta, name) + .expect("Writing to string succeeds"); + let (start_tag, end_tag) = match struct_.struct_type { + types::StructType::Plain => ("{\n", "\n}"), + types::StructType::Tuple => ("(\n", "\n)"), + types::StructType::Unit => ("", ";"), + }; + + def.push_str(start_tag); let mut field_documentation = vec![]; for field_id in &struct_.fields { if let Some(Item { @@ -334,8 +351,13 @@ impl<'a> RustdocAppender<'a> { }) = krate.index.get(field_id) { let meta = Self::codify_visibility(visibility); let type_name = Self::codify_type(krate, field); - writeln!(&mut def, " {}{}: {}", meta, name, type_name) - .expect("Writing to string succeeds"); + def.push_str(" "); + def.push_str(&meta); + if let types::StructType::Tuple = struct_.struct_type {} else { + def.push_str(name); + def.push_str(": "); + } + def.push_str(&type_name); field_documentation.push((name, field, type_name, docs)); } else { // FIXME: should not occur. @@ -345,7 +367,7 @@ impl<'a> RustdocAppender<'a> { if struct_.fields_stripped { def.push_str(" // some fields omitted\n"); } - def.push('}'); + def.push_str(end_tag); self.buffered.push_back(Event::Start(Tag::CodeBlock(Self::RUST_CODE_BLOCK))); self.buffered.push_back(Event::Text(Cow::Owned(def))); @@ -491,7 +513,7 @@ impl<'a> RustdocAppender<'a> { let mut def: String = item.attrs .iter() .map(String::as_str) - .interleave(std::iter::repeat("\n")) + .interleave_shortest(std::iter::repeat("\n")) .collect(); writeln!(&mut def, "{}enum {} {{", meta, enum_name) @@ -509,7 +531,8 @@ impl<'a> RustdocAppender<'a> { }) = krate.index.get(variant_id) { let meta = Self::codify_visibility(visibility); // FIXME: Different variant kinds. - writeln!(&mut def, " {}", name); + writeln!(&mut def, " {},", name) + .expect("Writing to string succeeds"); variant_documentation.push((name, variant, docs)); } else { // FIXME: should not occur. @@ -628,7 +651,7 @@ impl<'a> RustdocAppender<'a> { format!("*{} {}", qualifier, Self::codify_type(krate, type_)) } BorrowedRef { lifetime, mutable, type_ } => { - let lifetime = lifetime.as_ref().map_or("", |st| st.as_str()); + let lifetime = lifetime.as_ref().map_or_else(String::new, |st| format!("{} ", st)); let qualifier = if *mutable { "mut " } else { "" }; let type_ = Self::codify_type(krate, type_); format!("&{}{}{}", lifetime, qualifier, type_) @@ -680,7 +703,7 @@ impl<'a> RustdocAppender<'a> { } else if in_len < 120 { (true, false, true) } else { - (true, true, true) + (true, true, false) }; let mut decl = String::from("("); @@ -700,7 +723,7 @@ impl<'a> RustdocAppender<'a> { } } if list_break { - decl.push_str("\n"); + decl.push('\n'); } decl.push(')'); if out_break { @@ -728,7 +751,7 @@ impl<'a> RustdocAppender<'a> { let header = frontend::Header { label: WithRange(Cow::Owned(label.clone()), (0..0).into()), - level: 3, + level: 2, }; let meta = Self::codify_visibility(&item.visibility); From dddea3b067efd6c4bb719ce5fa38d7f3eb0c8570 Mon Sep 17 00:00:00 2001 From: Andreas Molzer Date: Sat, 23 Jan 2021 23:38:38 +0100 Subject: [PATCH 12/28] Ensure that rustdoc behaves like a file URL --- examples/rustdoc.md | 2 +- src/resolve/target.rs | 62 +++++++++++++++++++++++++++++++++---------- src/resolve/tests.rs | 24 +++++++++++++++++ 3 files changed, 73 insertions(+), 15 deletions(-) diff --git a/examples/rustdoc.md b/examples/rustdoc.md index 44eddfd..4779b30 100644 --- a/examples/rustdoc.md +++ b/examples/rustdoc.md @@ -1 +1 @@ -![](rustdoc:/home/andreas/code/projects/heradoc/examples/crate) +![](rustdoc:crate) diff --git a/src/resolve/target.rs b/src/resolve/target.rs index d6c3e37..809bf27 100644 --- a/src/resolve/target.rs +++ b/src/resolve/target.rs @@ -80,8 +80,10 @@ enum TargetInner { /// target crate in the future, including maybe retrieving a particular version from the /// registry? /// - /// Ex: `![](rustdoc:path/to/Cargo.toml)` + /// Ex: `![](rustdoc:/path/to/Cargo.toml)` Rustdoc(PathBuf), + /// An URL with rustdoc scheme but relative to our workspace. + RustdocRelative(PathBuf), } impl<'a, 'd> Target<'a, 'd> { @@ -120,16 +122,42 @@ impl<'a, 'd> Target<'a, 'd> { return Err(Error::Diagnostic); } }, - "rustdoc" => match url.domain() { - None | Some("") => match url.to_file_path() { - Ok(path) => TargetInner::Rustdoc(path), - Err(()) => { - diagnostics - .error("error converting path to cargo project") - .with_info_section(range, "defined here") - .help("this could be due to a malformed path") - .emit(); - return Err(Error::Diagnostic); + "rustdoc" => match url.host_str() { + None => { + match context.url.join(url.path()) { + Ok(url) => TargetInner::RustdocRelative(url.path_segments().unwrap().collect()), + Err(err) => {// There is no extra information. + diagnostics + .error("error interpreting relative file path of rustdoc source") + .with_info_section(range, "defined here") + .note(format!("malformed reference: {}", err)) + .emit(); + return Err(Error::Diagnostic); + } + } + } + Some("") => { + let mut url = url.clone(); + // There are a few special cases for file: + // We want to use them here as well. + // url.set_host(None); + url.set_scheme("file") + .expect("Can update to file scheme because rustdoc is not a special scheme."); + // !!! FIXME: Workaround for https://github.com/servo/rust-url/issues/553 + // For some reason an internal state is not updated so we still have + // inconsistent information referring to a remote. + let url = Url::parse(url.as_str()) + .expect("Roundtrip with updated host"); + match url.to_file_path() { + Ok(path) => TargetInner::Rustdoc(path), + Err(()) => { + diagnostics + .error("error converting path to cargo project") + .with_info_section(range, "defined here") + .help("this could be due to a malformed path") + .emit(); + return Err(Error::Diagnostic); + } } } Some(domain) => { @@ -191,6 +219,10 @@ impl<'a, 'd> Target<'a, 'd> { inner @ TargetInner::Remote(_) => inner, TargetInner::LocalAbsolute(abs) => TargetInner::LocalAbsolute(canonicalize(abs)?), TargetInner::Rustdoc(abs) => TargetInner::Rustdoc(canonicalize(abs)?), + TargetInner::RustdocRelative(rel) => { + assert!(rel.is_relative(), "TargetInner::RustdocRelative not relative before canonicalizing: {:?}", rel); + TargetInner::RustdocRelative(canonicalize(meta.project_root.join(rel))?) + }, TargetInner::LocalDocumentRelative(rel) => { assert!(rel.is_relative(), "TargetInner::LocalDocumentRelative not relative before canonicalizing: {:?}", rel); TargetInner::LocalDocumentRelative(canonicalize(meta.document_root.join(rel))?) @@ -229,13 +261,15 @@ impl <'a, 'd> TargetCanonicalized<'a, 'd> { | (ContextType::LocalRelative, TargetInner::LocalProjectRelative(_)) | (ContextType::LocalRelative, TargetInner::LocalDocumentRelative(_)) | (ContextType::LocalRelative, TargetInner::Remote(_)) - | (ContextType::LocalRelative, TargetInner::Rustdoc(_)) => (), + | (ContextType::LocalRelative, TargetInner::Rustdoc(_)) + | (ContextType::LocalRelative, TargetInner::RustdocRelative(_)) => (), (ContextType::LocalAbsolute, TargetInner::Implementation(_)) => (), (ContextType::LocalAbsolute, TargetInner::LocalProjectRelative(_)) | (ContextType::LocalAbsolute, TargetInner::LocalDocumentRelative(_)) | (ContextType::LocalAbsolute, TargetInner::Remote(_)) - | (ContextType::LocalAbsolute, TargetInner::Rustdoc(_)) => { + | (ContextType::LocalAbsolute, TargetInner::Rustdoc(_)) + | (ContextType::LocalAbsolute, TargetInner::RustdocRelative(_)) => { meta.diagnostics .error("permission denied") .with_error_section(meta.range, "trying to include this") @@ -370,7 +404,7 @@ impl<'a, 'd> TargetChecked<'a, 'd> { None => to_include(path, context, meta.range, meta.diagnostics), } }, - TargetInner::Rustdoc(path) => { + TargetInner::Rustdoc(path) | TargetInner::RustdocRelative(path) => { Ok(Include::Rustdoc(path)) }, } diff --git a/src/resolve/tests.rs b/src/resolve/tests.rs index c1613ed..57e84e5 100644 --- a/src/resolve/tests.rs +++ b/src/resolve/tests.rs @@ -54,6 +54,7 @@ fn prepare() -> (TempDir, SourceRange, Resolver, Diagnostics<'static>) { let _ = File::create(tmpdir.path().join("chapters/chapter2.md")).expect("Can't create chapters/chapter2.md"); let _ = File::create(tmpdir.path().join("images/image.png")).expect("Can't create images/image.png"); fs::create_dir(tmpdir.path().join("downloads")).expect("can't create downloads directory"); + fs::create_dir(tmpdir.path().join("crate")).expect("can't create crate directory"); let range = SourceRange { start: 0, end: 0 }; let diagnostics = Diagnostics::new("", Input::Stdin, Arc::new(Mutex::new(StandardStream::stderr(ColorChoice::Auto)))); let resolver = Resolver::new(tmpdir.path().to_owned(), tmpdir.path().join("chapters"), tmpdir.path().join("download")); @@ -254,6 +255,29 @@ fn commands() { assert_match!(listings, Include::Command(Command::ListOfListings)); } +#[test] +fn rustdoc() { + let (project_root, range, resolver, diagnostics) = prepare(); + let ctx = Context::from_path("chapters/").expect("can't create context"); + let abs_path = project_root.path().join("crate"); + + let relative = resolver + .resolve(ResolveSecurity::Default, &ctx, "rustdoc:../crate", range, &diagnostics) + .expect("Success resolving `rustdoc:../crate`"); + let project = resolver + .resolve(ResolveSecurity::Default, &ctx, "rustdoc:/crate", range, &diagnostics) + .expect("Success resolving `rustdoc:/crate`"); + + let absolute = format!("rustdoc://{}", abs_path.display()); + let absolute = resolver + .resolve(ResolveSecurity::Default, &ctx, &absolute, range, &diagnostics) + .expect("Success resolving `rustdoc:///path/crate`"); + + assert_match!(relative, Include::Rustdoc(path) if *path == abs_path); + assert_match!(project, Include::Rustdoc(path) if *path == abs_path); + assert_match!(absolute, Include::Rustdoc(path) if *path == abs_path); +} + #[test] fn http_resolves_needs_internet() { let (_project_root, range, resolver, diagnostics) = prepare(); From 62286156314ee2bfaaebdf2603af3b4f095c51af Mon Sep 17 00:00:00 2001 From: Andreas Molzer Date: Sun, 24 Jan 2021 00:06:06 +0100 Subject: [PATCH 13/28] Check rustdoc exit status, implement unions --- examples/crate/src/lib.rs | 5 +++++ src/frontend/rustdoc/mod.rs | 36 ++++++++++++++++++++++++++++-------- 2 files changed, 33 insertions(+), 8 deletions(-) diff --git a/examples/crate/src/lib.rs b/examples/crate/src/lib.rs index 5a1b8c0..abe0a0a 100644 --- a/examples/crate/src/lib.rs +++ b/examples/crate/src/lib.rs @@ -24,6 +24,11 @@ pub enum AnEnum { }, } +pub union TestUnion { + pub a: (), + pub b: usize, +} + /// A normal function. pub fn function_item(param: usize) -> ReturnType { ReturnType diff --git a/src/frontend/rustdoc/mod.rs b/src/frontend/rustdoc/mod.rs index 32ddbb6..7bdec0c 100644 --- a/src/frontend/rustdoc/mod.rs +++ b/src/frontend/rustdoc/mod.rs @@ -105,10 +105,23 @@ impl Crate { let format = Command::new("cargo") .args(&["+nightly", "rustdoc", "-p"]) .arg(&krate) - .args(&["--", "--no-deps", "--output-format", "json"]) + .args(&["--", "--output-format", "json"]) .current_dir(&path) .output()?; + if !format.status.success() { + diag + .error("Compiling rustdoc failed") + .note(String::from_utf8_lossy(&metadata.stdout)) + .note(String::from_utf8_lossy(&metadata.stderr)) + .note(format!("Compiling `{}` in `{}`", krate, path.display())) + .emit(); + return Err(Fatal::Output(std::io::Error::new( + std::io::ErrorKind::InvalidData, + "Metadata call failed", + ))); + } + target.push({ // FIXME: support actually renamed library targets? let lib_name = format!("{}.json", krate); @@ -321,7 +334,6 @@ impl<'a> RustdocAppender<'a> { } let meta = Self::codify_visibility(&item.visibility); - let struct_name = self.name_for_item_at_path(&summary.path); let mut def: String = item.attrs .iter() @@ -329,13 +341,19 @@ impl<'a> RustdocAppender<'a> { .interleave_shortest(std::iter::repeat("\n")) .collect(); - self.append_header_for_inner_item("Struct", item, summary); + let (header_title, title) = match item.kind { + types::ItemKind::Union => ("Union", "union"), + types::ItemKind::Struct => ("Struct", "struct"), + _ => unreachable!("Unexpected struct kind"), + }; + + self.append_header_for_inner_item(header_title, item, summary); - write!(&mut def, "{}struct {}", meta, name) + write!(&mut def, "{}{} {}", meta, title, name) .expect("Writing to string succeeds"); let (start_tag, end_tag) = match struct_.struct_type { - types::StructType::Plain => ("{\n", "\n}"), - types::StructType::Tuple => ("(\n", "\n)"), + types::StructType::Plain => ("{\n", "}"), + types::StructType::Tuple => ("(\n", ")"), types::StructType::Unit => ("", ";"), }; @@ -358,6 +376,7 @@ impl<'a> RustdocAppender<'a> { def.push_str(": "); } def.push_str(&type_name); + def.push_str(",\n"); field_documentation.push((name, field, type_name, docs)); } else { // FIXME: should not occur. @@ -518,7 +537,7 @@ impl<'a> RustdocAppender<'a> { writeln!(&mut def, "{}enum {} {{", meta, enum_name) .expect("Writing to string succeeds"); - self.append_header_for_inner_item("Union", item, summary); + self.append_header_for_inner_item("Enum", item, summary); let mut variant_documentation = vec![]; for variant_id in &enum_.variants { @@ -529,7 +548,8 @@ impl<'a> RustdocAppender<'a> { docs, .. }) = krate.index.get(variant_id) { - let meta = Self::codify_visibility(visibility); + // Enum items do not have visibility for now.. + let _ = Self::codify_visibility(visibility); // FIXME: Different variant kinds. writeln!(&mut def, " {},", name) .expect("Writing to string succeeds"); From 9b7119f1a6eae1b57651e0b43ed46733e7d2072e Mon Sep 17 00:00:00 2001 From: Andreas Molzer Date: Sun, 24 Jan 2021 01:39:10 +0100 Subject: [PATCH 14/28] Add trait, to the best of current ability Some deficiencies mean we don't currently get all information. For example, qualifiers such as extern ABI and unsafe are dropped from methods and the information has_body is true even for provided methods. --- examples/crate/src/lib.rs | 25 +++++ src/frontend/rustdoc/mod.rs | 195 +++++++++++++++++++++++++++++++++--- 2 files changed, 207 insertions(+), 13 deletions(-) diff --git a/examples/crate/src/lib.rs b/examples/crate/src/lib.rs index abe0a0a..70666d3 100644 --- a/examples/crate/src/lib.rs +++ b/examples/crate/src/lib.rs @@ -24,11 +24,36 @@ pub enum AnEnum { }, } +/// Really, a simple union, basically MaybeUninit. pub union TestUnion { + /// Use this to make everything be uninitialized. pub a: (), pub b: usize, } +/// An amazing trait item with a few features. +pub trait ThisIsATrait: Clone { + /// An associated constant. + const CONSTANT: usize; + /// An associated type. + type Type: Copy; + /// An ordinary method taking `&self`. + fn method(&self, param: usize); + /// A generic method with explicit bound. + fn generic(&self, t: T) -> usize + where T: Copy; + /// An ordinary static method. + fn static_method(a: usize); + /// A method that should have an unsafe qualifier. + unsafe fn unsafe_method(); + /// A method that should have extern "C". + extern "C" fn extern_method(); + /// A method provided by default by the trait. + fn provided(&self) -> usize { + 0 + } +} + /// A normal function. pub fn function_item(param: usize) -> ReturnType { ReturnType diff --git a/src/frontend/rustdoc/mod.rs b/src/frontend/rustdoc/mod.rs index 7bdec0c..09233a8 100644 --- a/src/frontend/rustdoc/mod.rs +++ b/src/frontend/rustdoc/mod.rs @@ -35,6 +35,7 @@ struct RustdocAppender<'a> { stack: Vec, /// A buffer of events, yielded before continuing with the stack. buffered: VecDeque>, + diagnostics: Arc>, } pub enum Crate { @@ -158,9 +159,9 @@ impl<'a> Rustdoc<'a> { pub fn new(cfg: &'a Config, krate: types::Crate, diagnostics: Arc>) -> Rustdoc<'a> { Rustdoc { cfg, - diagnostics, + diagnostics: Arc::clone(&diagnostics), krate, - appender: RustdocAppender::default(), + appender: RustdocAppender::new(diagnostics), } } } @@ -197,6 +198,9 @@ impl<'a> Rustdoc<'a> { Item { inner: ItemEnum::FunctionItem(inner), .. } => { self.appender.function(krate, item, inner); }, + Item { inner: ItemEnum::TraitItem(inner), .. } => { + self.appender.trait_(krate, item, inner); + }, Item { kind: types::ItemKind::Primitive, .. } | Item { kind: types::ItemKind::Keyword, .. } => {}, _ => eprintln!("Unimplemented {:?}", item), @@ -208,7 +212,7 @@ impl<'a> Rustdoc<'a> { /// Invoked when we encounter an unexpected item/reference. fn invalid_item(&mut self, what: Traversal) { - let mut builder = self.diagnostics + let mut builder = self.appender.diagnostics .bug("Unexpected item in rustdoc json output") .note(format!("Traversing {:?}", what)); @@ -226,16 +230,15 @@ impl<'a> Rustdoc<'a> { } } -impl Default for RustdocAppender<'_> { - fn default() -> Self { +impl<'a> RustdocAppender<'a> { + fn new(diagnostics: Arc>) -> Self { RustdocAppender { stack: vec![Traversal::Root], buffered: VecDeque::new(), + diagnostics, } } -} -impl<'a> RustdocAppender<'a> { fn root(&mut self, krate: &types::Crate) { let label = self.label_for_id(&krate.root, krate).unwrap(); let header = frontend::Header { @@ -392,6 +395,12 @@ impl<'a> RustdocAppender<'a> { self.buffered.push_back(Event::Text(Cow::Owned(def))); self.buffered.push_back(Event::End(Tag::CodeBlock(Self::RUST_CODE_BLOCK))); + if !item.docs.is_empty() { + self.buffered.push_back(Event::Start(Tag::Paragraph)); + self.buffered.push_back(Event::Text(item.docs.clone().into())); + self.buffered.push_back(Event::End(Tag::Paragraph)); + } + // FIXME: we would like a level-4 header.. if !field_documentation.is_empty() { self.buffered.push_back(Event::Start(Tag::Paragraph)); @@ -419,12 +428,6 @@ impl<'a> RustdocAppender<'a> { self.buffered.push_back(Event::End(Tag::Paragraph)); } - - if !item.docs.is_empty() { - self.buffered.push_back(Event::Start(Tag::Paragraph)); - self.buffered.push_back(Event::Text(item.docs.clone().into())); - self.buffered.push_back(Event::End(Tag::Paragraph)); - } } fn constant(&mut self, krate: &types::Crate, item: &Item, constant: &types::Constant) { @@ -500,6 +503,8 @@ impl<'a> RustdocAppender<'a> { self.append_header_for_inner_item("Function", item, summary); let meta = Self::codify_visibility(&item.visibility); + // FIXME(rustdoc): `unsafe` qualifier. + // FIXME(rustdoc): `const` qualifier. let abi = Self::codify_abi(&function.abi); let signature = Self::codify_fn_decl(krate, &function.decl); // FIXME: generics, bounds. @@ -568,6 +573,12 @@ impl<'a> RustdocAppender<'a> { self.buffered.push_back(Event::Text(Cow::Owned(def))); self.buffered.push_back(Event::End(Tag::CodeBlock(Self::RUST_CODE_BLOCK))); + if !item.docs.is_empty() { + self.buffered.push_back(Event::Start(Tag::Paragraph)); + self.buffered.push_back(Event::Text(item.docs.clone().into())); + self.buffered.push_back(Event::End(Tag::Paragraph)); + } + // FIXME: we would like a level-4 header.. if !variant_documentation.is_empty() { self.buffered.push_back(Event::Start(Tag::Paragraph)); @@ -591,12 +602,147 @@ impl<'a> RustdocAppender<'a> { self.buffered.push_back(Event::End(Tag::Paragraph)); } + } + + fn trait_(&mut self, krate: &types::Crate, item: &Item, trait_: &types::Trait) { + let summary = krate.paths.get(&item.id) + // FIXME: this should fail and diagnose the rendering process, not panic. + .expect("Bad item ID"); + + // Avoid allocating too much below.. + if trait_.items.len() >= 1_000_000 { + panic!("Number of fields too large, considering opening a pull request to turn this into an iterative procedure."); + } + + let vis = Self::codify_visibility(&item.visibility); + let safe = if trait_.is_unsafe { "unsafe " } else { "" }; + let auto = if trait_.is_auto { "auto " } else { "" }; + let trait_name = item.name.as_ref() + .expect("Trait without name"); + + let mut def: String = item.attrs + .iter() + .map(String::as_str) + .interleave_shortest(std::iter::repeat("\n")) + .collect(); + + write!(&mut def, "{}{}{}trait {} ", vis, safe, auto, trait_name) + .expect("Writing to string succeeds"); + self.append_header_for_inner_item("Trait", item, summary); + + // TODO: print replication of definition. + let mut trait_items = vec![]; + // FIXME: bounds + def.push_str("{\n"); + for item_id in &trait_.items { + match krate.index.get(item_id) { + Some(Item { + inner: ItemEnum::AssocTypeItem { bounds, default }, + name: Some(name), + docs, + .. + }) => { + def.push_str(" type "); + def.push_str(name); + let mut bounds = bounds.iter(); + if let Some(first) = bounds.next() { + def.push_str(": "); + def.push_str(&self.codify_bound(krate, first)); + for rest in bounds { + def.push_str(" + "); + def.push_str(&self.codify_bound(krate, rest)); + } + } + if let Some(type_) = default { + def.push_str(" = "); + def.push_str(&Self::codify_type(krate, type_)); + } + def.push_str(";\n"); + + trait_items.push((name, docs)); + } + Some(Item { + inner: ItemEnum::AssocConstItem { type_, default }, + name: Some(name), + docs, + .. + }) => { + def.push_str(" "); + def.push_str(name); + def.push_str(": "); + let type_ = Self::codify_type(krate, type_); + def.push_str(&type_); + if let Some(default) = &default { + def.push_str(" = "); + def.push_str(default); + } + def.push_str(";\n"); + + trait_items.push((name, docs)); + } + Some(Item { + inner: ItemEnum::MethodItem(method), + name: Some(name), + docs, + .. + }) => { + def.push_str(" "); + def.push_str("fn "); + def.push_str(name); + // FIXME: generics + let type_ = Self::codify_fn_decl(krate, &method.decl); + // FIXME(rustdoc): ABI?! + def.push_str(&type_); + // FIXME(rustdoc): show if it is defaulted?; as alternative for this terminator if so. + def.push_str(";\n"); + + trait_items.push((name, docs)); + } + Some(other) => { + self.diagnostics + .warning(format!("Unhandled trait item: {:?}", other)) + .note(format!("In {}", self.name_for_item_at_path(&summary.path))) + .emit(); + } + None => unreachable!("Trait item does not exist?"), + } + } + + self.buffered.push_back(Event::Start(Tag::CodeBlock(Self::RUST_CODE_BLOCK))); + self.buffered.push_back(Event::Text(Cow::Owned(def))); + self.buffered.push_back(Event::End(Tag::CodeBlock(Self::RUST_CODE_BLOCK))); if !item.docs.is_empty() { self.buffered.push_back(Event::Start(Tag::Paragraph)); self.buffered.push_back(Event::Text(item.docs.clone().into())); self.buffered.push_back(Event::End(Tag::Paragraph)); } + + // TODO: differentiate between constants, types, required methods, provided methods + // FIXME: we would like a level-4 header.. + if !trait_items.is_empty() { + self.buffered.push_back(Event::Start(Tag::Paragraph)); + self.buffered.push_back(Event::Start(Tag::InlineEmphasis)); + self.buffered.push_back(Event::Text(Cow::Borrowed("Associated items"))); + self.buffered.push_back(Event::End(Tag::InlineEmphasis)); + self.buffered.push_back(Event::End(Tag::Paragraph)); + } + + // FIXME: add full declaration with links. + for (name, docs) in trait_items { + self.buffered.push_back(Event::Start(Tag::Paragraph)); + + self.buffered.push_back(Event::Start(Tag::InlineCode)); + // FIXME: struct variants, including links. + self.buffered.push_back(Event::Text(Cow::Owned(name.clone()))); + self.buffered.push_back(Event::End(Tag::InlineCode)); + + self.buffered.push_back(Event::Text(Cow::Borrowed(" "))); + // FIXME: treat as recursive markdown? + self.buffered.push_back(Event::Text(Cow::Owned(docs.clone()))); + + self.buffered.push_back(Event::End(Tag::Paragraph)); + } } fn label_for_id(&self, path: &types::Id, krate: &types::Crate) -> Option { @@ -753,6 +899,29 @@ impl<'a> RustdocAppender<'a> { decl } + fn codify_bound(&self, krate: &types::Crate, bound: &types::GenericBound) -> String { + match bound { + types::GenericBound::Outlives(lifetime) => lifetime.clone(), + types::GenericBound::TraitBound { trait_, generic_params, modifier } => { + if let types::TraitBoundModifier::None = modifier {} else { + self.diagnostics + .warning("Trait bound modifiers are not implemented") + .note(format!("Printing {:?}", modifier)) + .emit(); + }; + + if !generic_params.is_empty() { + self.diagnostics + .warning("Generic parameters are not implemented") + .note(format!("Omitting {} parameters for {:?}", generic_params.len(), trait_)) + .emit(); + } + + Self::codify_type(krate, trait_) + } + } + } + fn name_for_item_at_path(&self, path: &[String]) -> String { path.join("::") } From dc8844416f3c6947eacbafed79611e662bda7e33 Mon Sep 17 00:00:00 2001 From: Andreas Molzer Date: Sun, 24 Jan 2021 01:57:01 +0100 Subject: [PATCH 15/28] Fix small inconsistencies in traits and methods --- src/frontend/rustdoc/mod.rs | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/src/frontend/rustdoc/mod.rs b/src/frontend/rustdoc/mod.rs index 09233a8..ae70633 100644 --- a/src/frontend/rustdoc/mod.rs +++ b/src/frontend/rustdoc/mod.rs @@ -503,12 +503,10 @@ impl<'a> RustdocAppender<'a> { self.append_header_for_inner_item("Function", item, summary); let meta = Self::codify_visibility(&item.visibility); - // FIXME(rustdoc): `unsafe` qualifier. - // FIXME(rustdoc): `const` qualifier. let abi = Self::codify_abi(&function.abi); let signature = Self::codify_fn_decl(krate, &function.decl); // FIXME: generics, bounds. - let def = format!("{}{}fn {}{}", meta, abi, name, signature); + let def = format!("{}{}{}fn {}{}", meta, &function.header, abi, name, signature); self.buffered.push_back(Event::Start(Tag::CodeBlock(Self::RUST_CODE_BLOCK))); self.buffered.push_back(Event::Text(Cow::Owned(def))); @@ -687,11 +685,11 @@ impl<'a> RustdocAppender<'a> { .. }) => { def.push_str(" "); + def.push_str(&method.header); def.push_str("fn "); def.push_str(name); // FIXME: generics let type_ = Self::codify_fn_decl(krate, &method.decl); - // FIXME(rustdoc): ABI?! def.push_str(&type_); // FIXME(rustdoc): show if it is defaulted?; as alternative for this terminator if so. def.push_str(";\n"); @@ -707,6 +705,7 @@ impl<'a> RustdocAppender<'a> { None => unreachable!("Trait item does not exist?"), } } + def.push('}'); self.buffered.push_back(Event::Start(Tag::CodeBlock(Self::RUST_CODE_BLOCK))); self.buffered.push_back(Event::Text(Cow::Owned(def))); From 0d13830f847d610e6769d5f7a720a5ecc845766e Mon Sep 17 00:00:00 2001 From: Andreas Molzer Date: Sun, 24 Jan 2021 16:13:09 +0100 Subject: [PATCH 16/28] Add impl items for struct, enum, traits --- examples/crate/src/lib.rs | 27 ++++++++ src/frontend/rustdoc/mod.rs | 134 ++++++++++++++++++++++++++++++++++++ 2 files changed, 161 insertions(+) diff --git a/examples/crate/src/lib.rs b/examples/crate/src/lib.rs index 70666d3..f2dfe49 100644 --- a/examples/crate/src/lib.rs +++ b/examples/crate/src/lib.rs @@ -54,6 +54,33 @@ pub trait ThisIsATrait: Clone { } } +pub trait EasyToImpl { + /// A type that must be declared. + type ToDeclare: Clone; + /// A constant attribute that needs to be defined. + const An_ATTRIBTE: usize; + /// A method you do need to impl. + fn method_to_impl(&self); + /// A provided method you do not need to impl. + fn method_not_to_impl(&self) {} +} + +impl KindOfReprC { + pub const CONSTANT: usize = 0; + + /// An associated method of KindOfReprC + pub fn new() -> Self { + KindOfReprC(0) + } +} + +/// Implements the EasyToImpl trait for KindOfReprC. +impl EasyToImpl for KindOfReprC { + type ToDeclare = usize; + const An_ATTRIBTE: usize = 0; + fn method_to_impl(&self) {} +} + /// A normal function. pub fn function_item(param: usize) -> ReturnType { ReturnType diff --git a/src/frontend/rustdoc/mod.rs b/src/frontend/rustdoc/mod.rs index ae70633..5f12e16 100644 --- a/src/frontend/rustdoc/mod.rs +++ b/src/frontend/rustdoc/mod.rs @@ -201,6 +201,9 @@ impl<'a> Rustdoc<'a> { Item { inner: ItemEnum::TraitItem(inner), .. } => { self.appender.trait_(krate, item, inner); }, + Item { inner: ItemEnum::ImplItem(inner), .. } => { + self.appender.impl_(krate, item, inner); + }, Item { kind: types::ItemKind::Primitive, .. } | Item { kind: types::ItemKind::Keyword, .. } => {}, _ => eprintln!("Unimplemented {:?}", item), @@ -428,6 +431,10 @@ impl<'a> RustdocAppender<'a> { self.buffered.push_back(Event::End(Tag::Paragraph)); } + + for impl_ in struct_.impls.iter().rev() { + self.stack.push(Traversal::Item(impl_.clone())); + } } fn constant(&mut self, krate: &types::Crate, item: &Item, constant: &types::Constant) { @@ -600,6 +607,10 @@ impl<'a> RustdocAppender<'a> { self.buffered.push_back(Event::End(Tag::Paragraph)); } + + for impl_ in enum_.impls.iter().rev() { + self.stack.push(Traversal::Item(impl_.clone())); + } } fn trait_(&mut self, krate: &types::Crate, item: &Item, trait_: &types::Trait) { @@ -744,6 +755,129 @@ impl<'a> RustdocAppender<'a> { } } + fn impl_(&mut self, krate: &types::Crate, item: &Item, impl_: &types::Impl) { + let mut impl_header = String::from("impl"); + // FIXME: generics + impl_header.push(' '); + if let Some(trait_) = &impl_.trait_ { + if impl_.negative { + impl_header.push('!'); + } + impl_header.push_str(&Self::codify_type(krate, trait_)); + impl_header.push_str(" for "); + } + impl_header.push_str(&Self::codify_type(krate, &impl_.for_)); + + self.buffered.push_back(Event::Start(Tag::Paragraph)); + self.buffered.push_back(Event::Start(Tag::InlineCode)); + self.buffered.push_back(Event::Text(Cow::Owned(impl_header))); + self.buffered.push_back(Event::End(Tag::InlineCode)); + self.buffered.push_back(Event::End(Tag::Paragraph)); + + if !item.docs.is_empty() { + self.buffered.push_back(Event::Start(Tag::Paragraph)); + self.buffered.push_back(Event::Text(item.docs.clone().into())); + self.buffered.push_back(Event::End(Tag::Paragraph)); + } + + let mut impl_items = vec![]; + + for item_id in &impl_.items { + match krate.index.get(item_id) { + Some(Item { + inner: ItemEnum::TypedefItem(typedef), + name: Some(name), + visibility, + docs, + .. + }) => { + let meta = Self::codify_visibility(visibility); + let mut def = format!("{}type ", meta); + def.push_str(name); + def.push_str(" = "); + def.push_str(&Self::codify_type(krate, &typedef.type_)); + def.push_str(";\n"); + + impl_items.push((name, def, docs)); + } + Some(Item { + inner: ItemEnum::ConstantItem(const_), + name: Some(name), + visibility, + docs, + .. + }) => { + let meta = Self::codify_visibility(visibility); + let mut def = format!("{}const ", meta); + def.push_str(name); + def.push_str(": "); + def.push_str(&Self::codify_type(krate, &const_.type_)); + def.push_str(" = "); + def.push_str(&const_.expr); + def.push_str(";\n"); + + impl_items.push((name, def, docs)); + } + // FIXME(rustdoc): this is only due to an internal bug in rustdoc where associated + // constants ( impl Type { pub const A: usize = 0 ) appear as AssocConstItem + // instead which would be more appropriate for a trait. + Some(Item { + inner: ItemEnum::AssocConstItem { type_, default: Some(const_def) }, + name: Some(name), + visibility, + docs, + .. + }) => { + let meta = Self::codify_visibility(visibility); + let mut def = format!("{}const ", meta); + def.push_str(name); + def.push_str(": "); + def.push_str(&Self::codify_type(krate, type_)); + def.push_str(" = "); + def.push_str(&const_def); + def.push_str(";\n"); + + impl_items.push((name, def, docs)); + } + Some(Item { + inner: ItemEnum::MethodItem(method), + name: Some(name), + visibility, + docs, + .. + }) => { + let meta = Self::codify_visibility(visibility); + let mut def = format!("{}{}fn ", meta, &method.header); + def.push_str(name); + // FIXME: generics + def.push_str(&Self::codify_fn_decl(krate, &method.decl)); + + impl_items.push((name, def, docs)); + } + Some(other) => { + self.diagnostics + .warning(format!("Unhandled impl item: {:?}", other)) + .emit(); + } + None => unreachable!("Trait item does not exist?"), + } + } + + for (name, definition, docs) in impl_items { + self.buffered.push_back(Event::Start(Tag::Paragraph)); + self.buffered.push_back(Event::Start(Tag::InlineCode)); + self.buffered.push_back(Event::Text(Cow::Owned(definition))); + self.buffered.push_back(Event::End(Tag::InlineCode)); + self.buffered.push_back(Event::End(Tag::Paragraph)); + + if !item.docs.is_empty() { + self.buffered.push_back(Event::Start(Tag::Paragraph)); + self.buffered.push_back(Event::Text(item.docs.clone().into())); + self.buffered.push_back(Event::End(Tag::Paragraph)); + } + } + } + fn label_for_id(&self, path: &types::Id, krate: &types::Crate) -> Option { match krate.paths.get(path) { Some(summary) => Some(self.label_for_item_at_path(&summary.path)), From a20820d8070632df09fc399f9a4c7befe144f77b Mon Sep 17 00:00:00 2001 From: Andreas Molzer Date: Sun, 24 Jan 2021 17:08:20 +0100 Subject: [PATCH 17/28] Add support for typedefs --- examples/crate/src/lib.rs | 3 ++ src/frontend/rustdoc/mod.rs | 102 +++++++++++++++++++++++++----------- 2 files changed, 73 insertions(+), 32 deletions(-) diff --git a/examples/crate/src/lib.rs b/examples/crate/src/lib.rs index f2dfe49..88bde99 100644 --- a/examples/crate/src/lib.rs +++ b/examples/crate/src/lib.rs @@ -31,6 +31,9 @@ pub union TestUnion { pub b: usize, } +/// This is a simple typdef, don't worry. +pub type TypeDef = KindOfReprC; + /// An amazing trait item with a few features. pub trait ThisIsATrait: Clone { /// An associated constant. diff --git a/src/frontend/rustdoc/mod.rs b/src/frontend/rustdoc/mod.rs index 5f12e16..75a4c76 100644 --- a/src/frontend/rustdoc/mod.rs +++ b/src/frontend/rustdoc/mod.rs @@ -204,6 +204,9 @@ impl<'a> Rustdoc<'a> { Item { inner: ItemEnum::ImplItem(inner), .. } => { self.appender.impl_(krate, item, inner); }, + Item { inner: ItemEnum::TypedefItem(inner), .. } => { + self.appender.typedef(krate, item, inner); + }, Item { kind: types::ItemKind::Primitive, .. } | Item { kind: types::ItemKind::Keyword, .. } => {}, _ => eprintln!("Unimplemented {:?}", item), @@ -366,26 +369,33 @@ impl<'a> RustdocAppender<'a> { def.push_str(start_tag); let mut field_documentation = vec![]; for field_id in &struct_.fields { - if let Some(Item { - inner: ItemEnum::StructFieldItem(field), - name: Some(name), - visibility, - docs, - .. - }) = krate.index.get(field_id) { - let meta = Self::codify_visibility(visibility); - let type_name = Self::codify_type(krate, field); - def.push_str(" "); - def.push_str(&meta); - if let types::StructType::Tuple = struct_.struct_type {} else { - def.push_str(name); - def.push_str(": "); + match krate.index.get(field_id) { + Some(Item { + inner: ItemEnum::StructFieldItem(field), + name: Some(name), + visibility, + docs, + .. + }) => { + let meta = Self::codify_visibility(visibility); + let type_name = Self::codify_type(krate, field); + def.push_str(" "); + def.push_str(&meta); + if let types::StructType::Tuple = struct_.struct_type {} else { + def.push_str(name); + def.push_str(": "); + } + def.push_str(&type_name); + def.push_str(",\n"); + field_documentation.push((name, field, type_name, docs)); } - def.push_str(&type_name); - def.push_str(",\n"); - field_documentation.push((name, field, type_name, docs)); - } else { - // FIXME: should not occur. + Some(other) => { + self.diagnostics + .warning(format!("Unhandled variant item: {:?}", other)) + .note(format!("In enum {}", self.name_for_item_at_path(&summary.path))) + .emit(); + } + None => unreachable!("Enum item does not exist?"), } } @@ -407,9 +417,9 @@ impl<'a> RustdocAppender<'a> { // FIXME: we would like a level-4 header.. if !field_documentation.is_empty() { self.buffered.push_back(Event::Start(Tag::Paragraph)); - self.buffered.push_back(Event::Start(Tag::InlineEmphasis)); + self.buffered.push_back(Event::Start(Tag::InlineStrong)); self.buffered.push_back(Event::Text(Cow::Borrowed("Fields"))); - self.buffered.push_back(Event::End(Tag::InlineEmphasis)); + self.buffered.push_back(Event::End(Tag::InlineStrong)); self.buffered.push_back(Event::End(Tag::Paragraph)); } @@ -587,9 +597,9 @@ impl<'a> RustdocAppender<'a> { // FIXME: we would like a level-4 header.. if !variant_documentation.is_empty() { self.buffered.push_back(Event::Start(Tag::Paragraph)); - self.buffered.push_back(Event::Start(Tag::InlineEmphasis)); + self.buffered.push_back(Event::Start(Tag::InlineStrong)); self.buffered.push_back(Event::Text(Cow::Borrowed("Variants"))); - self.buffered.push_back(Event::End(Tag::InlineEmphasis)); + self.buffered.push_back(Event::End(Tag::InlineStrong)); self.buffered.push_back(Event::End(Tag::Paragraph)); } @@ -732,9 +742,9 @@ impl<'a> RustdocAppender<'a> { // FIXME: we would like a level-4 header.. if !trait_items.is_empty() { self.buffered.push_back(Event::Start(Tag::Paragraph)); - self.buffered.push_back(Event::Start(Tag::InlineEmphasis)); + self.buffered.push_back(Event::Start(Tag::InlineStrong)); self.buffered.push_back(Event::Text(Cow::Borrowed("Associated items"))); - self.buffered.push_back(Event::End(Tag::InlineEmphasis)); + self.buffered.push_back(Event::End(Tag::InlineStrong)); self.buffered.push_back(Event::End(Tag::Paragraph)); } @@ -792,7 +802,7 @@ impl<'a> RustdocAppender<'a> { .. }) => { let meta = Self::codify_visibility(visibility); - let mut def = format!("{}type ", meta); + let mut def = format!(" {}type ", meta); def.push_str(name); def.push_str(" = "); def.push_str(&Self::codify_type(krate, &typedef.type_)); @@ -808,7 +818,7 @@ impl<'a> RustdocAppender<'a> { .. }) => { let meta = Self::codify_visibility(visibility); - let mut def = format!("{}const ", meta); + let mut def = format!(" {}const ", meta); def.push_str(name); def.push_str(": "); def.push_str(&Self::codify_type(krate, &const_.type_)); @@ -829,12 +839,12 @@ impl<'a> RustdocAppender<'a> { .. }) => { let meta = Self::codify_visibility(visibility); - let mut def = format!("{}const ", meta); + let mut def = format!(" {}const ", meta); def.push_str(name); def.push_str(": "); def.push_str(&Self::codify_type(krate, type_)); def.push_str(" = "); - def.push_str(&const_def); + def.push_str(const_def); def.push_str(";\n"); impl_items.push((name, def, docs)); @@ -847,7 +857,7 @@ impl<'a> RustdocAppender<'a> { .. }) => { let meta = Self::codify_visibility(visibility); - let mut def = format!("{}{}fn ", meta, &method.header); + let mut def = format!(" {}{}fn ", meta, &method.header); def.push_str(name); // FIXME: generics def.push_str(&Self::codify_fn_decl(krate, &method.decl)); @@ -863,7 +873,7 @@ impl<'a> RustdocAppender<'a> { } } - for (name, definition, docs) in impl_items { + for (_name, definition, docs) in impl_items { self.buffered.push_back(Event::Start(Tag::Paragraph)); self.buffered.push_back(Event::Start(Tag::InlineCode)); self.buffered.push_back(Event::Text(Cow::Owned(definition))); @@ -872,12 +882,40 @@ impl<'a> RustdocAppender<'a> { if !item.docs.is_empty() { self.buffered.push_back(Event::Start(Tag::Paragraph)); - self.buffered.push_back(Event::Text(item.docs.clone().into())); + self.buffered.push_back(Event::Text(docs.clone().into())); self.buffered.push_back(Event::End(Tag::Paragraph)); } } } + fn typedef(&mut self, krate: &types::Crate, item: &Item, typedef: &types::Typedef) { + let summary = krate.paths.get(&item.id) + // FIXME: this should fail and diagnose the rendering process, not panic. + .expect("Bad item ID"); + let name = item.name + .as_ref() + .expect("Typedef without name"); + + self.append_header_for_inner_item("Typedef", item, summary); + + let meta = Self::codify_visibility(&item.visibility); + let mut def = format!("{}type ", meta); + def.push_str(name); + def.push_str(" = "); + def.push_str(&Self::codify_type(krate, &typedef.type_)); + def.push(';'); + + self.buffered.push_back(Event::Start(Tag::CodeBlock(Self::RUST_CODE_BLOCK))); + self.buffered.push_back(Event::Text(Cow::Owned(def))); + self.buffered.push_back(Event::End(Tag::CodeBlock(Self::RUST_CODE_BLOCK))); + + if !item.docs.is_empty() { + self.buffered.push_back(Event::Start(Tag::Paragraph)); + self.buffered.push_back(Event::Text(item.docs.clone().into())); + self.buffered.push_back(Event::End(Tag::Paragraph)); + } + } + fn label_for_id(&self, path: &types::Id, krate: &types::Crate) -> Option { match krate.paths.get(path) { Some(summary) => Some(self.label_for_item_at_path(&summary.path)), From 8ef0f1cd64458905baa9eb865ca9970291c92f95 Mon Sep 17 00:00:00 2001 From: Andreas Molzer Date: Sun, 24 Jan 2021 18:54:27 +0100 Subject: [PATCH 18/28] Implement remaining type kinds Trait bounds and generics are still missing. Unifies the way that impls are scheduled such that we might group them soon. --- src/frontend/rustdoc/mod.rs | 137 +++++++++++++++++++++++++----------- 1 file changed, 97 insertions(+), 40 deletions(-) diff --git a/src/frontend/rustdoc/mod.rs b/src/frontend/rustdoc/mod.rs index 75a4c76..02dfc6b 100644 --- a/src/frontend/rustdoc/mod.rs +++ b/src/frontend/rustdoc/mod.rs @@ -378,7 +378,7 @@ impl<'a> RustdocAppender<'a> { .. }) => { let meta = Self::codify_visibility(visibility); - let type_name = Self::codify_type(krate, field); + let type_name = self.codify_type(krate, field); def.push_str(" "); def.push_str(&meta); if let types::StructType::Tuple = struct_.struct_type {} else { @@ -442,9 +442,7 @@ impl<'a> RustdocAppender<'a> { self.buffered.push_back(Event::End(Tag::Paragraph)); } - for impl_ in struct_.impls.iter().rev() { - self.stack.push(Traversal::Item(impl_.clone())); - } + self.append_impls(krate, item, &struct_.impls); } fn constant(&mut self, krate: &types::Crate, item: &Item, constant: &types::Constant) { @@ -461,7 +459,7 @@ impl<'a> RustdocAppender<'a> { _ => panic!("Const without a name"), } def.push_str(": "); - def.push_str(&Self::codify_type(krate, &constant.type_)); + def.push_str(&self.codify_type(krate, &constant.type_)); def.push_str(" = "); // TODO: what about constant.value?? def.push_str(&constant.expr); @@ -495,7 +493,7 @@ impl<'a> RustdocAppender<'a> { _ => panic!("Static without a name"), } def.push_str(": "); - def.push_str(&Self::codify_type(krate, &constant.type_)); + def.push_str(&self.codify_type(krate, &constant.type_)); // TODO: or don't ignore `expr`? def.push(';'); @@ -521,7 +519,7 @@ impl<'a> RustdocAppender<'a> { let meta = Self::codify_visibility(&item.visibility); let abi = Self::codify_abi(&function.abi); - let signature = Self::codify_fn_decl(krate, &function.decl); + let signature = self.codify_fn_decl(krate, &function.decl); // FIXME: generics, bounds. let def = format!("{}{}{}fn {}{}", meta, &function.header, abi, name, signature); @@ -618,9 +616,7 @@ impl<'a> RustdocAppender<'a> { self.buffered.push_back(Event::End(Tag::Paragraph)); } - for impl_ in enum_.impls.iter().rev() { - self.stack.push(Traversal::Item(impl_.clone())); - } + self.append_impls(krate, item, &enum_.impls); } fn trait_(&mut self, krate: &types::Crate, item: &Item, trait_: &types::Trait) { @@ -666,15 +662,15 @@ impl<'a> RustdocAppender<'a> { let mut bounds = bounds.iter(); if let Some(first) = bounds.next() { def.push_str(": "); - def.push_str(&self.codify_bound(krate, first)); + def.push_str(&self.codify_generic_bound(krate, first)); for rest in bounds { def.push_str(" + "); - def.push_str(&self.codify_bound(krate, rest)); + def.push_str(&self.codify_generic_bound(krate, rest)); } } if let Some(type_) = default { def.push_str(" = "); - def.push_str(&Self::codify_type(krate, type_)); + def.push_str(&self.codify_type(krate, type_)); } def.push_str(";\n"); @@ -689,7 +685,7 @@ impl<'a> RustdocAppender<'a> { def.push_str(" "); def.push_str(name); def.push_str(": "); - let type_ = Self::codify_type(krate, type_); + let type_ = self.codify_type(krate, type_); def.push_str(&type_); if let Some(default) = &default { def.push_str(" = "); @@ -710,7 +706,7 @@ impl<'a> RustdocAppender<'a> { def.push_str("fn "); def.push_str(name); // FIXME: generics - let type_ = Self::codify_fn_decl(krate, &method.decl); + let type_ = self.codify_fn_decl(krate, &method.decl); def.push_str(&type_); // FIXME(rustdoc): show if it is defaulted?; as alternative for this terminator if so. def.push_str(";\n"); @@ -773,10 +769,10 @@ impl<'a> RustdocAppender<'a> { if impl_.negative { impl_header.push('!'); } - impl_header.push_str(&Self::codify_type(krate, trait_)); + impl_header.push_str(&self.codify_type(krate, trait_)); impl_header.push_str(" for "); } - impl_header.push_str(&Self::codify_type(krate, &impl_.for_)); + impl_header.push_str(&self.codify_type(krate, &impl_.for_)); self.buffered.push_back(Event::Start(Tag::Paragraph)); self.buffered.push_back(Event::Start(Tag::InlineCode)); @@ -805,7 +801,7 @@ impl<'a> RustdocAppender<'a> { let mut def = format!(" {}type ", meta); def.push_str(name); def.push_str(" = "); - def.push_str(&Self::codify_type(krate, &typedef.type_)); + def.push_str(&self.codify_type(krate, &typedef.type_)); def.push_str(";\n"); impl_items.push((name, def, docs)); @@ -821,7 +817,7 @@ impl<'a> RustdocAppender<'a> { let mut def = format!(" {}const ", meta); def.push_str(name); def.push_str(": "); - def.push_str(&Self::codify_type(krate, &const_.type_)); + def.push_str(&self.codify_type(krate, &const_.type_)); def.push_str(" = "); def.push_str(&const_.expr); def.push_str(";\n"); @@ -842,7 +838,7 @@ impl<'a> RustdocAppender<'a> { let mut def = format!(" {}const ", meta); def.push_str(name); def.push_str(": "); - def.push_str(&Self::codify_type(krate, type_)); + def.push_str(&self.codify_type(krate, type_)); def.push_str(" = "); def.push_str(const_def); def.push_str(";\n"); @@ -860,7 +856,7 @@ impl<'a> RustdocAppender<'a> { let mut def = format!(" {}{}fn ", meta, &method.header); def.push_str(name); // FIXME: generics - def.push_str(&Self::codify_fn_decl(krate, &method.decl)); + def.push_str(&self.codify_fn_decl(krate, &method.decl)); impl_items.push((name, def, docs)); } @@ -902,7 +898,7 @@ impl<'a> RustdocAppender<'a> { let mut def = format!("{}type ", meta); def.push_str(name); def.push_str(" = "); - def.push_str(&Self::codify_type(krate, &typedef.type_)); + def.push_str(&self.codify_type(krate, &typedef.type_)); def.push(';'); self.buffered.push_back(Event::Start(Tag::CodeBlock(Self::RUST_CODE_BLOCK))); @@ -941,22 +937,36 @@ impl<'a> RustdocAppender<'a> { } } - fn codify_type(krate: &types::Crate, type_: &types::Type) -> String { + fn codify_type(&self, krate: &types::Crate, type_: &types::Type) -> String { #[allow(clippy::enum_glob_use)] use types::Type::*; match type_ { ResolvedPath { name, args, param_names, .. } => { + // FIXME: when name is empty, then the type should be named through its path! + // That happens in things such as: + // ``` + // impl

Deref for Type

{ + // type Target =

::SomeType; + // } + // ``` + // + // Here the Target is described as a QualifiedPath and the `trait_` attribute + // refers to the `Trait` via a ResolvedPath without a name. let name = name.clone(); match args.as_ref().map(|a| &**a) { None => {}, Some(types::GenericArgs::AngleBracketed { args, bindings }) => { + self.diagnostics + .warning("Encountered generic type arguments, those are unimplemented") + .emit(); // Wait, do we need to map TypeBinding to args via names? // FIXME: handle them, important for showing structs. // todo!("Unhandled generic arguments to type"); } Some(types::GenericArgs::Parenthesized { .. }) => { - // FIXME: handle as error, probably? - todo!("Can this occur?"); + self.diagnostics + .warning("Encountered parenthesized type arguments, those are unimplemented") + .emit(); } } name @@ -968,53 +978,76 @@ impl<'a> RustdocAppender<'a> { None => return "()".into(), Some(first) => first, }; - let mut name = format!("({}", Self::codify_type(krate, first)); + let mut name = format!("({}", self.codify_type(krate, first)); for type_ in items { name.push(','); - name.push_str(&Self::codify_type(krate, type_)); + name.push_str(&self.codify_type(krate, type_)); } name.push(')'); name }, - Slice(inner) => format!("[{}]", Self::codify_type(krate, inner)), + Slice(inner) => format!("[{}]", self.codify_type(krate, inner)), Array { type_, len } => { - format!("[{}; {}]", Self::codify_type(krate, type_), len) + format!("[{}; {}]", self.codify_type(krate, type_), len) }, // ImplTrait.. Never => "!".into(), Infer => "_".into(), RawPointer { mutable, type_ } => { let qualifier = if *mutable { "mut" } else { "const" }; - format!("*{} {}", qualifier, Self::codify_type(krate, type_)) + format!("*{} {}", qualifier, self.codify_type(krate, type_)) } BorrowedRef { lifetime, mutable, type_ } => { let lifetime = lifetime.as_ref().map_or_else(String::new, |st| format!("{} ", st)); let qualifier = if *mutable { "mut " } else { "" }; - let type_ = Self::codify_type(krate, type_); + let type_ = self.codify_type(krate, type_); format!("&{}{}{}", lifetime, qualifier, type_) } QualifiedPath { name, self_type, trait_ } => { - let self_type = Self::codify_type(krate, self_type); - let trait_ = Self::codify_type(krate, trait_); + let self_type = self.codify_type(krate, self_type); + let trait_ = self.codify_type(krate, trait_); format!("<{} as {}>::{}", self_type, trait_, name) } - // FIXME: where can we test this best? - ImplTrait(_) | FunctionPointer(_) => todo!("Not yet implemented kind of named type encountered"), + ImplTrait(bounds) => { + let mut bounds = bounds.iter(); + if let Some(first) = bounds.next() { + let mut bound = String::from("impl "); + bound.push_str(&self.codify_generic_bound(krate, first)); + for rest in bounds { + bound.push_str(" + "); + bound.push_str(&self.codify_generic_bound(krate, rest)); + } + bound + } else { + unreachable!("impl type without any named bounds"); + } + } + FunctionPointer(fnptr) => { + // FIXME: for<'a> lifetime parameters. + let mut base = String::from(if fnptr.is_unsafe { "unsafe " } else { "" }); + if !fnptr.abi.is_empty() { + base.push_str("extern "); + base.push_str(&fnptr.abi); + base.push(' '); + } + base.push_str(&self.codify_fn_decl(krate, &fnptr.decl)); + base + } } } - fn codify_fn_decl(krate: &types::Crate, decl: &types::FnDecl) -> String { + fn codify_fn_decl(&self, krate: &types::Crate, decl: &types::FnDecl) -> String { let inputs: Vec<_> = decl.inputs .iter() .map(|(name, type_)| { - format!("{}: {}", name, Self::codify_type(krate, type_)) + format!("{}: {}", name, self.codify_type(krate, type_)) }) .collect(); let in_len: usize = inputs.iter().map(|st| st.chars().count()).sum(); let output = if let Some(type_) = &decl.output { - format!(" -> {}", Self::codify_type(krate, type_)) + format!(" -> {}", self.codify_type(krate, type_)) } else { "".into() }; @@ -1070,7 +1103,7 @@ impl<'a> RustdocAppender<'a> { decl } - fn codify_bound(&self, krate: &types::Crate, bound: &types::GenericBound) -> String { + fn codify_generic_bound(&self, krate: &types::Crate, bound: &types::GenericBound) -> String { match bound { types::GenericBound::Outlives(lifetime) => lifetime.clone(), types::GenericBound::TraitBound { trait_, generic_params, modifier } => { @@ -1088,7 +1121,7 @@ impl<'a> RustdocAppender<'a> { .emit(); } - Self::codify_type(krate, trait_) + self.codify_type(krate, trait_) } } } @@ -1123,6 +1156,30 @@ impl<'a> RustdocAppender<'a> { self.buffered.push_back(Event::End(Tag::Header(header.clone()))); } + fn append_impls( + &mut self, + krate: &types::Crate, + item: &Item, + impls: &[types::Id], + ) { + // FIXME: differentiate by kind with headers + // let mut intrinsic = vec![]; + // let mut well_known = vec![]; + // let mut other_traits = vec![]; + + if !impls.is_empty() { + self.buffered.push_back(Event::Start(Tag::Paragraph)); + self.buffered.push_back(Event::Start(Tag::InlineStrong)); + self.buffered.push_back(Event::Text(Cow::Borrowed("Implementations"))); + self.buffered.push_back(Event::End(Tag::InlineStrong)); + self.buffered.push_back(Event::End(Tag::Paragraph)); + } + + for impl_ in impls.iter().rev() { + self.stack.push(Traversal::Item(impl_.clone())); + } + } + const RUST_CODE_BLOCK: frontend::CodeBlock<'static> = frontend::CodeBlock { label: None, caption: None, From 7a3a8e535909a0069d6cbb615dd8b85f1529a8d6 Mon Sep 17 00:00:00 2001 From: Andreas Molzer Date: Sun, 24 Jan 2021 23:13:25 +0100 Subject: [PATCH 19/28] Generic arguments and bounds --- examples/crate/src/lib.rs | 4 + examples/references.bib | 18 +++++ examples/rustdoc.pdf | Bin 0 -> 115630 bytes src/frontend/rustdoc/mod.rs | 144 +++++++++++++++++++++++++++++++++--- 4 files changed, 156 insertions(+), 10 deletions(-) create mode 100644 examples/references.bib create mode 100644 examples/rustdoc.pdf diff --git a/examples/crate/src/lib.rs b/examples/crate/src/lib.rs index 88bde99..8c3fbe9 100644 --- a/examples/crate/src/lib.rs +++ b/examples/crate/src/lib.rs @@ -34,6 +34,10 @@ pub union TestUnion { /// This is a simple typdef, don't worry. pub type TypeDef = KindOfReprC; +pub struct WithGenerics { + _kay: core::marker::PhantomData<(A, B)>, +} + /// An amazing trait item with a few features. pub trait ThisIsATrait: Clone { /// An associated constant. diff --git a/examples/references.bib b/examples/references.bib new file mode 100644 index 0000000..2d20fe1 --- /dev/null +++ b/examples/references.bib @@ -0,0 +1,18 @@ +@online{foo, + year = {2018}, + author = {{oberien}}, + title = {{Heradoc - Markdown to Latex / Pdf Converter}}, + url = {https://example.com/}, + urldate = {2018-09-18}, +} +@online{bar, + year = {1337}, + author = {{Author}}, + title = {Title}, + url = {url}, +} +@online{wikipedia-markdown, + title = {Markdown Logo}, + urldate = 2019-08-18, + url = {https://upload.wikimedia.org/wikipedia/commons/thumb/4/48/Markdown-mark.svg/208px-Markdown-mark.svg.png}, +} diff --git a/examples/rustdoc.pdf b/examples/rustdoc.pdf new file mode 100644 index 0000000000000000000000000000000000000000..3920c7308dc0cc05488306f3c5e5b7bf196c641d GIT binary patch literal 115630 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