ImplUtils

Struct ImplUtils 

Source
pub struct ImplUtils;
Expand description

Utility functions to work with impl’s and generics

Implementations§

Source§

impl ImplUtils

Source

pub fn is_trivial_derive_impl(impl_block: &Impl) -> bool

Check if an impl block is for a trivial derive trait.

Returns true if the impl is for one of the commonly derived traits (Clone, Copy, Debug, Default, PartialEq, Eq, Hash, PartialOrd, Ord).

§Examples
use rustdoc_types::Impl;
// For an impl block with trait "Clone", returns true
// For an impl block with trait "Display", returns false
Source

pub fn get_trivial_derive_description(trait_name: &str) -> Option<&'static str>

Get the description for a trivial derive trait.

Returns None if the trait is not in the trivial derives list.

Source

pub fn is_blanket_impl(impl_block: &Impl) -> bool

Check if an impl block is for a blanket trait that should be filtered.

Returns true if the impl is for one of the commonly auto-derived traits that add noise to documentation (From, Into, Any, Borrow, etc.).

Source

pub fn is_generic_type(ty: &Type) -> bool

Check if a type is generic (contains a type parameter like T).

This is used to determine whether to show generic parameters in impl blocks. For blanket impls like impl<T> Trait for T, we only show the generics if the for_ type is actually generic. When the impl is instantiated for a concrete type like TocEntry, we hide the generics.

§Examples
// Generic type - returns true
is_generic_type(&Type::Generic("T")) == true

// Concrete type - returns false
is_generic_type(&Type::ResolvedPath { name: "TocEntry", .. }) == false

// Container with generic - returns true
is_generic_type(&Type::ResolvedPath {
    name: "Vec",
    args: Some(GenericArgs::AngleBracketed { args: [Type::Generic("T")] })
}) == true
Source

pub fn extract_impl_signature_generics(impl_block: &Impl) -> HashSet<String>

Extract generic parameter names that appear in the impl signature (for_ and trait).

This extracts generics from only the visible parts of the impl header:

  1. The for_ type: impl<T> Trait for Foo<T> → extracts T from Foo<T>
  2. The trait path: impl<U> Trait<U> for Foo → extracts U from Trait<U>

Unlike [extract_impl_visible_generics], this does NOT extract from where clauses. Use this for rendering purposes when deciding which generic params to show in impl<...>. Generics that only appear in where clauses should not be shown in the impl header since the where clause itself is not rendered.

§Examples
impl<T: Sized> IntoEither for T
  └─ for_ type is Generic("T") → extracts ["T"]
  └─ When rendered for `Either<L, R>`, for_ becomes `Either<L, R>`
  └─ Extracts ["L", "R"], NOT ["T"]
  └─ T is only in where clause, so `impl<T>` should NOT be shown

impl<T> Clone for Wrapper<T>
  └─ for_ type has `Wrapper<T>` → extracts ["T"]
  └─ Result: render as `impl<T>`

impl<T, U> Trait<U> for Foo<T>
  └─ for_ type has `Foo<T>` → extracts ["T"]
  └─ trait path has `Trait<U>` → extracts ["U"]
  └─ Result: render as `impl<T, U>` (both visible)
Source

pub fn extract_impl_visible_generics(impl_block: &Impl) -> HashSet<String>

Extract all generic parameter names visible in an impl block’s signature.

§Why This Is Needed

Rustdoc JSON stores impl generics in two places that can have DIFFERENT names:

  • impl_block.generics.params - the declared params (e.g., T from impl<T>)
  • impl_block.for_ - the actual type (e.g., StyledObject<D>)

For blanket impls, these names often differ! The compiler transforms:

impl<D: Display> ToString for StyledObject<D>

Into JSON where generics.params has T but for_ has StyledObject<D>. If we blindly use generics.params, we’d render impl<T> ToString for StyledObject<D>.

§Solution

Extract generics from what’s VISIBLE in the signature:

  1. The for_ type: Foo<T> → extracts T
  2. The trait path: Iterator<Item = U> → extracts U
  3. Where clauses: where T: Clone → extracts T

