Top Banner
@QuietMisdreavus 2018 The Dark Secrets Lurking Inside cargo doc @QuietMisdreavus 2018
45

The Dark Secrets Lurking Inside - quiet misdreavus

Mar 13, 2022

Download

Documents

dariahiddleston
Welcome message from author
This document is posted to help you gain knowledge. Please leave a comment to let me know what you think about it! Share it to your friends and learn new things together.
Transcript
Page 1: The Dark Secrets Lurking Inside - quiet misdreavus

@QuietMisdreavus 2018

The Dark SecretsLurking Insidecargo doc

@QuietMisdreavus 2018

Page 2: The Dark Secrets Lurking Inside - quiet misdreavus

@QuietMisdreavus 2018

“hey, i just met you...”

• @QuietMisdreavus // “grey” // they/them

• Rustdoc Team (lead), Docs Team

• Sharer of music

• Knitter of hats

• Some code things, I guess

@QuietMisdreavus 2018Lyric reference: Carly Rae Jepsen - “Call Me Maybe”

Page 3: The Dark Secrets Lurking Inside - quiet misdreavus

@QuietMisdreavus 2018

i like docs

@QuietMisdreavus 2018

Page 4: The Dark Secrets Lurking Inside - quiet misdreavus

@QuietMisdreavus 2018

i like docs… like, a lot

@QuietMisdreavus 2018

Page 5: The Dark Secrets Lurking Inside - quiet misdreavus

@QuietMisdreavus 2018

i like docs… like, maybe too much

@QuietMisdreavus 2018

Page 6: The Dark Secrets Lurking Inside - quiet misdreavus

@QuietMisdreavus 2018

“...and this is crazy...”

• Become a Docs Power User (tm)

• Deny lints on your doctests

• Document all your platforms at once

• Cover your docs in ponies

• Peek under the hood

@QuietMisdreavus 2018Lyric reference: Carly Rae Jepsen - “Call Me Maybe”

Page 7: The Dark Secrets Lurking Inside - quiet misdreavus

@QuietMisdreavus 2018

Rustdoc output

@QuietMisdreavus 2018

Page 8: The Dark Secrets Lurking Inside - quiet misdreavus

@QuietMisdreavus 2018

Want to cut to the chase?

Click this link to fold (or unfold) everything on the page!

Page 9: The Dark Secrets Lurking Inside - quiet misdreavus

@QuietMisdreavus 2018

Want to see how it’s done?

@QuietMisdreavus 2018

Check the source!

Page 10: The Dark Secrets Lurking Inside - quiet misdreavus

@QuietMisdreavus 2018

Check the source!

The crate’s source code is shipped and highlighted alongside all its docs!

Page 11: The Dark Secrets Lurking Inside - quiet misdreavus

@QuietMisdreavus 2018

Color-coded links!

@QuietMisdreavus 2018

All types in rustdoc’sgenerated signatures are links to their docs!

• Magenta: Structs• Purple: Traits• Green: Enums• Blue: Primitives• Tan: Functions

Page 12: The Dark Secrets Lurking Inside - quiet misdreavus

@QuietMisdreavus 2018

Want everything on one page?

@QuietMisdreavus 2018

Page 13: The Dark Secrets Lurking Inside - quiet misdreavus

@QuietMisdreavus 2018

Curious how to use a type?

Tabs in the search results can show where a type is used by or returned from a function!

Page 14: The Dark Secrets Lurking Inside - quiet misdreavus

@QuietMisdreavus 2018

And more!

Press “?” for keyboard shortcuts and search hints!

Click the gear by the search box for doc settings!

Search operators in the standard library to see their traits!

Page 15: The Dark Secrets Lurking Inside - quiet misdreavus

@QuietMisdreavus 2018

introducing rustdoc

The tool behind `cargo doc`!

cargo build rustc

cargo doc rustdoc

@QuietMisdreavus 2018

Page 16: The Dark Secrets Lurking Inside - quiet misdreavus

@QuietMisdreavus 2018

Yo dawg, we heard you like code, so we put code in your docs, so you can read code while you read about code

@QuietMisdreavus 2018Meme reference: “Xzibit Yo Dawg”

Put some code samples into your docs...

...and rustdoccan run them with your tests!

Page 17: The Dark Secrets Lurking Inside - quiet misdreavus

@QuietMisdreavus 2018

The journey of a doctest

@QuietMisdreavus 2018

Rustdoc wants to compile your doctest as an executable…

…so it wraps your code in a main function…

…and adds in a reference to your crate!

Page 18: The Dark Secrets Lurking Inside - quiet misdreavus

@QuietMisdreavus 2018

Guiding doctests on their journey

@QuietMisdreavus 2018

Not everything goes inside fn main(), though! Let’s extend that test some…

Crate attributes and extern cratestatements are preserved outside the generated main

Page 19: The Dark Secrets Lurking Inside - quiet misdreavus

@QuietMisdreavus 2018

Doctests and Lints

@QuietMisdreavus 2018

By default, doctests also get #![allow(unused)]

But you can change that! Add this attribute to your crate…

Page 20: The Dark Secrets Lurking Inside - quiet misdreavus

@QuietMisdreavus 2018

Doctests and Lints

@QuietMisdreavus 2018

…and change that attribute with whatever you want!

Page 21: The Dark Secrets Lurking Inside - quiet misdreavus

@QuietMisdreavus 2018

Doctests and Lints

@QuietMisdreavus 2018

Page 22: The Dark Secrets Lurking Inside - quiet misdreavus

@QuietMisdreavus 2018

Doc comments are special!

@QuietMisdreavus 2018Lyric reference: Insane Clown Posse - “Miracles”

hecking docs, how do they work

Rustdoc compiles your crate to scrape out these attributes

