-
Notifications
You must be signed in to change notification settings - Fork 13.3k
rustdoc: Fix ICE with doc(hidden)
on tuple variant fields
#88639
New issue
Have a question about this project? # for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “#”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? # to your account
Conversation
(rust-highfive has picked a reviewer for you, use r? to override) |
Generates from pub enum FooEnum {
HiddenTupleItem(#[doc(hidden)] ()),
MultipleHidden(#[doc(hidden)] (), #[doc(hidden)] ()),
MixedHiddenTupleItemLast((), #[doc(hidden)] ()),
MixedHiddenTupleItemFirst(#[doc(hidden)] (), ()),
NotHiddenTupleItem1(()),
NotHiddenTupleItem2((), ()),
} I don't like how the Variants are shown, preferably I'd have it as |
@@ -944,13 +944,17 @@ fn item_union(w: &mut Buffer, cx: &Context<'_>, it: &clean::Item, s: &clean::Uni | |||
fn print_tuple_struct_fields(w: &mut Buffer, cx: &Context<'_>, s: &[clean::Item]) { | |||
for (i, ty) in s | |||
.iter() | |||
.map(|f| if let clean::StructFieldItem(ref ty) = *f.kind { ty } else { unreachable!() }) | |||
.map(|f| if let clean::StructFieldItem(ref ty) = *f.kind { Some(ty) } else { None }) |
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.
It should be possible at this stage, it means that the clean::Item
was badly created... Can you find out where a non-StructFieldItem
was added please?
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.
Do you mean it shouldn't be possible to create a clean::Item
with StructFieldItem
kind?
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 meant that a tuple item (when creating a new one) should only have StructFieldItem
and discard everything else. (In clean/mod.rs
iirc, sorry, not on computer at the moment)
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.
The kind we end up with is
StrippedItem(StructFieldItem(Tuple([])))
my brief look into how the render works suggests to me that this is correct, and that it just needs to be handled.
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.
Isn't there the same issue with:
pub enum Foo {
Bar {
x: u32,
#[doc(hidden)]
y: u8,
}
}
?
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.
Also, please add a regression test to ensure that this doesn't panic anymore in the future. But otherwise it looks like a great start, thanks! EDIT: In |
This comment has been minimized.
This comment has been minimized.
I'm trying to figure out how I'd do HTML checking with would // @!has issue_88600/enum.FooEnum.html '//*[@id="variant.HiddenTupleItem.field.0"]' etc. be enough? |
Also check that the other fields are present, but otherwise seems good. |
eaeed12
to
650adfc
Compare
Fixed :D Seems like // @!has issue_88600/enum.FooEnum.html '//*[@id="variant.HiddenTupleItem.field.0"]' doesn't actually work, need to specify a pattern to not match. |
I don't think this is a good idea. Enum fields are always public, they shouldn't be hidden from documentation. This should only fix the ICE, but not change the behavior (and actually I would suggest warning that doc(hidden) does nothing in that position as well). |
doc(hidden)
Also, @GuillaumeGomez please remember to check with the team before making changes in behavior like this, this is a feature we'd have to support into the future. |
Well that seems like a misfeature ... But I guess if it already existed that's fine. Have you tested this respects --document-hidden-items? |
That works just fine, I think that's because |
My bad, I thought it was something already supported. What should we do then? Opening an FCP or just discard it and do what I suggested here? |
@GuillaumeGomez oh no, I was just confused - I thought this was a no-op before. |
Perfect, back to reviewing then. ;) |
Looks good to me, thanks! r=me once CI pass. |
doc(hidden)
doc(hidden)
on tuple variant fields
It actually looks like rustdoc's behavior for this changed between stable and 2021-08-21. I don't think that change was intentional, so I'm wondering if we should revert the behavior change in this PR before it hits stable? |
It looks likely that the behavior changed in #87451. |
No worries! Ok, I'll fix the behaviour. I spent a good time trying to find out how to get the variant, but it's not wasted time, I now know more about the internals. Thanks for the help :) So in summary.
Ill add a doc-test to make sure the behaviour is consistent for both variants, I'll do this in a test called For documentation, the lint code I ended up with was fn check_doc_hidden(&self, meta: &NestedMetaItem, hir_id: HirId, target: Target) -> bool {
match target {
Target::Field => {
let parent_node_hir_id = self.tcx.hir().get_parent_node(hir_id);
let parent_node = self.tcx.hir().find(parent_node_hir_id);
if let Some(hir::Node::Variant(hir::Variant {
data: hir::VariantData::Tuple(..),
..
})) = parent_node
{
self.tcx.struct_span_lint_hir(
INVALID_DOC_ATTRIBUTES,
hir_id,
meta.span(),
|lint| {
lint.build("#[doc(hidden)] does nothing on enum variant fields").emit()
},
);
return false;
}
}
_ => {}
}
true
} |
1db6283
to
81709f2
Compare
81709f2
to
4b97a33
Compare
I'd want to make sure the |
this also renders them as `_`, which rustdoc previously did not.
4b97a33
to
4a915ac
Compare
Thanks! @bors: r+ |
📌 Commit 4a915ac has been approved by |
Accepted for backport to 1.56 beta. @rustbot label: +beta-accepted |
…aumeGomez rustdoc: Fix ICE with `doc(hidden)` on tuple variant fields Fixes rust-lang#88600. ```rust pub struct H; pub struct S; pub enum FooEnum { HiddenTupleItem(#[doc(hidden)] H), MultipleHidden(#[doc(hidden)] H, #[doc(hidden)] H), MixedHiddenFirst(#[doc(hidden)] H, S), MixedHiddenLast(S, #[doc(hidden)] H), HiddenStruct { #[doc(hidden)] h: H, s: S, }, } ``` Generates 
…arth Rollup of 15 pull requests Successful merges: - rust-lang#85200 (Ignore derived Clone and Debug implementations during dead code analysis) - rust-lang#86165 (Add proc_macro::Span::{before, after}.) - rust-lang#87088 (Fix stray notes when the source code is not available) - rust-lang#87441 (Emit suggestion when passing byte literal to format macro) - rust-lang#88546 (Emit proper errors when on missing closure braces) - rust-lang#88578 (fix(rustc): suggest `items` be borrowed in `for i in items[x..]`) - rust-lang#88632 (Fix issues with Markdown summary options) - rust-lang#88639 (rustdoc: Fix ICE with `doc(hidden)` on tuple variant fields) - rust-lang#88667 (Tweak `write_fmt` doc.) - rust-lang#88720 (Rustdoc coverage fields count) - rust-lang#88732 (RustWrapper: avoid deleted unclear attribute methods) - rust-lang#88742 (Fix table in docblocks) - rust-lang#88776 (Workaround blink/chromium grid layout limitation of 1000 rows) - rust-lang#88807 (Fix typo in docs for iterators) - rust-lang#88812 (Fix typo `option` -> `options`.) Failed merges: r? `@ghost` `@rustbot` modify labels: rollup
[beta] backports - rustdoc: Fix ICE with `doc(hidden)` on tuple variant fields rust-lang#88639 - Fix 2021 `dyn` suggestion that used code as label rust-lang#88657 - Workaround blink/chromium grid layout limitation of 1000 rows rust-lang#88776 - Change scope of temporaries in match guards rust-lang#88678 - Add a regression test for rust-lang#88649 rust-lang#88691 - Revert anon union parsing rust-lang#88775 - Disable validate_maintainers. rust-lang#88977 Also drop stage0 rustfmt, because that's only supposed to be used on master. r? `@Mark-Simulacrum`
Fixes #88600.
Generates
