pub struct ImplUtils;Expand description
Utility functions to work with impl’s and generics
Implementations§
Source§impl ImplUtils
impl ImplUtils
Sourcepub fn is_trivial_derive_impl(impl_block: &Impl) -> bool
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 falseSourcepub fn get_trivial_derive_description(trait_name: &str) -> Option<&'static str>
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.
Sourcepub fn is_blanket_impl(impl_block: &Impl) -> bool
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.).
Sourcepub fn is_generic_type(ty: &Type) -> bool
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")] })
}) == trueSourcepub fn extract_impl_signature_generics(impl_block: &Impl) -> HashSet<String>
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:
- The
for_type:impl<T> Trait for Foo<T>→ extractsTfromFoo<T> - The trait path:
impl<U> Trait<U> for Foo→ extractsUfromTrait<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)Sourcepub fn extract_impl_visible_generics(impl_block: &Impl) -> HashSet<String>
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.,Tfromimpl<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:
- The
for_type:Foo<T>→ extractsT - The trait path:
Iterator<Item = U>→ extractsU - Where clauses:
where T: Clone→ extractsT
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>`)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
- Extract “visible” generics from:
for_type, trait path, where clause - Extract “declared” generics from:
impl_block.generics.params - Compute “hidden” = declared - visible
- 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§
impl Freeze for ImplUtils
impl RefUnwindSafe for ImplUtils
impl Send for ImplUtils
impl Sync for ImplUtils
impl Unpin for ImplUtils
impl UnwindSafe for ImplUtils
Blanket Implementations§
Source§impl<T> BorrowMut<T> for Twhere
T: ?Sized,
impl<T> BorrowMut<T> for Twhere
T: ?Sized,
Source§fn borrow_mut(&mut self) -> &mut T
fn borrow_mut(&mut self) -> &mut T
Source§impl<T> Instrument for T
impl<T> Instrument for T
Source§fn instrument(self, span: Span) -> Instrumented<Self>
fn instrument(self, span: Span) -> Instrumented<Self>
Source§fn in_current_span(self) -> Instrumented<Self>
fn in_current_span(self) -> Instrumented<Self>
Source§impl<T> IntoEither for T
impl<T> IntoEither for T
Source§fn into_either(self, into_left: bool) -> Either<Self, Self>
fn into_either(self, into_left: bool) -> Either<Self, Self>
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 moreSource§fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
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 moreSource§impl<D> OwoColorize for D
impl<D> OwoColorize for D
Source§fn fg<C>(&self) -> FgColorDisplay<'_, C, Self>where
C: Color,
fn fg<C>(&self) -> FgColorDisplay<'_, C, Self>where
C: Color,
Source§fn bg<C>(&self) -> BgColorDisplay<'_, C, Self>where
C: Color,
fn bg<C>(&self) -> BgColorDisplay<'_, C, Self>where
C: Color,
Source§fn black(&self) -> FgColorDisplay<'_, Black, Self>
fn black(&self) -> FgColorDisplay<'_, Black, Self>
Source§fn on_black(&self) -> BgColorDisplay<'_, Black, Self>
fn on_black(&self) -> BgColorDisplay<'_, Black, Self>
Source§fn red(&self) -> FgColorDisplay<'_, Red, Self>
fn red(&self) -> FgColorDisplay<'_, Red, Self>
Source§fn on_red(&self) -> BgColorDisplay<'_, Red, Self>
fn on_red(&self) -> BgColorDisplay<'_, Red, Self>
Source§fn green(&self) -> FgColorDisplay<'_, Green, Self>
fn green(&self) -> FgColorDisplay<'_, Green, Self>
Source§fn on_green(&self) -> BgColorDisplay<'_, Green, Self>
fn on_green(&self) -> BgColorDisplay<'_, Green, Self>
Source§fn yellow(&self) -> FgColorDisplay<'_, Yellow, Self>
fn yellow(&self) -> FgColorDisplay<'_, Yellow, Self>
Source§fn on_yellow(&self) -> BgColorDisplay<'_, Yellow, Self>
fn on_yellow(&self) -> BgColorDisplay<'_, Yellow, Self>
Source§fn blue(&self) -> FgColorDisplay<'_, Blue, Self>
fn blue(&self) -> FgColorDisplay<'_, Blue, Self>
Source§fn on_blue(&self) -> BgColorDisplay<'_, Blue, Self>
fn on_blue(&self) -> BgColorDisplay<'_, Blue, Self>
Source§fn magenta(&self) -> FgColorDisplay<'_, Magenta, Self>
fn magenta(&self) -> FgColorDisplay<'_, Magenta, Self>
Source§fn on_magenta(&self) -> BgColorDisplay<'_, Magenta, Self>
fn on_magenta(&self) -> BgColorDisplay<'_, Magenta, Self>
Source§fn purple(&self) -> FgColorDisplay<'_, Magenta, Self>
fn purple(&self) -> FgColorDisplay<'_, Magenta, Self>
Source§fn on_purple(&self) -> BgColorDisplay<'_, Magenta, Self>
fn on_purple(&self) -> BgColorDisplay<'_, Magenta, Self>
Source§fn cyan(&self) -> FgColorDisplay<'_, Cyan, Self>
fn cyan(&self) -> FgColorDisplay<'_, Cyan, Self>
Source§fn on_cyan(&self) -> BgColorDisplay<'_, Cyan, Self>
fn on_cyan(&self) -> BgColorDisplay<'_, Cyan, Self>
Source§fn white(&self) -> FgColorDisplay<'_, White, Self>
fn white(&self) -> FgColorDisplay<'_, White, Self>
Source§fn on_white(&self) -> BgColorDisplay<'_, White, Self>
fn on_white(&self) -> BgColorDisplay<'_, White, Self>
Source§fn default_color(&self) -> FgColorDisplay<'_, Default, Self>
fn default_color(&self) -> FgColorDisplay<'_, Default, Self>
Source§fn on_default_color(&self) -> BgColorDisplay<'_, Default, Self>
fn on_default_color(&self) -> BgColorDisplay<'_, Default, Self>
Source§fn bright_black(&self) -> FgColorDisplay<'_, BrightBlack, Self>
fn bright_black(&self) -> FgColorDisplay<'_, BrightBlack, Self>
Source§fn on_bright_black(&self) -> BgColorDisplay<'_, BrightBlack, Self>
fn on_bright_black(&self) -> BgColorDisplay<'_, BrightBlack, Self>
Source§fn bright_red(&self) -> FgColorDisplay<'_, BrightRed, Self>
fn bright_red(&self) -> FgColorDisplay<'_, BrightRed, Self>
Source§fn on_bright_red(&self) -> BgColorDisplay<'_, BrightRed, Self>
fn on_bright_red(&self) -> BgColorDisplay<'_, BrightRed, Self>
Source§fn bright_green(&self) -> FgColorDisplay<'_, BrightGreen, Self>
fn bright_green(&self) -> FgColorDisplay<'_, BrightGreen, Self>
Source§fn on_bright_green(&self) -> BgColorDisplay<'_, BrightGreen, Self>
fn on_bright_green(&self) -> BgColorDisplay<'_, BrightGreen, Self>
Source§fn bright_yellow(&self) -> FgColorDisplay<'_, BrightYellow, Self>
fn bright_yellow(&self) -> FgColorDisplay<'_, BrightYellow, Self>
Source§fn on_bright_yellow(&self) -> BgColorDisplay<'_, BrightYellow, Self>
fn on_bright_yellow(&self) -> BgColorDisplay<'_, BrightYellow, Self>
Source§fn bright_blue(&self) -> FgColorDisplay<'_, BrightBlue, Self>
fn bright_blue(&self) -> FgColorDisplay<'_, BrightBlue, Self>
Source§fn on_bright_blue(&self) -> BgColorDisplay<'_, BrightBlue, Self>
fn on_bright_blue(&self) -> BgColorDisplay<'_, BrightBlue, Self>
Source§fn bright_magenta(&self) -> FgColorDisplay<'_, BrightMagenta, Self>
fn bright_magenta(&self) -> FgColorDisplay<'_, BrightMagenta, Self>
Source§fn on_bright_magenta(&self) -> BgColorDisplay<'_, BrightMagenta, Self>
fn on_bright_magenta(&self) -> BgColorDisplay<'_, BrightMagenta, Self>
Source§fn bright_purple(&self) -> FgColorDisplay<'_, BrightMagenta, Self>
fn bright_purple(&self) -> FgColorDisplay<'_, BrightMagenta, Self>
Source§fn on_bright_purple(&self) -> BgColorDisplay<'_, BrightMagenta, Self>
fn on_bright_purple(&self) -> BgColorDisplay<'_, BrightMagenta, Self>
Source§fn bright_cyan(&self) -> FgColorDisplay<'_, BrightCyan, Self>
fn bright_cyan(&self) -> FgColorDisplay<'_, BrightCyan, Self>
Source§fn on_bright_cyan(&self) -> BgColorDisplay<'_, BrightCyan, Self>
fn on_bright_cyan(&self) -> BgColorDisplay<'_, BrightCyan, Self>
Source§fn bright_white(&self) -> FgColorDisplay<'_, BrightWhite, Self>
fn bright_white(&self) -> FgColorDisplay<'_, BrightWhite, Self>
Source§fn on_bright_white(&self) -> BgColorDisplay<'_, BrightWhite, Self>
fn on_bright_white(&self) -> BgColorDisplay<'_, BrightWhite, Self>
Source§fn bold(&self) -> BoldDisplay<'_, Self>
fn bold(&self) -> BoldDisplay<'_, Self>
Source§fn dimmed(&self) -> DimDisplay<'_, Self>
fn dimmed(&self) -> DimDisplay<'_, Self>
Source§fn italic(&self) -> ItalicDisplay<'_, Self>
fn italic(&self) -> ItalicDisplay<'_, Self>
Source§fn underline(&self) -> UnderlineDisplay<'_, Self>
fn underline(&self) -> UnderlineDisplay<'_, Self>
Source§fn blink(&self) -> BlinkDisplay<'_, Self>
fn blink(&self) -> BlinkDisplay<'_, Self>
Source§fn blink_fast(&self) -> BlinkFastDisplay<'_, Self>
fn blink_fast(&self) -> BlinkFastDisplay<'_, Self>
Source§fn reversed(&self) -> ReversedDisplay<'_, Self>
fn reversed(&self) -> ReversedDisplay<'_, Self>
Source§fn strikethrough(&self) -> StrikeThroughDisplay<'_, Self>
fn strikethrough(&self) -> StrikeThroughDisplay<'_, Self>
Source§fn color<Color>(&self, color: Color) -> FgDynColorDisplay<'_, Color, Self>where
Color: DynColor,
fn color<Color>(&self, color: Color) -> FgDynColorDisplay<'_, Color, Self>where
Color: DynColor,
OwoColorize::fg or
a color-specific method, such as OwoColorize::green, Read moreSource§fn on_color<Color>(&self, color: Color) -> BgDynColorDisplay<'_, Color, Self>where
Color: DynColor,
fn on_color<Color>(&self, color: Color) -> BgDynColorDisplay<'_, Color, Self>where
Color: DynColor,
OwoColorize::bg or
a color-specific method, such as OwoColorize::on_yellow, Read more