summaryrefslogtreecommitdiffstats
path: root/src/librustdoc/clean
diff options
context:
space:
mode:
authorDaniel Baumann <daniel.baumann@progress-linux.org>2024-06-19 09:25:56 +0000
committerDaniel Baumann <daniel.baumann@progress-linux.org>2024-06-19 09:25:56 +0000
commit018c4950b9406055dec02ef0fb52f132e2bb1e2c (patch)
treea835ebdf2088ef88fa681f8fad45f09922c1ae9a /src/librustdoc/clean
parentAdding debian version 1.75.0+dfsg1-5. (diff)
downloadrustc-018c4950b9406055dec02ef0fb52f132e2bb1e2c.tar.xz
rustc-018c4950b9406055dec02ef0fb52f132e2bb1e2c.zip
Merging upstream version 1.76.0+dfsg1.
Signed-off-by: Daniel Baumann <daniel.baumann@progress-linux.org>
Diffstat (limited to 'src/librustdoc/clean')
-rw-r--r--src/librustdoc/clean/auto_trait.rs8
-rw-r--r--src/librustdoc/clean/blanket_impl.rs3
-rw-r--r--src/librustdoc/clean/cfg.rs5
-rw-r--r--src/librustdoc/clean/cfg/tests.rs4
-rw-r--r--src/librustdoc/clean/inline.rs20
-rw-r--r--src/librustdoc/clean/mod.rs198
-rw-r--r--src/librustdoc/clean/render_macro_matchers.rs6
-rw-r--r--src/librustdoc/clean/simplify.rs3
-rw-r--r--src/librustdoc/clean/types.rs60
-rw-r--r--src/librustdoc/clean/types/tests.rs5
-rw-r--r--src/librustdoc/clean/utils.rs26
11 files changed, 188 insertions, 150 deletions
diff --git a/src/librustdoc/clean/auto_trait.rs b/src/librustdoc/clean/auto_trait.rs
index bdf6a0f6b..e692f4ef7 100644
--- a/src/librustdoc/clean/auto_trait.rs
+++ b/src/librustdoc/clean/auto_trait.rs
@@ -1,9 +1,7 @@
-use rustc_data_structures::fx::FxHashSet;
use rustc_hir as hir;
use rustc_hir::lang_items::LangItem;
-use rustc_middle::ty::{self, Region, RegionVid, TypeFoldable};
+use rustc_middle::ty::{Region, RegionVid, TypeFoldable};
use rustc_trait_selection::traits::auto_trait::{self, AutoTraitResult};
-use thin_vec::ThinVec;
use std::fmt::Debug;
@@ -723,7 +721,7 @@ where
fn region_name(region: Region<'_>) -> Option<Symbol> {
match *region {
- ty::ReEarlyBound(r) => Some(r.name),
+ ty::ReEarlyParam(r) => Some(r.name),
_ => None,
}
}
@@ -743,7 +741,7 @@ impl<'a, 'tcx> TypeFolder<TyCtxt<'tcx>> for RegionReplacer<'a, 'tcx> {
match *r {
// These are the regions that can be seen in the AST.
ty::ReVar(vid) => self.vid_to_region.get(&vid).cloned().unwrap_or(r),
- ty::ReEarlyBound(_) | ty::ReStatic | ty::ReLateBound(..) | ty::ReError(_) => r,
+ ty::ReEarlyParam(_) | ty::ReStatic | ty::ReBound(..) | ty::ReError(_) => r,
r => bug!("unexpected region: {r:?}"),
}
}
diff --git a/src/librustdoc/clean/blanket_impl.rs b/src/librustdoc/clean/blanket_impl.rs
index dad2aa406..4da85885d 100644
--- a/src/librustdoc/clean/blanket_impl.rs
+++ b/src/librustdoc/clean/blanket_impl.rs
@@ -14,7 +14,6 @@ pub(crate) struct BlanketImplFinder<'a, 'tcx> {
impl<'a, 'tcx> BlanketImplFinder<'a, 'tcx> {
pub(crate) fn get_blanket_impls(&mut self, item_def_id: DefId) -> Vec<Item> {
let cx = &mut self.cx;
- let param_env = cx.tcx.param_env(item_def_id);
let ty = cx.tcx.type_of(item_def_id);
trace!("get_blanket_impls({ty:?})");
@@ -40,7 +39,7 @@ impl<'a, 'tcx> BlanketImplFinder<'a, 'tcx> {
let infcx = cx.tcx.infer_ctxt().build();
let args = infcx.fresh_args_for_item(DUMMY_SP, item_def_id);
let impl_ty = ty.instantiate(infcx.tcx, args);
- let param_env = EarlyBinder::bind(param_env).instantiate(infcx.tcx, args);
+ let param_env = ty::ParamEnv::empty();
let impl_args = infcx.fresh_args_for_item(DUMMY_SP, impl_def_id);
let impl_trait_ref = trait_ref.instantiate(infcx.tcx, impl_args);
diff --git a/src/librustdoc/clean/cfg.rs b/src/librustdoc/clean/cfg.rs
index ab5aec12f..0445daf0d 100644
--- a/src/librustdoc/clean/cfg.rs
+++ b/src/librustdoc/clean/cfg.rs
@@ -164,8 +164,8 @@ impl Cfg {
/// Renders the configuration for human display, as a short HTML description.
pub(crate) fn render_short_html(&self) -> String {
let mut msg = Display(self, Format::ShortHtml).to_string();
- if self.should_capitalize_first_letter() &&
- let Some(i) = msg.find(|c: char| c.is_ascii_alphanumeric())
+ if self.should_capitalize_first_letter()
+ && let Some(i) = msg.find(|c: char| c.is_ascii_alphanumeric())
{
msg[i..i + 1].make_ascii_uppercase();
}
@@ -516,7 +516,6 @@ impl<'a> fmt::Display for Display<'a> {
(sym::target_arch, Some(arch)) => match arch.as_str() {
"aarch64" => "AArch64",
"arm" => "ARM",
- "asmjs" => "JavaScript",
"loongarch64" => "LoongArch LA64",
"m68k" => "M68k",
"csky" => "CSKY",
diff --git a/src/librustdoc/clean/cfg/tests.rs b/src/librustdoc/clean/cfg/tests.rs
index bb62660e1..20bcf1abf 100644
--- a/src/librustdoc/clean/cfg/tests.rs
+++ b/src/librustdoc/clean/cfg/tests.rs
@@ -1,8 +1,8 @@
use super::*;
-use rustc_ast::{LitKind, MetaItemLit, Path, StrStyle};
+use rustc_ast::{MetaItemLit, Path, StrStyle};
use rustc_span::create_default_session_globals_then;
-use rustc_span::symbol::{kw, Ident, Symbol};
+use rustc_span::symbol::{kw, Ident};
use rustc_span::DUMMY_SP;
use thin_vec::thin_vec;
diff --git a/src/librustdoc/clean/inline.rs b/src/librustdoc/clean/inline.rs
index 974ba1e3b..014bcb1a8 100644
--- a/src/librustdoc/clean/inline.rs
+++ b/src/librustdoc/clean/inline.rs
@@ -374,15 +374,17 @@ pub(crate) fn build_impl(
// Only inline impl if the implemented trait is
// reachable in rustdoc generated documentation
- if !did.is_local() && let Some(traitref) = associated_trait {
+ if !did.is_local()
+ && let Some(traitref) = associated_trait
+ {
let did = traitref.def_id;
if !cx.cache.effective_visibilities.is_directly_public(tcx, did) {
return;
}
- if let Some(stab) = tcx.lookup_stability(did) &&
- stab.is_unstable() &&
- stab.feature == sym::rustc_private
+ if let Some(stab) = tcx.lookup_stability(did)
+ && stab.is_unstable()
+ && stab.feature == sym::rustc_private
{
return;
}
@@ -514,7 +516,10 @@ pub(crate) fn build_impl(
}
while let Some(ty) = stack.pop() {
- if let Some(did) = ty.def_id(&cx.cache) && !document_hidden && tcx.is_doc_hidden(did) {
+ if let Some(did) = ty.def_id(&cx.cache)
+ && !document_hidden
+ && tcx.is_doc_hidden(did)
+ {
return;
}
if let Some(generics) = ty.generics() {
@@ -580,7 +585,8 @@ fn build_module_items(
let res = item.res.expect_non_local();
if let Some(def_id) = res.opt_def_id()
&& let Some(allowed_def_ids) = allowed_def_ids
- && !allowed_def_ids.contains(&def_id) {
+ && !allowed_def_ids.contains(&def_id)
+ {
continue;
}
if let Some(def_id) = res.mod_def_id() {
@@ -634,7 +640,7 @@ fn build_module_items(
pub(crate) fn print_inlined_const(tcx: TyCtxt<'_>, did: DefId) -> String {
if let Some(did) = did.as_local() {
- let hir_id = tcx.hir().local_def_id_to_hir_id(did);
+ let hir_id = tcx.local_def_id_to_hir_id(did);
rustc_hir_pretty::id_to_string(&tcx.hir(), hir_id)
} else {
tcx.rendered_const(did).clone()
diff --git a/src/librustdoc/clean/mod.rs b/src/librustdoc/clean/mod.rs
index 1b7ca7bf7..75f9560f5 100644
--- a/src/librustdoc/clean/mod.rs
+++ b/src/librustdoc/clean/mod.rs
@@ -26,7 +26,7 @@ use rustc_middle::middle::resolve_bound_vars as rbv;
use rustc_middle::ty::fold::TypeFolder;
use rustc_middle::ty::GenericArgsRef;
use rustc_middle::ty::TypeVisitableExt;
-use rustc_middle::ty::{self, AdtKind, EarlyBinder, Ty, TyCtxt};
+use rustc_middle::ty::{self, AdtKind, Ty, TyCtxt};
use rustc_middle::{bug, span_bug};
use rustc_span::hygiene::{AstPass, MacroKind};
use rustc_span::symbol::{kw, sym, Ident, Symbol};
@@ -54,7 +54,9 @@ pub(crate) fn clean_doc_module<'tcx>(doc: &DocModule<'tcx>, cx: &mut DocContext<
let mut inserted = FxHashSet::default();
items.extend(doc.foreigns.iter().map(|(item, renamed)| {
let item = clean_maybe_renamed_foreign_item(cx, item, *renamed);
- if let Some(name) = item.name && (cx.render_options.document_hidden || !item.is_doc_hidden()) {
+ if let Some(name) = item.name
+ && (cx.render_options.document_hidden || !item.is_doc_hidden())
+ {
inserted.insert((item.type_(), name));
}
item
@@ -85,7 +87,9 @@ pub(crate) fn clean_doc_module<'tcx>(doc: &DocModule<'tcx>, cx: &mut DocContext<
}
let v = clean_maybe_renamed_item(cx, item, *renamed, *import_id);
for item in &v {
- if let Some(name) = item.name && (cx.render_options.document_hidden || !item.is_doc_hidden()) {
+ if let Some(name) = item.name
+ && (cx.render_options.document_hidden || !item.is_doc_hidden())
+ {
inserted.insert((item.type_(), name));
}
}
@@ -180,22 +184,6 @@ fn clean_generic_bound<'tcx>(
) -> Option<GenericBound> {
Some(match *bound {
hir::GenericBound::Outlives(lt) => GenericBound::Outlives(clean_lifetime(lt, cx)),
- hir::GenericBound::LangItemTrait(lang_item, span, _, generic_args) => {
- let def_id = cx.tcx.require_lang_item(lang_item, Some(span));
-
- let trait_ref = ty::Binder::dummy(ty::TraitRef::identity(cx.tcx, def_id));
-
- let generic_args = clean_generic_args(generic_args, cx);
- let GenericArgs::AngleBracketed { bindings, .. } = generic_args else {
- bug!("clean: parenthesized `GenericBound::LangItemTrait`");
- };
-
- let trait_ = clean_trait_ref_with_bindings(cx, trait_ref, bindings);
- GenericBound::TraitBound(
- PolyTrait { trait_, generic_params: vec![] },
- hir::TraitBoundModifier::None,
- )
- }
hir::GenericBound::Trait(ref t, modifier) => {
// `T: ~const Destruct` is hidden because `T: Destruct` is a no-op.
if modifier == hir::TraitBoundModifier::MaybeConst
@@ -286,12 +274,10 @@ pub(crate) fn clean_middle_region<'tcx>(region: ty::Region<'tcx>) -> Option<Life
match *region {
ty::ReStatic => Some(Lifetime::statik()),
_ if !region.has_name() => None,
- ty::ReLateBound(_, ty::BoundRegion { kind: ty::BrNamed(_, name), .. }) => {
- Some(Lifetime(name))
- }
- ty::ReEarlyBound(ref data) => Some(Lifetime(data.name)),
- ty::ReLateBound(..)
- | ty::ReFree(..)
+ ty::ReBound(_, ty::BoundRegion { kind: ty::BrNamed(_, name), .. }) => Some(Lifetime(name)),
+ ty::ReEarlyParam(ref data) => Some(Lifetime(data.name)),
+ ty::ReBound(..)
+ | ty::ReLateParam(..)
| ty::ReVar(..)
| ty::ReError(_)
| ty::RePlaceholder(..)
@@ -593,13 +579,13 @@ fn clean_generic_param<'tcx>(
},
)
}
- hir::GenericParamKind::Const { ty, default } => (
+ hir::GenericParamKind::Const { ty, default, is_host_effect } => (
param.name.ident().name,
GenericParamDefKind::Const {
ty: Box::new(clean_ty(ty, cx)),
default: default
.map(|ct| Box::new(ty::Const::from_anon_const(cx.tcx, ct.def_id).to_string())),
- is_host_effect: cx.tcx.has_attr(param.def_id, sym::rustc_host),
+ is_host_effect,
},
),
};
@@ -741,7 +727,7 @@ pub(crate) fn clean_generics<'tcx>(
.into_iter()
.map(|(lifetime, bounds)| WherePredicate::RegionPredicate { lifetime, bounds }),
)
- .chain(eq_predicates.into_iter())
+ .chain(eq_predicates)
.collect(),
}
}
@@ -819,12 +805,7 @@ fn clean_ty_generics<'tcx>(
{
let pred = clean_predicate(*pred, cx)?;
- bounds.extend(
- pred.get_bounds()
- .into_iter()
- .flatten()
- .cloned()
- );
+ bounds.extend(pred.get_bounds().into_iter().flatten().cloned());
if let Some(proj) = projection
&& let lhs = clean_projection(proj.map_bound(|p| p.projection_ty), cx, None)
@@ -991,10 +972,8 @@ fn clean_proc_macro<'tcx>(
cx: &mut DocContext<'tcx>,
) -> ItemKind {
let attrs = cx.tcx.hir().attrs(item.hir_id());
- if kind == MacroKind::Derive &&
- let Some(derive_name) = attrs
- .lists(sym::proc_macro_derive)
- .find_map(|mi| mi.ident())
+ if kind == MacroKind::Derive
+ && let Some(derive_name) = attrs.lists(sym::proc_macro_derive).find_map(|mi| mi.ident())
{
*name = derive_name.name;
}
@@ -1156,7 +1135,9 @@ fn clean_fn_decl_with_args<'tcx>(
hir::FnRetTy::Return(typ) => clean_ty(typ, cx),
hir::FnRetTy::DefaultReturn(..) => Type::Tuple(Vec::new()),
};
- if let Some(header) = header && header.is_async() {
+ if let Some(header) = header
+ && header.is_async()
+ {
output = output.sugared_async_return_type();
}
FnDecl { inputs: args, output, c_variadic: decl.c_variadic }
@@ -1599,7 +1580,6 @@ fn first_non_private<'tcx>(
// Absolute paths are not. We start from the parent of the item.
[.., parent, leaf] => (parent.res.opt_def_id()?.as_local()?, leaf.ident),
};
- let hir = cx.tcx.hir();
// First we try to get the `DefId` of the item.
for child in
cx.tcx.module_children_local(parent_def_id).iter().filter(move |c| c.ident == ident)
@@ -1608,14 +1588,17 @@ fn first_non_private<'tcx>(
continue;
}
- if let Some(def_id) = child.res.opt_def_id() && target_def_id == def_id {
+ if let Some(def_id) = child.res.opt_def_id()
+ && target_def_id == def_id
+ {
let mut last_path_res = None;
'reexps: for reexp in child.reexport_chain.iter() {
- if let Some(use_def_id) = reexp.id() &&
- let Some(local_use_def_id) = use_def_id.as_local() &&
- let Some(hir::Node::Item(item)) = hir.find_by_def_id(local_use_def_id) &&
- !item.ident.name.is_empty() &&
- let hir::ItemKind::Use(path, _) = item.kind
+ if let Some(use_def_id) = reexp.id()
+ && let Some(local_use_def_id) = use_def_id.as_local()
+ && let Some(hir::Node::Item(item)) =
+ cx.tcx.opt_hir_node_by_def_id(local_use_def_id)
+ && !item.ident.name.is_empty()
+ && let hir::ItemKind::Use(path, _) = item.kind
{
for res in &path.res {
if let Res::Def(DefKind::Ctor(..), _) | Res::SelfCtor(..) = res {
@@ -1626,7 +1609,8 @@ fn first_non_private<'tcx>(
// We never check for "cx.render_options.document_private"
// because if a re-export is not fully public, it's never
// documented.
- cx.tcx.local_visibility(local_use_def_id).is_public() {
+ cx.tcx.local_visibility(local_use_def_id).is_public()
+ {
break 'reexps;
}
last_path_res = Some((path, res));
@@ -1641,7 +1625,12 @@ fn first_non_private<'tcx>(
// 1. We found a public reexport.
// 2. We didn't find a public reexport so it's the "end type" path.
if let Some((new_path, _)) = last_path_res {
- return Some(first_non_private_clean_path(cx, path, new_path.segments, new_path.span));
+ return Some(first_non_private_clean_path(
+ cx,
+ path,
+ new_path.segments,
+ new_path.span,
+ ));
}
// If `last_path_res` is `None`, it can mean two things:
//
@@ -1816,11 +1805,8 @@ fn maybe_expand_private_type_alias<'tcx>(
}
_ => None,
});
- if let Some(ct) = const_ {
- args.insert(
- param.def_id.to_def_id(),
- SubstParam::Constant(clean_const(ct, cx)),
- );
+ if let Some(_) = const_ {
+ args.insert(param.def_id.to_def_id(), SubstParam::Constant);
}
// FIXME(const_generics_defaults)
indices.consts += 1;
@@ -1930,15 +1916,13 @@ fn clean_trait_object_lifetime_bound<'tcx>(
// latter contrary to `clean_middle_region`.
match *region {
ty::ReStatic => Some(Lifetime::statik()),
- ty::ReEarlyBound(region) if region.name != kw::Empty => Some(Lifetime(region.name)),
- ty::ReLateBound(_, ty::BoundRegion { kind: ty::BrNamed(_, name), .. })
- if name != kw::Empty =>
- {
+ ty::ReEarlyParam(region) if region.name != kw::Empty => Some(Lifetime(region.name)),
+ ty::ReBound(_, ty::BoundRegion { kind: ty::BrNamed(_, name), .. }) if name != kw::Empty => {
Some(Lifetime(name))
}
- ty::ReEarlyBound(_)
- | ty::ReLateBound(..)
- | ty::ReFree(_)
+ ty::ReEarlyParam(_)
+ | ty::ReBound(..)
+ | ty::ReLateParam(_)
| ty::ReVar(_)
| ty::RePlaceholder(_)
| ty::ReErased
@@ -2308,7 +2292,9 @@ fn clean_middle_opaque_bounds<'tcx>(
_ => return None,
};
- if let Some(sized) = cx.tcx.lang_items().sized_trait() && trait_ref.def_id() == sized {
+ if let Some(sized) = cx.tcx.lang_items().sized_trait()
+ && trait_ref.def_id() == sized
+ {
has_sized = true;
return None;
}
@@ -2493,8 +2479,8 @@ fn clean_variant_data<'tcx>(
.map(|disr| Discriminant { expr: Some(disr.body), value: disr.def_id.to_def_id() });
let kind = match variant {
- hir::VariantData::Struct(..) => VariantKind::Struct(VariantStruct {
- fields: variant.fields().iter().map(|x| clean_field(x, cx)).collect(),
+ hir::VariantData::Struct { fields, .. } => VariantKind::Struct(VariantStruct {
+ fields: fields.iter().map(|x| clean_field(x, cx)).collect(),
}),
hir::VariantData::Tuple(..) => {
VariantKind::Tuple(variant.fields().iter().map(|x| clean_field(x, cx)).collect())
@@ -2534,11 +2520,12 @@ fn clean_generic_args<'tcx>(
}
hir::GenericArg::Lifetime(_) => GenericArg::Lifetime(Lifetime::elided()),
hir::GenericArg::Type(ty) => GenericArg::Type(clean_ty(ty, cx)),
- // Checking for `#[rustc_host]` on the `AnonConst` not only accounts for the case
+ // Checking for `is_desugared_from_effects` on the `AnonConst` not only accounts for the case
// where the argument is `host` but for all possible cases (e.g., `true`, `false`).
- hir::GenericArg::Const(ct)
- if cx.tcx.has_attr(ct.value.def_id, sym::rustc_host) =>
- {
+ hir::GenericArg::Const(hir::ConstArg {
+ is_desugared_from_effects: true,
+ ..
+ }) => {
return None;
}
hir::GenericArg::Const(ct) => GenericArg::Const(Box::new(clean_const(ct, cx))),
@@ -2643,6 +2630,40 @@ fn filter_tokens_from_list(
tokens
}
+fn filter_doc_attr_ident(ident: Symbol, is_inline: bool) -> bool {
+ if is_inline {
+ ident == sym::hidden || ident == sym::inline || ident == sym::no_inline
+ } else {
+ ident == sym::cfg
+ }
+}
+
+/// Remove attributes from `normal` that should not be inherited by `use` re-export.
+/// Before calling this function, make sure `normal` is a `#[doc]` attribute.
+fn filter_doc_attr(normal: &mut ast::NormalAttr, is_inline: bool) {
+ match normal.item.args {
+ ast::AttrArgs::Delimited(ref mut args) => {
+ let tokens = filter_tokens_from_list(&args.tokens, |token| {
+ !matches!(
+ token,
+ TokenTree::Token(
+ Token {
+ kind: TokenKind::Ident(
+ ident,
+ _,
+ ),
+ ..
+ },
+ _,
+ ) if filter_doc_attr_ident(*ident, is_inline),
+ )
+ });
+ args.tokens = TokenStream::new(tokens);
+ }
+ ast::AttrArgs::Empty | ast::AttrArgs::Eq(..) => {}
+ }
+}
+
/// When inlining items, we merge their attributes (and all the reexports attributes too) with the
/// final reexport. For example:
///
@@ -2669,13 +2690,6 @@ fn add_without_unwanted_attributes<'hir>(
is_inline: bool,
import_parent: Option<DefId>,
) {
- // If it's not `#[doc(inline)]`, we don't want all attributes, otherwise we keep everything.
- if !is_inline {
- for attr in new_attrs {
- attrs.push((Cow::Borrowed(attr), import_parent));
- }
- return;
- }
for attr in new_attrs {
if matches!(attr.kind, ast::AttrKind::DocComment(..)) {
attrs.push((Cow::Borrowed(attr), import_parent));
@@ -2684,34 +2698,14 @@ fn add_without_unwanted_attributes<'hir>(
let mut attr = attr.clone();
match attr.kind {
ast::AttrKind::Normal(ref mut normal) => {
- if let [ident] = &*normal.item.path.segments &&
- let ident = ident.ident.name &&
- ident == sym::doc
- {
- match normal.item.args {
- ast::AttrArgs::Delimited(ref mut args) => {
- let tokens =
- filter_tokens_from_list(&args.tokens, |token| {
- !matches!(
- token,
- TokenTree::Token(
- Token {
- kind: TokenKind::Ident(
- sym::hidden | sym::inline | sym::no_inline,
- _,
- ),
- ..
- },
- _,
- ),
- )
- });
- args.tokens = TokenStream::new(tokens);
- attrs.push((Cow::Owned(attr), import_parent));
- }
- ast::AttrArgs::Empty | ast::AttrArgs::Eq(..) => {
- attrs.push((Cow::Owned(attr), import_parent));
- }
+ if let [ident] = &*normal.item.path.segments {
+ let ident = ident.ident.name;
+ if ident == sym::doc {
+ filter_doc_attr(normal, is_inline);
+ attrs.push((Cow::Owned(attr), import_parent));
+ } else if ident != sym::cfg {
+ // If it's not a `cfg()` attribute, we keep it.
+ attrs.push((Cow::Owned(attr), import_parent));
}
}
}
diff --git a/src/librustdoc/clean/render_macro_matchers.rs b/src/librustdoc/clean/render_macro_matchers.rs
index 66d10f236..605f9e496 100644
--- a/src/librustdoc/clean/render_macro_matchers.rs
+++ b/src/librustdoc/clean/render_macro_matchers.rs
@@ -40,7 +40,7 @@ pub(super) fn render_macro_matcher(tcx: TyCtxt<'_>, matcher: &TokenTree) -> Stri
printer.zerobreak();
printer.ibox(0);
match matcher {
- TokenTree::Delimited(_span, _delim, tts) => print_tts(&mut printer, tts),
+ TokenTree::Delimited(_span, _spacing, _delim, tts) => print_tts(&mut printer, tts),
// Matcher which is not a Delimited is unexpected and should've failed
// to compile, but we render whatever it is wrapped in parens.
TokenTree::Token(..) => print_tt(&mut printer, matcher),
@@ -97,7 +97,7 @@ fn print_tt(printer: &mut Printer<'_>, tt: &TokenTree) {
printer.hardbreak()
}
}
- TokenTree::Delimited(_span, delim, tts) => {
+ TokenTree::Delimited(_span, _spacing, delim, tts) => {
let open_delim = printer.token_kind_to_string(&token::OpenDelim(*delim));
printer.word(open_delim);
if !tts.is_empty() {
@@ -158,7 +158,7 @@ fn print_tts(printer: &mut Printer<'_>, tts: &TokenStream) {
(_, token::Pound) => (true, Pound),
(_, _) => (true, Other),
},
- TokenTree::Delimited(_, delim, _) => match (state, delim) {
+ TokenTree::Delimited(.., delim, _) => match (state, delim) {
(Dollar, Delimiter::Parenthesis) => (false, DollarParen),
(Pound | PoundBang, Delimiter::Bracket) => (false, Other),
(Ident, Delimiter::Parenthesis | Delimiter::Bracket) => (false, Other),
diff --git a/src/librustdoc/clean/simplify.rs b/src/librustdoc/clean/simplify.rs
index 627f15e67..c35fb9ec7 100644
--- a/src/librustdoc/clean/simplify.rs
+++ b/src/librustdoc/clean/simplify.rs
@@ -146,7 +146,8 @@ pub(crate) fn move_bounds_to_generic_parameters(generics: &mut clean::Generics)
}) = generics.params.iter_mut().find(|param| &param.name == arg)
{
param_bounds.extend(bounds.drain(..));
- } else if let WherePredicate::RegionPredicate { lifetime: Lifetime(arg), bounds } = &mut pred
+ } else if let WherePredicate::RegionPredicate { lifetime: Lifetime(arg), bounds } =
+ &mut pred
&& let Some(GenericParamDef {
kind: GenericParamDefKind::Lifetime { outlives: param_bounds },
..
diff --git a/src/librustdoc/clean/types.rs b/src/librustdoc/clean/types.rs
index 88ee4e3a2..150625c6d 100644
--- a/src/librustdoc/clean/types.rs
+++ b/src/librustdoc/clean/types.rs
@@ -31,7 +31,7 @@ use rustc_resolve::rustdoc::{
use rustc_session::Session;
use rustc_span::hygiene::MacroKind;
use rustc_span::symbol::{kw, sym, Ident, Symbol};
-use rustc_span::{self, FileName, Loc, DUMMY_SP};
+use rustc_span::{FileName, Loc, DUMMY_SP};
use rustc_target::abi::VariantIdx;
use rustc_target::spec::abi::Abi;
@@ -345,7 +345,7 @@ pub(crate) fn rustc_span(def_id: DefId, tcx: TyCtxt<'_>) -> Span {
|| tcx.def_span(def_id),
|local| {
let hir = tcx.hir();
- hir.span_with_body(hir.local_def_id_to_hir_id(local))
+ hir.span_with_body(tcx.local_def_id_to_hir_id(local))
},
))
}
@@ -498,7 +498,7 @@ impl Item {
}
pub(crate) fn is_crate(&self) -> bool {
- self.is_mod() && self.def_id().map_or(false, |did| did.is_crate_root())
+ self.is_mod() && self.def_id().is_some_and(|did| did.is_crate_root())
}
pub(crate) fn is_mod(&self) -> bool {
self.type_() == ItemType::Module
@@ -1269,8 +1269,8 @@ impl GenericBound {
pub(crate) fn is_sized_bound(&self, cx: &DocContext<'_>) -> bool {
use rustc_hir::TraitBoundModifier as TBM;
- if let GenericBound::TraitBound(PolyTrait { ref trait_, .. }, TBM::None) = *self &&
- Some(trait_.def_id()) == cx.tcx.lang_items().sized_trait()
+ if let GenericBound::TraitBound(PolyTrait { ref trait_, .. }, TBM::None) = *self
+ && Some(trait_.def_id()) == cx.tcx.lang_items().sized_trait()
{
return true;
}
@@ -1623,7 +1623,7 @@ impl Type {
/// functions.
pub(crate) fn sugared_async_return_type(self) -> Type {
if let Type::ImplTrait(mut v) = self
- && let Some(GenericBound::TraitBound(PolyTrait { mut trait_, .. }, _ )) = v.pop()
+ && let Some(GenericBound::TraitBound(PolyTrait { mut trait_, .. }, _)) = v.pop()
&& let Some(segment) = trait_.segments.pop()
&& let GenericArgs::AngleBracketed { mut bindings, .. } = segment.args
&& let Some(binding) = bindings.pop()
@@ -1651,6 +1651,13 @@ impl Type {
}
}
+ pub(crate) fn generic_args(&self) -> Option<&GenericArgs> {
+ match self {
+ Type::Path { path, .. } => path.generic_args(),
+ _ => None,
+ }
+ }
+
pub(crate) fn generics(&self) -> Option<Vec<&Type>> {
match self {
Type::Path { path, .. } => path.generics(),
@@ -2191,6 +2198,10 @@ impl Path {
}
}
+ pub(crate) fn generic_args(&self) -> Option<&GenericArgs> {
+ self.segments.last().map(|seg| &seg.args)
+ }
+
pub(crate) fn generics(&self) -> Option<Vec<&Type>> {
self.segments.last().and_then(|seg| {
if let GenericArgs::AngleBracketed { ref args, .. } = seg.args {
@@ -2232,6 +2243,39 @@ impl GenericArgs {
GenericArgs::Parenthesized { inputs, output } => inputs.is_empty() && output.is_none(),
}
}
+ pub(crate) fn bindings<'a>(&'a self) -> Box<dyn Iterator<Item = TypeBinding> + 'a> {
+ match self {
+ GenericArgs::AngleBracketed { bindings, .. } => Box::new(bindings.iter().cloned()),
+ GenericArgs::Parenthesized { output, .. } => Box::new(
+ output
+ .as_ref()
+ .map(|ty| TypeBinding {
+ assoc: PathSegment {
+ name: sym::Output,
+ args: GenericArgs::AngleBracketed {
+ args: Vec::new().into_boxed_slice(),
+ bindings: ThinVec::new(),
+ },
+ },
+ kind: TypeBindingKind::Equality { term: Term::Type((**ty).clone()) },
+ })
+ .into_iter(),
+ ),
+ }
+ }
+}
+
+impl<'a> IntoIterator for &'a GenericArgs {
+ type IntoIter = Box<dyn Iterator<Item = GenericArg> + 'a>;
+ type Item = GenericArg;
+ fn into_iter(self) -> Self::IntoIter {
+ match self {
+ GenericArgs::AngleBracketed { args, .. } => Box::new(args.iter().cloned()),
+ GenericArgs::Parenthesized { inputs, .. } => {
+ Box::new(inputs.iter().cloned().map(GenericArg::Type))
+ }
+ }
+ }
}
#[derive(Clone, PartialEq, Eq, Debug, Hash)]
@@ -2443,7 +2487,7 @@ impl Import {
}
pub(crate) fn imported_item_is_doc_hidden(&self, tcx: TyCtxt<'_>) -> bool {
- self.source.did.map_or(false, |did| tcx.is_doc_hidden(did))
+ self.source.did.is_some_and(|did| tcx.is_doc_hidden(did))
}
}
@@ -2502,7 +2546,7 @@ pub(crate) enum TypeBindingKind {
pub(crate) enum SubstParam {
Type(Type),
Lifetime(Lifetime),
- Constant(Constant),
+ Constant,
}
impl SubstParam {
diff --git a/src/librustdoc/clean/types/tests.rs b/src/librustdoc/clean/types/tests.rs
index ee7c0068e..4befce071 100644
--- a/src/librustdoc/clean/types/tests.rs
+++ b/src/librustdoc/clean/types/tests.rs
@@ -1,8 +1,7 @@
use super::*;
-use rustc_resolve::rustdoc::{unindent_doc_fragments, DocFragment, DocFragmentKind};
-use rustc_span::symbol::Symbol;
-use rustc_span::{create_default_session_globals_then, DUMMY_SP};
+use rustc_resolve::rustdoc::{unindent_doc_fragments, DocFragmentKind};
+use rustc_span::create_default_session_globals_then;
fn create_doc_fragment(s: &str) -> Vec<DocFragment> {
vec![DocFragment {
diff --git a/src/librustdoc/clean/utils.rs b/src/librustdoc/clean/utils.rs
index 9ff00c194..bdfda07be 100644
--- a/src/librustdoc/clean/utils.rs
+++ b/src/librustdoc/clean/utils.rs
@@ -303,7 +303,8 @@ pub(crate) fn name_from_pat(p: &hir::Pat<'_>) -> Symbol {
debug!("trying to get a name from pattern: {p:?}");
Symbol::intern(&match p.kind {
- PatKind::Wild | PatKind::Struct(..) => return kw::Underscore,
+ // FIXME(never_patterns): does this make sense?
+ PatKind::Wild | PatKind::Never | PatKind::Struct(..) => return kw::Underscore,
PatKind::Binding(_, _, ident, _) => return ident.name,
PatKind::TupleStruct(ref p, ..) | PatKind::Path(ref p) => qpath_to_string(p),
PatKind::Or(pats) => {
@@ -438,13 +439,13 @@ fn print_const_with_custom_print_scalar<'tcx>(
}
pub(crate) fn is_literal_expr(tcx: TyCtxt<'_>, hir_id: hir::HirId) -> bool {
- if let hir::Node::Expr(expr) = tcx.hir().get(hir_id) {
+ if let hir::Node::Expr(expr) = tcx.hir_node(hir_id) {
if let hir::ExprKind::Lit(_) = &expr.kind {
return true;
}
- if let hir::ExprKind::Unary(hir::UnOp::Neg, expr) = &expr.kind &&
- let hir::ExprKind::Lit(_) = &expr.kind
+ if let hir::ExprKind::Unary(hir::UnOp::Neg, expr) = &expr.kind
+ && let hir::ExprKind::Lit(_) = &expr.kind
{
return true;
}
@@ -573,9 +574,8 @@ pub(crate) fn find_nearest_parent_module(tcx: TyCtxt<'_>, def_id: DefId) -> Opti
/// This function exists because it runs on `hir::Attributes` whereas the other is a
/// `clean::Attributes` method.
pub(crate) fn has_doc_flag(tcx: TyCtxt<'_>, did: DefId, flag: Symbol) -> bool {
- tcx.get_attrs(did, sym::doc).any(|attr| {
- attr.meta_item_list().map_or(false, |l| rustc_attr::list_contains_name(&l, flag))
- })
+ tcx.get_attrs(did, sym::doc)
+ .any(|attr| attr.meta_item_list().is_some_and(|l| rustc_attr::list_contains_name(&l, flag)))
}
/// A link to `doc.rust-lang.org` that includes the channel name. Use this instead of manual links
@@ -641,19 +641,17 @@ pub(crate) fn inherits_doc_hidden(
mut def_id: LocalDefId,
stop_at: Option<LocalDefId>,
) -> bool {
- let hir = tcx.hir();
while let Some(id) = tcx.opt_local_parent(def_id) {
- if let Some(stop_at) = stop_at && id == stop_at {
+ if let Some(stop_at) = stop_at
+ && id == stop_at
+ {
return false;
}
def_id = id;
if tcx.is_doc_hidden(def_id.to_def_id()) {
return true;
- } else if let Some(node) = hir.find_by_def_id(def_id) &&
- matches!(
- node,
- hir::Node::Item(hir::Item { kind: hir::ItemKind::Impl(_), .. }),
- )
+ } else if let Some(node) = tcx.opt_hir_node_by_def_id(def_id)
+ && matches!(node, hir::Node::Item(hir::Item { kind: hir::ItemKind::Impl(_), .. }),)
{
// `impl` blocks stand a bit on their own: unless they have `#[doc(hidden)]` directly
// on them, they don't inherit it from the parent context.