diff options
| author | David Tolnay <dtolnay@gmail.com> | 2024-12-11 11:34:50 -0800 |
|---|---|---|
| committer | David Tolnay <dtolnay@gmail.com> | 2024-12-19 10:46:50 -0800 |
| commit | 044885c8ae8e296963327b7b60cd4e08118104e3 (patch) | |
| tree | d2f1a9b251a49ea7858ca17d893016079a76b417 | |
| parent | 57e1a47dc4ef07c52db70737b1dee3944f729f95 (diff) | |
| download | rust-044885c8ae8e296963327b7b60cd4e08118104e3.tar.gz rust-044885c8ae8e296963327b7b60cd4e08118104e3.zip | |
Split AssocConstItem into ProvidedAssocConstItem and ImplAssocConstItem
| -rw-r--r-- | src/librustdoc/clean/mod.rs | 37 | ||||
| -rw-r--r-- | src/librustdoc/clean/types.rs | 16 | ||||
| -rw-r--r-- | src/librustdoc/fold.rs | 3 | ||||
| -rw-r--r-- | src/librustdoc/formats/cache.rs | 12 | ||||
| -rw-r--r-- | src/librustdoc/formats/item_type.rs | 4 | ||||
| -rw-r--r-- | src/librustdoc/html/render/mod.rs | 8 | ||||
| -rw-r--r-- | src/librustdoc/json/conversions.rs | 2 | ||||
| -rw-r--r-- | src/librustdoc/passes/check_doc_test_visibility.rs | 3 | ||||
| -rw-r--r-- | src/librustdoc/passes/propagate_stability.rs | 3 | ||||
| -rw-r--r-- | src/librustdoc/passes/stripper.rs | 5 | ||||
| -rw-r--r-- | src/librustdoc/visit.rs | 3 |
11 files changed, 62 insertions, 34 deletions
diff --git a/src/librustdoc/clean/mod.rs b/src/librustdoc/clean/mod.rs index a96be705262..51ff70a69fe 100644 --- a/src/librustdoc/clean/mod.rs +++ b/src/librustdoc/clean/mod.rs @@ -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 => { diff --git a/src/librustdoc/clean/types.rs b/src/librustdoc/clean/types.rs index f3f0b72d65d..feec8ac5b22 100644 --- a/src/librustdoc/clean/types.rs +++ b/src/librustdoc/clean/types.rs @@ -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(_) diff --git a/src/librustdoc/fold.rs b/src/librustdoc/fold.rs index 604d588586d..d2e3b9ce2e4 100644 --- a/src/librustdoc/fold.rs +++ b/src/librustdoc/fold.rs @@ -92,7 +92,8 @@ pub(crate) trait DocFolder: Sized { | ProcMacroItem(_) | PrimitiveItem(_) | RequiredAssocConstItem(..) - | AssocConstItem(..) + | ProvidedAssocConstItem(..) + | ImplAssocConstItem(..) | TyAssocTypeItem(..) | AssocTypeItem(..) | KeywordItem => kind, diff --git a/src/librustdoc/formats/cache.rs b/src/librustdoc/formats/cache.rs index f8f26c203f4..a87979ab186 100644 --- a/src/librustdoc/formats/cache.rs +++ b/src/librustdoc/formats/cache.rs @@ -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); } diff --git a/src/librustdoc/formats/item_type.rs b/src/librustdoc/formats/item_type.rs index 43170cecad5..8f5e26d0104 100644 --- a/src/librustdoc/formats/item_type.rs +++ b/src/librustdoc/formats/item_type.rs @@ -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, diff --git a/src/librustdoc/html/render/mod.rs b/src/librustdoc/html/render/mod.rs index 7bccd6cc7df..4d9faf2f568 100644 --- a/src/librustdoc/html/render/mod.rs +++ b/src/librustdoc/html/render/mod.rs @@ -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, diff --git a/src/librustdoc/json/conversions.rs b/src/librustdoc/json/conversions.rs index d83ac2c7648..36a0aa0fdfa 100644 --- a/src/librustdoc/json/conversions.rs +++ b/src/librustdoc/json/conversions.rs @@ -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)), }, diff --git a/src/librustdoc/passes/check_doc_test_visibility.rs b/src/librustdoc/passes/check_doc_test_visibility.rs index 465569c1363..2b0af187b2d 100644 --- a/src/librustdoc/passes/check_doc_test_visibility.rs +++ b/src/librustdoc/passes/check_doc_test_visibility.rs @@ -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(_), .. }) diff --git a/src/librustdoc/passes/propagate_stability.rs b/src/librustdoc/passes/propagate_stability.rs index d534ee56e45..1f9dc753660 100644 --- a/src/librustdoc/passes/propagate_stability.rs +++ b/src/librustdoc/passes/propagate_stability.rs @@ -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(..) diff --git a/src/librustdoc/passes/stripper.rs b/src/librustdoc/passes/stripper.rs index 3994f634f15..7dc7856405e 100644 --- a/src/librustdoc/passes/stripper.rs +++ b/src/librustdoc/passes/stripper.rs @@ -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()) diff --git a/src/librustdoc/visit.rs b/src/librustdoc/visit.rs index 43a33e0ac1d..397ff8873a3 100644 --- a/src/librustdoc/visit.rs +++ b/src/librustdoc/visit.rs @@ -45,7 +45,8 @@ pub(crate) trait DocVisitor<'a>: Sized { | ProcMacroItem(_) | PrimitiveItem(_) | RequiredAssocConstItem(..) - | AssocConstItem(..) + | ProvidedAssocConstItem(..) + | ImplAssocConstItem(..) | TyAssocTypeItem(..) | AssocTypeItem(..) | KeywordItem => {} |