Page 23: The Dark Secrets Lurking Inside - quiet misdreavus

@QuietMisdreavus 2018

The #[doc] attribute does a lot!

• #![doc(html_root_url)]

• #![doc(test(attr))]

• #[doc(inline)], #[doc(no_inline)]

• #[doc(hidden)]

• #[doc(include)]

• #[doc(cfg)]

@QuietMisdreavus 2018

Page 24: The Dark Secrets Lurking Inside - quiet misdreavus

@QuietMisdreavus 2018

#[doc(cfg)]: All your platforms at once

@QuietMisdreavus 2018

Page 25: The Dark Secrets Lurking Inside - quiet misdreavus

@QuietMisdreavus 2018

Conditional compilation vs. your docs

Rust handles conditional compilation before rustdoc can make your docs!

Page 26: The Dark Secrets Lurking Inside - quiet misdreavus

@QuietMisdreavus 2018

Forcing rustdoc to see the items

By compiling them in whenever rustdoc is running, we can show everything! But…

(Note: #[cfg(rustdoc)] is not available yet! There’s an open PR for it!)

Page 27: The Dark Secrets Lurking Inside - quiet misdreavus

@QuietMisdreavus 2018

Just making rustdoc see the item means it will try to run its doctests on the wrong platforms!

Page 28: The Dark Secrets Lurking Inside - quiet misdreavus

@QuietMisdreavus 2018

Enter #[doc(cfg)]

Telling rustdocspecifically about the platform…

…means it knows when to run (and to ignore) the doctests!

Page 29: The Dark Secrets Lurking Inside - quiet misdreavus

@QuietMisdreavus 2018

Bonus!

Now rustdoc can tell your users about the platform in the docs for you!

Page 30: The Dark Secrets Lurking Inside - quiet misdreavus

@QuietMisdreavus 2018

CLI Flags

• Compile flags

• --cfg, --extern, -C, --target, --edition• Content modification

• --html-in-header, --html-before-content, --html-after-content

• --document-private-items, --sort-modules-by-appearance• Process modification

• --passes, --no-defaults, --resource-suffix, --disable-minification

Page 31: The Dark Secrets Lurking Inside - quiet misdreavus

@QuietMisdreavus 2018

Splicing new content into your docs

Page 32: The Dark Secrets Lurking Inside - quiet misdreavus

@QuietMisdreavus 2018

…but add a flag to rustdoc…

Page 33: The Dark Secrets Lurking Inside - quiet misdreavus

@QuietMisdreavus 2018

Want some KaTeX in your docs?

Page 34: The Dark Secrets Lurking Inside - quiet misdreavus

@QuietMisdreavus 2018

No? How about some ponies?https://docs.rs/pwnies

Page 35: The Dark Secrets Lurking Inside - quiet misdreavus

@QuietMisdreavus 2018

A peek behind the curtain

Rustdoc’s code lives in the main “rust-lang/rust” repo, right next to the compiler and standard library!

Page 36: The Dark Secrets Lurking Inside - quiet misdreavus

@QuietMisdreavus 2018

Rustdoc is old!

• July 2009: Rust begins• April 2011: Self-

hosting• December 2011:

Rustdoc is added

Page 37: The Dark Secrets Lurking Inside - quiet misdreavus

@QuietMisdreavus 2018

Data gathering practices

• Asking the compiler nicely for what we want

• Going around the compiler’s back to get what we want

• Breaking the compiler to get what we want

• Breaking the compiler’s friends to get what we want

Page 38: The Dark Secrets Lurking Inside - quiet misdreavus

@QuietMisdreavus 2018

Thanks @DebugSteven!

Page 39: The Dark Secrets Lurking Inside - quiet misdreavus

@QuietMisdreavus 2018

Documentation flow (jargon-filled version)

• Source code is first handed directly to the compiler

• After macro expansion, the name resolver is saved to handle “intra-doc links” later

• After crate analysis, while the TyCtxt is still active, scan the HIR to collect all items in the crate

• “Clean” up all these items so we can have an AST more suited to rustdoc’s purposes

Page 40: The Dark Secrets Lurking Inside - quiet misdreavus

@QuietMisdreavus 2018

Documentation flow (jargon-filled version)

• Run the cleaned AST through several “passes” to strip out private items, massage doc comments, and otherwise process the crate for later doc generation

• The TyCtxt is dropped here, leaving the compiler context• Scan through the crate again to collect all the trait impls,

gather/highlight source code, generate search index

• Run through the crate one last time to generate a file for each item and module

Page 41: The Dark Secrets Lurking Inside - quiet misdreavus

@QuietMisdreavus 2018

Highlights of rustdoc internals

These “Auto Trait Implementations” don’t come directly from the code, so rustdoc has to make them up on the spot

Page 42: The Dark Secrets Lurking Inside - quiet misdreavus

@QuietMisdreavus 2018

Highlights of rustdoc internals

Rustdoc “templating engine” is a massive write!() call and a series of Display impls

Page 43: The Dark Secrets Lurking Inside - quiet misdreavus

@QuietMisdreavus 2018

Highlights of rustdoc internals

Rustdoc has its own test suite, to make sure we output files and their content correctly

Page 44: The Dark Secrets Lurking Inside - quiet misdreavus

@QuietMisdreavus 2018

The Rustdoc Team

@QuietMisdreavus@GuillaumeGomez @steveklabnik

@ollie27 @onur

Page 45: The Dark Secrets Lurking Inside - quiet misdreavus

@QuietMisdreavus 2018

• @QuietMisdreavus

• quietmisdreavus.net

• “misdreavus” on Mozilla IRC

• Fill your world with love today

@QuietMisdreavus 2018

“...but here’s my number”

Lyric reference: Carly Rae Jepsen - “Call Me Maybe”