Split AssocConstItem into ProvidedAssocConstItem and ImplAssocConstItem
This commit is contained in:
parent
57e1a47dc4
commit
044885c8ae
11 changed files with 62 additions and 34 deletions
|
|
@ -1222,11 +1222,13 @@ fn clean_trait_item<'tcx>(trait_item: &hir::TraitItem<'tcx>, cx: &mut DocContext
|
|||
let local_did = trait_item.owner_id.to_def_id();
|
||||
cx.with_param_env(local_did, |cx| {
|
||||
let inner = match trait_item.kind {
|
||||
hir::TraitItemKind::Const(ty, Some(default)) => AssocConstItem(Box::new(Constant {
|
||||
generics: enter_impl_trait(cx, |cx| clean_generics(trait_item.generics, cx)),
|
||||
kind: ConstantKind::Local { def_id: local_did, body: default },
|
||||
type_: clean_ty(ty, cx),
|
||||
})),
|
||||
hir::TraitItemKind::Const(ty, Some(default)) => {
|
||||
ProvidedAssocConstItem(Box::new(Constant {
|
||||
generics: enter_impl_trait(cx, |cx| clean_generics(trait_item.generics, cx)),
|
||||
kind: ConstantKind::Local { def_id: local_did, body: default },
|
||||
type_: clean_ty(ty, cx),
|
||||
}))
|
||||
}
|
||||
hir::TraitItemKind::Const(ty, None) => {
|
||||
let generics = enter_impl_trait(cx, |cx| clean_generics(trait_item.generics, cx));
|
||||
RequiredAssocConstItem(generics, Box::new(clean_ty(ty, cx)))
|
||||
|
|
@ -1271,7 +1273,7 @@ pub(crate) fn clean_impl_item<'tcx>(
|
|||
let local_did = impl_.owner_id.to_def_id();
|
||||
cx.with_param_env(local_did, |cx| {
|
||||
let inner = match impl_.kind {
|
||||
hir::ImplItemKind::Const(ty, expr) => AssocConstItem(Box::new(Constant {
|
||||
hir::ImplItemKind::Const(ty, expr) => ImplAssocConstItem(Box::new(Constant {
|
||||
generics: clean_generics(impl_.generics, cx),
|
||||
kind: ConstantKind::Local { def_id: local_did, body: expr },
|
||||
type_: clean_ty(ty, cx),
|
||||
|
|
@ -1320,18 +1322,23 @@ pub(crate) fn clean_middle_assoc_item(assoc_item: &ty::AssocItem, cx: &mut DocCo
|
|||
);
|
||||
simplify::move_bounds_to_generic_parameters(&mut generics);
|
||||
|
||||
let provided = match assoc_item.container {
|
||||
ty::AssocItemContainer::Impl => true,
|
||||
ty::AssocItemContainer::Trait => tcx.defaultness(assoc_item.def_id).has_value(),
|
||||
};
|
||||
if provided {
|
||||
AssocConstItem(Box::new(Constant {
|
||||
match assoc_item.container {
|
||||
ty::AssocItemContainer::Impl => ImplAssocConstItem(Box::new(Constant {
|
||||
generics,
|
||||
kind: ConstantKind::Extern { def_id: assoc_item.def_id },
|
||||
type_: ty,
|
||||
}))
|
||||
} else {
|
||||
RequiredAssocConstItem(generics, Box::new(ty))
|
||||
})),
|
||||
ty::AssocItemContainer::Trait => {
|
||||
if tcx.defaultness(assoc_item.def_id).has_value() {
|
||||
ProvidedAssocConstItem(Box::new(Constant {
|
||||
generics,
|
||||
kind: ConstantKind::Extern { def_id: assoc_item.def_id },
|
||||
type_: ty,
|
||||
}))
|
||||
} else {
|
||||
RequiredAssocConstItem(generics, Box::new(ty))
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
ty::AssocKind::Fn => {
|
||||
|
|
|
|||
|
|
@ -551,7 +551,7 @@ impl Item {
|
|||
matches!(self.kind, TyAssocTypeItem(..) | StrippedItem(box TyAssocTypeItem(..)))
|
||||
}
|
||||
pub(crate) fn is_associated_const(&self) -> bool {
|
||||
matches!(self.kind, AssocConstItem(..) | StrippedItem(box AssocConstItem(..)))
|
||||
matches!(self.kind, ProvidedAssocConstItem(..) | ImplAssocConstItem(..) | StrippedItem(box (ProvidedAssocConstItem(..) | ImplAssocConstItem(..))))
|
||||
}
|
||||
pub(crate) fn is_required_associated_const(&self) -> bool {
|
||||
matches!(self.kind, RequiredAssocConstItem(..) | StrippedItem(box RequiredAssocConstItem(..)))
|
||||
|
|
@ -701,8 +701,9 @@ impl Item {
|
|||
// Variants always inherit visibility
|
||||
VariantItem(..) | ImplItem(..) => return None,
|
||||
// Trait items inherit the trait's visibility
|
||||
AssocConstItem(..)
|
||||
| RequiredAssocConstItem(..)
|
||||
RequiredAssocConstItem(..)
|
||||
| ProvidedAssocConstItem(..)
|
||||
| ImplAssocConstItem(..)
|
||||
| AssocTypeItem(..)
|
||||
| TyAssocTypeItem(..)
|
||||
| TyMethodItem(..)
|
||||
|
|
@ -870,8 +871,10 @@ pub(crate) enum ItemKind {
|
|||
/// A required associated constant in a trait declaration.
|
||||
RequiredAssocConstItem(Generics, Box<Type>),
|
||||
ConstantItem(Box<Constant>),
|
||||
/// An associated constant in a trait impl or a provided one in a trait declaration.
|
||||
AssocConstItem(Box<Constant>),
|
||||
/// An associated constant in a trait declaration with provided default value.
|
||||
ProvidedAssocConstItem(Box<Constant>),
|
||||
/// An associated constant in an inherent impl or trait impl.
|
||||
ImplAssocConstItem(Box<Constant>),
|
||||
/// A required associated type in a trait declaration.
|
||||
///
|
||||
/// The bounds may be non-empty if there is a `where` clause.
|
||||
|
|
@ -916,7 +919,8 @@ impl ItemKind {
|
|||
| ProcMacroItem(_)
|
||||
| PrimitiveItem(_)
|
||||
| RequiredAssocConstItem(..)
|
||||
| AssocConstItem(..)
|
||||
| ProvidedAssocConstItem(..)
|
||||
| ImplAssocConstItem(..)
|
||||
| TyAssocTypeItem(..)
|
||||
| AssocTypeItem(..)
|
||||
| StrippedItem(_)
|
||||
|
|
|
|||
|
|
@ -92,7 +92,8 @@ pub(crate) trait DocFolder: Sized {
|
|||
| ProcMacroItem(_)
|
||||
| PrimitiveItem(_)
|
||||
| RequiredAssocConstItem(..)
|
||||
| AssocConstItem(..)
|
||||
| ProvidedAssocConstItem(..)
|
||||
| ImplAssocConstItem(..)
|
||||
| TyAssocTypeItem(..)
|
||||
| AssocTypeItem(..)
|
||||
| KeywordItem => kind,
|
||||
|
|
|
|||
|
|
@ -338,7 +338,8 @@ impl DocFolder for CacheBuilder<'_, '_> {
|
|||
| clean::MethodItem(..)
|
||||
| clean::StructFieldItem(..)
|
||||
| clean::RequiredAssocConstItem(..)
|
||||
| clean::AssocConstItem(..)
|
||||
| clean::ProvidedAssocConstItem(..)
|
||||
| clean::ImplAssocConstItem(..)
|
||||
| clean::TyAssocTypeItem(..)
|
||||
| clean::AssocTypeItem(..)
|
||||
| clean::StrippedItem(..)
|
||||
|
|
@ -443,7 +444,9 @@ fn add_item_to_search_index(tcx: TyCtxt<'_>, cache: &mut Cache, item: &clean::It
|
|||
let item_def_id = item.item_id.as_def_id().unwrap();
|
||||
let (parent_did, parent_path) = match item.kind {
|
||||
clean::StrippedItem(..) => return,
|
||||
clean::AssocConstItem(..) | clean::AssocTypeItem(..)
|
||||
clean::ProvidedAssocConstItem(..)
|
||||
| clean::ImplAssocConstItem(..)
|
||||
| clean::AssocTypeItem(..)
|
||||
if cache.parent_stack.last().is_some_and(|parent| parent.is_trait_impl()) =>
|
||||
{
|
||||
// skip associated items in trait impls
|
||||
|
|
@ -467,7 +470,10 @@ fn add_item_to_search_index(tcx: TyCtxt<'_>, cache: &mut Cache, item: &clean::It
|
|||
let parent_path = &cache.stack[..cache.stack.len() - 1];
|
||||
(Some(parent_did), parent_path)
|
||||
}
|
||||
clean::MethodItem(..) | clean::AssocConstItem(..) | clean::AssocTypeItem(..) => {
|
||||
clean::MethodItem(..)
|
||||
| clean::ProvidedAssocConstItem(..)
|
||||
| clean::ImplAssocConstItem(..)
|
||||
| clean::AssocTypeItem(..) => {
|
||||
let last = cache.parent_stack.last().expect("parent_stack is empty 2");
|
||||
let parent_did = match last {
|
||||
// impl Trait for &T { fn method(self); }
|
||||
|
|
|
|||
|
|
@ -96,7 +96,9 @@ impl<'a> From<&'a clean::Item> for ItemType {
|
|||
clean::ForeignStaticItem(..) => ItemType::Static, // no ForeignStatic
|
||||
clean::MacroItem(..) => ItemType::Macro,
|
||||
clean::PrimitiveItem(..) => ItemType::Primitive,
|
||||
clean::RequiredAssocConstItem(..) | clean::AssocConstItem(..) => ItemType::AssocConst,
|
||||
clean::RequiredAssocConstItem(..)
|
||||
| clean::ProvidedAssocConstItem(..)
|
||||
| clean::ImplAssocConstItem(..) => ItemType::AssocConst,
|
||||
clean::TyAssocTypeItem(..) | clean::AssocTypeItem(..) => ItemType::AssocType,
|
||||
clean::ForeignTypeItem => ItemType::ForeignType,
|
||||
clean::KeywordItem => ItemType::Keyword,
|
||||
|
|
|
|||
|
|
@ -1091,7 +1091,7 @@ fn render_assoc_item(
|
|||
if parent == ItemType::Trait { 4 } else { 0 },
|
||||
cx,
|
||||
),
|
||||
clean::AssocConstItem(ci) => assoc_const(
|
||||
clean::ProvidedAssocConstItem(ci) | clean::ImplAssocConstItem(ci) => assoc_const(
|
||||
w,
|
||||
item,
|
||||
&ci.generics,
|
||||
|
|
@ -1711,7 +1711,7 @@ fn render_impl(
|
|||
);
|
||||
w.write_str("</h4></section>");
|
||||
}
|
||||
clean::AssocConstItem(ci) => {
|
||||
clean::ProvidedAssocConstItem(ci) | clean::ImplAssocConstItem(ci) => {
|
||||
let source_id = format!("{item_type}.{name}");
|
||||
let id = cx.derive_id(&source_id);
|
||||
write!(w, "<section id=\"{id}\" class=\"{item_type}{in_trait_class}\">");
|
||||
|
|
@ -1812,7 +1812,9 @@ fn render_impl(
|
|||
clean::TyAssocTypeItem(..) | clean::AssocTypeItem(..) => {
|
||||
assoc_types.push(trait_item)
|
||||
}
|
||||
clean::RequiredAssocConstItem(..) | clean::AssocConstItem(_) => {
|
||||
clean::RequiredAssocConstItem(..)
|
||||
| clean::ProvidedAssocConstItem(_)
|
||||
| clean::ImplAssocConstItem(_) => {
|
||||
// We render it directly since they're supposed to come first.
|
||||
doc_impl_item(
|
||||
&mut default_impl_items,
|
||||
|
|
|
|||
|
|
@ -343,7 +343,7 @@ fn from_clean_item(item: clean::Item, renderer: &JsonRenderer<'_>) -> ItemEnum {
|
|||
ItemEnum::AssocConst { type_: (*ty).into_json(renderer), value: None }
|
||||
}
|
||||
// FIXME(generic_const_items): Add support for generic associated consts.
|
||||
AssocConstItem(ci) => ItemEnum::AssocConst {
|
||||
ProvidedAssocConstItem(ci) | ImplAssocConstItem(ci) => ItemEnum::AssocConst {
|
||||
type_: ci.type_.into_json(renderer),
|
||||
value: Some(ci.kind.expr(renderer.tcx)),
|
||||
},
|
||||
|
|
|
|||
|
|
@ -72,9 +72,10 @@ pub(crate) fn should_have_doc_example(cx: &DocContext<'_>, item: &clean::Item) -
|
|||
| clean::ForeignFunctionItem(..)
|
||||
| clean::ForeignStaticItem(..)
|
||||
| clean::ForeignTypeItem
|
||||
| clean::AssocConstItem(..)
|
||||
| clean::AssocTypeItem(..)
|
||||
| clean::RequiredAssocConstItem(..)
|
||||
| clean::ProvidedAssocConstItem(..)
|
||||
| clean::ImplAssocConstItem(..)
|
||||
| clean::TyAssocTypeItem(..)
|
||||
// check for trait impl
|
||||
| clean::ImplItem(box clean::Impl { trait_: Some(_), .. })
|
||||
|
|
|
|||
|
|
@ -70,7 +70,8 @@ impl DocFolder for StabilityPropagator<'_, '_> {
|
|||
| ItemKind::TyMethodItem(..)
|
||||
| ItemKind::MethodItem(..)
|
||||
| ItemKind::RequiredAssocConstItem(..)
|
||||
| ItemKind::AssocConstItem(..)
|
||||
| ItemKind::ProvidedAssocConstItem(..)
|
||||
| ItemKind::ImplAssocConstItem(..)
|
||||
| ItemKind::TyAssocTypeItem(..)
|
||||
| ItemKind::AssocTypeItem(..)
|
||||
| ItemKind::PrimitiveItem(..)
|
||||
|
|
|
|||
|
|
@ -79,7 +79,10 @@ impl DocFolder for Stripper<'_, '_> {
|
|||
}
|
||||
}
|
||||
|
||||
clean::MethodItem(..) | clean::AssocConstItem(..) | clean::AssocTypeItem(..) => {
|
||||
clean::MethodItem(..)
|
||||
| clean::ProvidedAssocConstItem(..)
|
||||
| clean::ImplAssocConstItem(..)
|
||||
| clean::AssocTypeItem(..) => {
|
||||
let item_id = i.item_id;
|
||||
if item_id.is_local()
|
||||
&& !self.effective_visibilities.is_reachable(self.tcx, item_id.expect_def_id())
|
||||
|
|
|
|||
|
|
@ -45,7 +45,8 @@ pub(crate) trait DocVisitor<'a>: Sized {
|
|||
| ProcMacroItem(_)
|
||||
| PrimitiveItem(_)
|
||||
| RequiredAssocConstItem(..)
|
||||
| AssocConstItem(..)
|
||||
| ProvidedAssocConstItem(..)
|
||||
| ImplAssocConstItem(..)
|
||||
| TyAssocTypeItem(..)
|
||||
| AssocTypeItem(..)
|
||||
| KeywordItem => {}
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue