Skip to content
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

rustdoc: Add support for #[rustc_must_implement_one_of] #99235

Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions src/librustdoc/clean/mod.rs
Original file line number Diff line number Diff line change
Expand Up @@ -1991,6 +1991,7 @@ fn clean_maybe_renamed_item<'tcx>(
ItemKind::Trait(_, _, generics, bounds, item_ids) => {
let items =
item_ids.iter().map(|ti| cx.tcx.hir().trait_item(ti.id).clean(cx)).collect();

TraitItem(Trait {
def_id,
items,
Expand Down
21 changes: 16 additions & 5 deletions src/librustdoc/html/render/print_item.rs
Original file line number Diff line number Diff line change
@@ -1,9 +1,5 @@
use clean::AttributesExt;

use std::cmp::Ordering;
use std::fmt;
use std::rc::Rc;

use rustc_data_structures::fx::{FxHashMap, FxHashSet};
use rustc_hir as hir;
use rustc_hir::def::CtorKind;
Expand All @@ -15,6 +11,9 @@ use rustc_middle::ty::{Adt, TyCtxt};
use rustc_span::hygiene::MacroKind;
use rustc_span::symbol::{kw, sym, Symbol};
use rustc_target::abi::{Layout, Primitive, TagEncoding, Variants};
use std::cmp::Ordering;
use std::fmt;
use std::rc::Rc;

use super::{
collect_paths_for_type, document, ensure_trailing_slash, item_ty_to_section,
Expand All @@ -37,6 +36,7 @@ use crate::html::markdown::{HeadingOffset, MarkdownSummaryLine};
use crate::html::url_parts_builder::UrlPartsBuilder;

use askama::Template;
use itertools::Itertools;

const ITEM_TABLE_OPEN: &str = "<div class=\"item-table\">";
const ITEM_TABLE_CLOSE: &str = "</div>";
Expand Down Expand Up @@ -539,6 +539,8 @@ fn item_trait(w: &mut Buffer, cx: &mut Context<'_>, it: &clean::Item, t: &clean:
let count_types = required_types.len() + provided_types.len();
let count_consts = required_consts.len() + provided_consts.len();
let count_methods = required_methods.len() + provided_methods.len();
let must_implement_one_of_functions =
cx.tcx().trait_def(t.def_id).must_implement_one_of.clone();

// Output the trait definition
wrap_into_docblock(w, |w| {
Expand Down Expand Up @@ -784,13 +786,22 @@ fn item_trait(w: &mut Buffer, cx: &mut Context<'_>, it: &clean::Item, t: &clean:
}

// Output the documentation for each function individually
if !required_methods.is_empty() {
if !required_methods.is_empty() || must_implement_one_of_functions.is_some() {
write_small_section_header(
w,
"required-methods",
"Required Methods",
"<div class=\"methods\">",
);

if let Some(list) = must_implement_one_of_functions.as_deref() {
write!(
w,
"<div class=\"stab must_implement\">At least one of the `{}` methods is required.</div>",
list.iter().join("`, `")
);
}

for m in required_methods {
trait_item(w, cx, m, it);
}
Expand Down
4 changes: 3 additions & 1 deletion src/librustdoc/html/static/css/themes/ayu.css
Original file line number Diff line number Diff line change
Expand Up @@ -205,11 +205,13 @@ details.rustdoc-toggle > summary::before {

/* Created this empty rule to satisfy the theme checks. */
.stab.empty-impl {}
.stab.must_implement {}

.stab.unstable,
.stab.deprecated,
.stab.portability,
.stab.empty-impl {
.stab.empty-impl,
.stab.must_implement {
color: #c5c5c5;
background: #314559 !important;
border-style: none !important;
Expand Down
1 change: 1 addition & 0 deletions src/librustdoc/html/static/css/themes/dark.css
Original file line number Diff line number Diff line change
Expand Up @@ -180,6 +180,7 @@ details.rustdoc-toggle > summary::before {
.stab.empty-impl { background: #FFF5D6; border-color: #FFC600; color: #2f2f2f; }
.stab.unstable { background: #FFF5D6; border-color: #FFC600; color: #2f2f2f; }
.stab.deprecated { background: #ffc4c4; border-color: #db7b7b; color: #2f2f2f; }
.stab.must_implement { background: #F3DFFF; border-color: #b07bdb; color: #2f2f2f; }
.stab.portability { background: #F3DFFF; border-color: #b07bdb; color: #2f2f2f; }
.stab.portability > code { background: none; }

Expand Down
1 change: 1 addition & 0 deletions src/librustdoc/html/static/css/themes/light.css
Original file line number Diff line number Diff line change
Expand Up @@ -163,6 +163,7 @@ details.rustdoc-toggle > summary::before {
.stab.empty-impl { background: #FFF5D6; border-color: #FFC600; }
.stab.unstable { background: #FFF5D6; border-color: #FFC600; }
.stab.deprecated { background: #ffc4c4; border-color: #db7b7b; }
.stab.must_implement { background: #F3DFFF; border-color: #b07bdb; }
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

You need to add this into ayu.css as well.

Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

It was already there though. Adding .stab.must_implement{} fixed the issue, seems like a bug in the checker...

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

No, the rule isn't the same so to speak. They needed to be all split (hence why it was unhappy). The joy of CSS. :)

.stab.portability { background: #F3DFFF; border-color: #b07bdb; }
.stab.portability > code { background: none; }

Expand Down
10 changes: 10 additions & 0 deletions src/test/rustdoc/must_implement_one_of.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
#![crate_name = "c"]
#![feature(rustc_attrs)]

#[rustc_must_implement_one_of(a, b)]
// @matches c/trait.Trait.html '//*[@class="stab must_implement"]' \
// 'At least one of the `a`, `b` methods is required.$'
pub trait Trait {
fn a() {}
fn b() {}
}
GuillaumeGomez marked this conversation as resolved.
Show resolved Hide resolved