-
-
Notifications
You must be signed in to change notification settings - Fork 14.9k
Rustdoc bang attr macro #152449
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
base: main
Are you sure you want to change the base?
Rustdoc bang attr macro #152449
Changes from all commits
02f4e28
4407458
1c13e59
ee9a2ea
e39cad1
5f0a8b3
4165fea
ac4d900
31571ad
ed4d5b0
09bab4f
6eca740
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
| Original file line number | Diff line number | Diff line change |
|---|---|---|
|
|
@@ -13,7 +13,7 @@ use rustc_data_structures::fx::{FxHashSet, FxIndexMap, FxIndexSet}; | |
| use rustc_data_structures::thin_vec::ThinVec; | ||
| use rustc_hir as hir; | ||
| use rustc_hir::attrs::{AttributeKind, DeprecatedSince, Deprecation, DocAttribute}; | ||
| use rustc_hir::def::{CtorKind, DefKind, Res}; | ||
| use rustc_hir::def::{CtorKind, DefKind, MacroKinds, Res}; | ||
| use rustc_hir::def_id::{CrateNum, DefId, LOCAL_CRATE, LocalDefId}; | ||
| use rustc_hir::lang_items::LangItem; | ||
| use rustc_hir::{Attribute, BodyId, ConstStability, Mutability, Stability, StableSince, find_attr}; | ||
|
|
@@ -745,11 +745,33 @@ impl Item { | |
| find_attr!(&self.attrs.other_attrs, NonExhaustive(..)) | ||
| } | ||
|
|
||
| /// Returns a documentation-level item type from the item. | ||
| /// Returns a documentation-level item type from the item. In case of a `macro_rules!` which | ||
| /// contains an attr/derive kind, it will always return `ItemType::Macro`. If you want all | ||
| /// kinds, you need to use [`Item::types`]. | ||
| pub(crate) fn type_(&self) -> ItemType { | ||
| ItemType::from(self) | ||
| } | ||
|
|
||
| /// Returns an item types. There is only one case where it can return more than one kind: | ||
| /// for `macro_rules!` items which contain an attr/derive kind. | ||
| pub(crate) fn types(&self) -> impl Iterator<Item = ItemType> { | ||
| if let ItemKind::MacroItem(_, macro_kinds) = self.kind { | ||
| Either::Right(macro_kinds.iter().map(|kind| match kind { | ||
| MacroKinds::ATTR => ItemType::DeclMacroAttribute, | ||
| MacroKinds::DERIVE => ItemType::DeclMacroDerive, | ||
| MacroKinds::BANG => ItemType::Macro, | ||
| _ => panic!("unsupported macro kind {kind:?}"), | ||
| })) | ||
| } else { | ||
| Either::Left(std::iter::once(self.type_())) | ||
| } | ||
| } | ||
|
GuillaumeGomez marked this conversation as resolved.
|
||
|
|
||
| /// Returns true if this a macro declared with the `macro` keyword or with `macro_rules!. | ||
| pub(crate) fn is_bang_macro_or_macro_rules(&self) -> bool { | ||
| matches!(self.kind, ItemKind::MacroItem(..)) | ||
| } | ||
|
|
||
| pub(crate) fn defaultness(&self) -> Option<Defaultness> { | ||
| match self.kind { | ||
| ItemKind::MethodItem(_, defaultness) | ItemKind::RequiredMethodItem(_, defaultness) => { | ||
|
|
@@ -759,6 +781,11 @@ impl Item { | |
| } | ||
| } | ||
|
|
||
| /// Generates the HTML file name based on the item kind. | ||
| pub(crate) fn html_filename(&self) -> String { | ||
| format!("{type_}.{name}.html", type_ = self.type_(), name = self.name.unwrap()) | ||
|
Contributor
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. here we use the
Member
Author
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Not really considering that at this point, the |
||
| } | ||
|
|
||
| /// Returns a `FnHeader` if `self` is a function item, otherwise returns `None`. | ||
| pub(crate) fn fn_header(&self, tcx: TyCtxt<'_>) -> Option<hir::FnHeader> { | ||
| fn build_fn_header( | ||
|
|
@@ -918,7 +945,13 @@ pub(crate) enum ItemKind { | |
| ForeignStaticItem(Static, hir::Safety), | ||
| /// `type`s from an extern block | ||
| ForeignTypeItem, | ||
| MacroItem(Macro), | ||
| /// A macro defined with `macro_rules` or the `macro` keyword. It can be multiple things (macro, | ||
| /// derive and attribute, potentially multiple at once). Don't forget to look into the | ||
| ///`MacroKinds` values. | ||
| /// | ||
| /// If a `macro_rules!` only contains a `attr`/`derive` branch, then it's not stored in this | ||
| /// variant but in the `ProcMacroItem` variant. | ||
| MacroItem(Macro, MacroKinds), | ||
| ProcMacroItem(ProcMacro), | ||
| PrimitiveItem(PrimitiveType), | ||
| /// A required associated constant in a trait declaration. | ||
|
|
@@ -973,7 +1006,7 @@ impl ItemKind { | |
| | ForeignFunctionItem(_, _) | ||
| | ForeignStaticItem(_, _) | ||
| | ForeignTypeItem | ||
| | MacroItem(_) | ||
| | MacroItem(..) | ||
| | ProcMacroItem(_) | ||
| | PrimitiveItem(_) | ||
| | RequiredAssocConstItem(..) | ||
|
|
||
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I think this is wrong, a
macro_rules!macro should be able to go into this branch, which does not seem ideal.Do we really not have a way of just... checking if something is a proc macro or not? can
clean_proc_macrohandle being given a non-proc macro?There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
In this case, if
macro_rules!containing only an attr or a derive, we treat them the same as their proc-macro equivalent.There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
is that the desired behavior? it seems somewhat odd.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Yep it is. :)