Then filter generics.params to only include names that appear in visible locations.

Note: For rendering the impl header, use [extract_impl_signature_generics] instead, which excludes where clause generics.

§Examples
impl<T> Clone for Wrapper<T>
  └─ for_ type has `Wrapper<T>` → extracts ["T"]
  └─ Result: render as `impl<T>`

impl<T, U> Trait<U> for Foo<T> where T: Clone
  └─ for_ type has `Foo<T>` → extracts ["T"]
  └─ trait path has `Trait<U>` → extracts ["U"]
  └─ where clause has `T: Clone` → extracts ["T"]
  └─ Result: render as `impl<T, U>` (both visible)

impl<D: Display> ToString for StyledObject<D>
  └─ for_ type has `StyledObject<D>` → extracts ["D"]
  └─ Result: render as `impl<D>` (not `impl<T>`)
Source

pub fn has_hidden_generic_refs(impl_block: &Impl, krate: &Crate) -> bool

Check if an impl has associated types referencing generics NOT visible in the signature.

§The Problem

Some impl blocks have generics that only appear in associated types, not in the visible signature. When rendered, this produces confusing output:

impl DoubleEndedIterator for Foo    ← No `I` visible!
    type Item = <I as Iterator>::Item   ← Where does `I` come from?
§Detection Strategy
  1. Extract “visible” generics from: for_ type, trait path, where clause
  2. Extract “declared” generics from: impl_block.generics.params
  3. Compute “hidden” = declared - visible
  4. Check if any associated type references a hidden generic
§Examples
// FILTER THIS - `I` is hidden but used in associated type
impl<I: Iterator> DoubleEndedIterator for Foo {
    type Item = <I as Iterator>::Item;
}
visible = {}        (Foo has no generics)
declared = {I}      (from impl<I>)
hidden = {I}        (declared - visible)
assoc type uses I   → FILTER!

// KEEP THIS - `T` is visible in for_ type
impl<T> Iterator for Wrapper<T> {
    type Item = T;
}
visible = {T}       (from Wrapper<T>)
declared = {T}      (from impl<T>)
hidden = {}         (all visible)
→ KEEP!

// KEEP THIS - `U` is visible in trait path
impl<T, U> Trait<U> for Foo<T> {
    type Output = (T, U);
}
visible = {T, U}    (T from Foo<T>, U from Trait<U>)
declared = {T, U}   (from impl<T, U>)
hidden = {}         (all visible)
→ KEEP!

Auto Trait Implementations§

Blanket Implementations§

Source§

impl<T> Any for T
where T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

Source§

impl<T> Instrument for T

Source§

fn instrument(self, span: Span) -> Instrumented<Self>

Instruments this type with the provided Span, returning an Instrumented wrapper. Read more
Source§

fn in_current_span(self) -> Instrumented<Self>

Instruments this type with the current Span, returning an Instrumented wrapper. Read more
Source§

impl<T, U> Into<U> for T
where U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

That is, this conversion is whatever the implementation of From<T> for U chooses to do.

Source§

impl<T> IntoEither for T

Source§

fn into_either(self, into_left: bool) -> Either<Self, Self>

Converts self into a Left variant of Either<Self, Self> if into_left is true. Converts self into a Right variant of Either<Self, Self> otherwise. Read more
Source§

fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
where F: FnOnce(&Self) -> bool,

Converts self into a Left variant of Either<Self, Self> if into_left(&self) returns true. Converts self into a Right variant of Either<Self, Self> otherwise. Read more
Source§

impl<D> OwoColorize for D

Source§

fn fg<C>(&self) -> FgColorDisplay<'_, C, Self>
where C: Color,

Set the foreground color generically Read more
Source§

fn bg<C>(&self) -> BgColorDisplay<'_, C, Self>
where C: Color,

Set the background color generically. Read more
Source§

fn black(&self) -> FgColorDisplay<'_, Black, Self>

