-
Notifications
You must be signed in to change notification settings - Fork 12.8k
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
RFC 2008 non-exhaustive enums/structs: Rustdoc #51854
Merged
Merged
Changes from 3 commits
Commits
Show all changes
8 commits
Select commit
Hold shift + click to select a range
a074bd7
Display #[non_exhaustive] in rustdoc on types.
davidtwco 039709d
Include type in non-exhaustive message. Include new css in dark theme.
davidtwco 3e59aef
Improved non_exhaustive message.
davidtwco 5ccafa1
Simplified checking for non_exhaustive attribute.
davidtwco 9527d6a
Moved non_exhaustive message to fields/variants section and onto type.
davidtwco d0d33a0
Switch to any from count when checking for non_exhaustive attribute.
davidtwco 959a13d
Updated wording and placement of non-exhaustive notice so it is colla…
davidtwco b671bdc
Updated FRU terminology.
davidtwco File filter
Filter by extension
Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -2194,6 +2194,7 @@ fn document(w: &mut fmt::Formatter, cx: &Context, item: &clean::Item) -> fmt::Re | |
info!("Documenting {}", name); | ||
} | ||
document_stability(w, cx, item)?; | ||
document_non_exhaustive(w, item)?; | ||
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. ...though now i see why you did it this way. I commented in #51860 (comment) that this marker could go into the "Fields" or "Variants" sections of the struct/enum pages, rather than at the top of the full docs. |
||
let prefix = render_assoc_const_value(item); | ||
document_full(w, item, cx, &prefix)?; | ||
Ok(()) | ||
|
@@ -2262,6 +2263,42 @@ fn document_stability(w: &mut fmt::Formatter, cx: &Context, item: &clean::Item) | |
Ok(()) | ||
} | ||
|
||
fn document_non_exhaustive(w: &mut fmt::Formatter, item: &clean::Item) -> fmt::Result { | ||
if item.non_exhaustive { | ||
write!(w, "<div class='non-exhaustive'><div class='stab non-exhaustive'>")?; | ||
write!(w, "<details><summary><span class=microscope>🔬</span>")?; | ||
|
||
if item.is_struct() { | ||
write!(w, "This struct is marked as non exhaustive.")?; | ||
} else if item.is_enum() { | ||
write!(w, "This enum is marked as non exhaustive.")?; | ||
} else { | ||
write!(w, "This type is marked as non exhaustive.")?; | ||
} | ||
|
||
write!(w, "</summary><p>")?; | ||
|
||
if item.is_struct() { | ||
write!(w, "This struct is marked as non-exhaustive as additional fields may be \ | ||
added in the future. This means that this struct cannot be constructed in \ | ||
external crates using the traditional <code>Struct {{ .. }}</code> syntax; | ||
cannot be matched against without a wildcard <code>..</code>; and \ | ||
functional-record-updates do not work on this struct.")?; | ||
} else if item.is_enum() { | ||
write!(w, "This enum is marked as non-exhaustive, and additional variants may be \ | ||
added in the future. When matching over values of this type, an extra \ | ||
<code>_</code> arm must be added to account for future extensions.")?; | ||
} else { | ||
write!(w, "This type will require a wildcard arm in any match statements or \ | ||
constructors.")?; | ||
} | ||
|
||
write!(w, "</p></details></div></div>")?; | ||
} | ||
|
||
Ok(()) | ||
} | ||
|
||
fn name_key(name: &str) -> (&str, u64, usize) { | ||
// find number at end | ||
let split = name.bytes().rposition(|b| b < b'0' || b'9' < b).map_or(0, |s| s + 1); | ||
|
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
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 i'd prefer seeing the
non_exhaustive
marker just on the kinds where it's relevant, so justStruct
/Enum
/etc, instead of onItem
here where literally everything has to care about it.On the other hand, if i remember right we do keep all the
ast::Attribute
s around in theAttributes
struct, so we could just query them as needed, rather than passing this flag around all the way fromclean_ast
tohtml/render
.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.
This should be resolved now.