Change the foreground color to black
Source§

fn on_black(&self) -> BgColorDisplay<'_, Black, Self>

Change the background color to black
Source§

fn red(&self) -> FgColorDisplay<'_, Red, Self>

Change the foreground color to red
Source§

fn on_red(&self) -> BgColorDisplay<'_, Red, Self>

Change the background color to red
Source§

fn green(&self) -> FgColorDisplay<'_, Green, Self>

Change the foreground color to green
Source§

fn on_green(&self) -> BgColorDisplay<'_, Green, Self>

Change the background color to green
Source§

fn yellow(&self) -> FgColorDisplay<'_, Yellow, Self>

Change the foreground color to yellow
Source§

fn on_yellow(&self) -> BgColorDisplay<'_, Yellow, Self>

Change the background color to yellow
Source§

fn blue(&self) -> FgColorDisplay<'_, Blue, Self>

Change the foreground color to blue
Source§

fn on_blue(&self) -> BgColorDisplay<'_, Blue, Self>

Change the background color to blue
Source§

fn magenta(&self) -> FgColorDisplay<'_, Magenta, Self>

Change the foreground color to magenta
Source§

fn on_magenta(&self) -> BgColorDisplay<'_, Magenta, Self>

Change the background color to magenta
Source§

fn purple(&self) -> FgColorDisplay<'_, Magenta, Self>

Change the foreground color to purple
Source§

fn on_purple(&self) -> BgColorDisplay<'_, Magenta, Self>

Change the background color to purple
Source§

fn cyan(&self) -> FgColorDisplay<'_, Cyan, Self>

Change the foreground color to cyan
Source§

fn on_cyan(&self) -> BgColorDisplay<'_, Cyan, Self>

Change the background color to cyan
Source§

fn white(&self) -> FgColorDisplay<'_, White, Self>

Change the foreground color to white
Source§

fn on_white(&self) -> BgColorDisplay<'_, White, Self>

Change the background color to white
Source§

fn default_color(&self) -> FgColorDisplay<'_, Default, Self>

Change the foreground color to the terminal default
Source§

fn on_default_color(&self) -> BgColorDisplay<'_, Default, Self>

Change the background color to the terminal default
Source§

fn bright_black(&self) -> FgColorDisplay<'_, BrightBlack, Self>

Change the foreground color to bright black
Source§

fn on_bright_black(&self) -> BgColorDisplay<'_, BrightBlack, Self>

Change the background color to bright black
Source§

fn bright_red(&self) -> FgColorDisplay<'_, BrightRed, Self>

Change the foreground color to bright red
Source§

fn on_bright_red(&self) -> BgColorDisplay<'_, BrightRed, Self>

Change the background color to bright red
Source§

fn bright_green(&self) -> FgColorDisplay<'_, BrightGreen, Self>

Change the foreground color to bright green
Source§

fn on_bright_green(&self) -> BgColorDisplay<'_, BrightGreen, Self>

Change the background color to bright green
Source§

fn bright_yellow(&self) -> FgColorDisplay<'_, BrightYellow, Self>

Change the foreground color to bright yellow
Source§

fn on_bright_yellow(&self) -> BgColorDisplay<'_, BrightYellow, Self>

Change the background color to bright yellow
Source§

fn bright_blue(&self) -> FgColorDisplay<'_, BrightBlue, Self>

Change the foreground color to bright blue
Source§

fn on_bright_blue(&self) -> BgColorDisplay<'_, BrightBlue, Self>

Change the background color to bright blue
Source§

fn bright_magenta(&self) -> FgColorDisplay<'_, BrightMagenta, Self>

Change the foreground color to bright magenta
Source§

fn on_bright_magenta(&self) -> BgColorDisplay<'_, BrightMagenta, Self>

Change the background color to bright magenta
Source§

fn bright_purple(&self) -> FgColorDisplay<'_, BrightMagenta, Self>

Change the foreground color to bright purple
Source§

fn on_bright_purple(&self) -> BgColorDisplay<'_, BrightMagenta, Self>

Change the background color to bright purple
Source§

fn bright_cyan(&self) -> FgColorDisplay<'_, BrightCyan, Self>

Change the foreground color to bright cyan
Source§

fn on_bright_cyan(&self) -> BgColorDisplay<'_, BrightCyan, Self>

Change the background color to bright cyan
Source§

fn bright_white(&self) -> FgColorDisplay<'_, BrightWhite, Self>

Change the foreground color to bright white
Source§

fn on_bright_white(&self) -> BgColorDisplay<'_, BrightWhite, Self>

Change the background color to bright white
Source§

fn bold(&self) -> BoldDisplay<'_, Self>

Make the text bold
Source§

fn dimmed(&self) -> DimDisplay<'_, Self>

Make the text dim
Source§

fn italic(&self) -> ItalicDisplay<'_, Self>

Make the text italicized
Source§

fn underline(&self) -> UnderlineDisplay<'_, Self>

Make the text underlined
Make the text blink
Make the text blink (but fast!)
Source§

fn reversed(&self) -> ReversedDisplay<'_, Self>

Swap the foreground and background colors
Source§

fn hidden(&self) -> HiddenDisplay<'_, Self>

Hide the text
Source§

fn strikethrough(&self) -> StrikeThroughDisplay<'_, Self>

Cross out the text
Source§

fn color<Color>(&self, color: Color) -> FgDynColorDisplay<'_, Color, Self>
where Color: DynColor,

Set the foreground color at runtime. Only use if you do not know which color will be used at compile-time. If the color is constant, use either OwoColorize::fg or a color-specific method, such as OwoColorize::green, Read more
Source§

fn on_color<Color>(&self, color: Color) -> BgDynColorDisplay<'_, Color, Self>
where Color: DynColor,

Set the background color at runtime. Only use if you do not know what color to use at compile-time. If the color is constant, use either OwoColorize::bg or a color-specific method, such as OwoColorize::on_yellow, Read more
Source§

fn fg_rgb<const R: u8, const G: u8, const B: u8>( &self, ) -> FgColorDisplay<'_, CustomColor<R, G, B>, Self>

Set the foreground color to a specific RGB value.
Source§

fn bg_rgb<const R: u8, const G: u8, const B: u8>( &self, ) -> BgColorDisplay<'_, CustomColor<R, G, B>, Self>

Set the background color to a specific RGB value.
Source§

fn truecolor(&self, r: u8, g: u8, b: u8) -> FgDynColorDisplay<'_, Rgb, Self>

Sets the foreground color to an RGB value.
Source§

fn on_truecolor(&self, r: u8, g: u8, b: u8) -> BgDynColorDisplay<'_, Rgb, Self>

Sets the background color to an RGB value.
Source§

fn style(&self, style: Style) -> Styled<&Self>

Apply a runtime-determined style
Source§

impl<T> Pointable for T

Source§

const ALIGN: usize

The alignment of pointer.
Source§

type Init = T

The type for initializers.
Source§

unsafe fn init(init: <T as Pointable>::Init) -> usize

Initializes a with the given initializer. Read more
Source§

unsafe fn deref<'a>(ptr: usize) -> &'a T

Dereferences the given pointer. Read more
Source§

unsafe fn deref_mut<'a>(ptr: usize) -> &'a mut T

Mutably dereferences the given pointer. Read more
Source§

unsafe fn drop(ptr: usize)

Drops the object pointed to by the given pointer. Read more
Source§

impl<T, U> TryFrom<U> for T
where U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
Source§

impl<T> WithSubscriber for T

Source§

fn with_subscriber<S>(self, subscriber: S) -> WithDispatch<Self>
where S: Into<Dispatch>,

Attaches the provided Subscriber to this type, returning a WithDispatch wrapper. Read more
Source§

fn with_current_subscriber(self) -> WithDispatch<Self>

Attaches the current default Subscriber to this type, returning a WithDispatch wrapper. Read more