Auto merge of #84241 - Dylan-DPC:rollup-jk9nt6k, r=Dylan-DPC
Rollup of 4 pull requests Successful merges: - #83337 (rustdoc: Hide item contents, not items) - #83944 (Fix a couple resolve bugs from binder refactor) - #84145 (Address comments for vecdeque_binary_search #78021) - #84172 (Compiler error messages: reduce assertiveness of message E0384) Failed merges: r? `@ghost` `@rustbot` modify labels: rollup
This commit is contained in:
commit
2faef12b65
@ -1681,7 +1681,7 @@ impl<'cx, 'tcx> MirBorrowckCtxt<'cx, 'tcx> {
|
||||
if decl.can_be_made_mutable() {
|
||||
err.span_suggestion(
|
||||
decl.source_info.span,
|
||||
"make this binding mutable",
|
||||
"consider making this binding mutable",
|
||||
format!("mut {}", name),
|
||||
Applicability::MachineApplicable,
|
||||
);
|
||||
|
@ -2719,6 +2719,13 @@ impl<'a, 'tcx> LifetimeContext<'a, 'tcx> {
|
||||
Some(next) => next,
|
||||
None => break None,
|
||||
};
|
||||
// See issue #83753. If someone writes an associated type on a non-trait, just treat it as
|
||||
// there being no supertrait HRTBs.
|
||||
match tcx.def_kind(def_id) {
|
||||
DefKind::Trait | DefKind::TraitAlias | DefKind::Impl => {}
|
||||
_ => break None,
|
||||
}
|
||||
|
||||
if trait_defines_associated_type_named(def_id) {
|
||||
break Some(bound_vars.into_iter().collect());
|
||||
}
|
||||
@ -2764,7 +2771,14 @@ impl<'a, 'tcx> LifetimeContext<'a, 'tcx> {
|
||||
| Scope::TraitRefBoundary { ref s, .. } => {
|
||||
scope = *s;
|
||||
}
|
||||
Scope::Root => bug!("In fn_like_elision without appropriate scope above"),
|
||||
Scope::Root => {
|
||||
// See issue #83907. Just bail out from looking inside.
|
||||
self.tcx.sess.delay_span_bug(
|
||||
rustc_span::DUMMY_SP,
|
||||
"In fn_like_elision without appropriate scope above",
|
||||
);
|
||||
return;
|
||||
}
|
||||
}
|
||||
};
|
||||
// While not strictly necessary, we gather anon lifetimes *before* actually
|
||||
|
@ -2403,6 +2403,12 @@ impl<T> VecDeque<T> {
|
||||
/// [`Result::Err`] is returned, containing the index where a matching
|
||||
/// element could be inserted while maintaining sorted order.
|
||||
///
|
||||
/// See also [`binary_search_by`], [`binary_search_by_key`], and [`partition_point`].
|
||||
///
|
||||
/// [`binary_search_by`]: VecDeque::binary_search_by
|
||||
/// [`binary_search_by_key`]: VecDeque::binary_search_by_key
|
||||
/// [`partition_point`]: VecDeque::partition_point
|
||||
///
|
||||
/// # Examples
|
||||
///
|
||||
/// Looks up a series of four elements. The first is found, with a
|
||||
@ -2457,6 +2463,12 @@ impl<T> VecDeque<T> {
|
||||
/// [`Result::Err`] is returned, containing the index where a matching
|
||||
/// element could be inserted while maintaining sorted order.
|
||||
///
|
||||
/// See also [`binary_search`], [`binary_search_by_key`], and [`partition_point`].
|
||||
///
|
||||
/// [`binary_search`]: VecDeque::binary_search
|
||||
/// [`binary_search_by_key`]: VecDeque::binary_search_by_key
|
||||
/// [`partition_point`]: VecDeque::partition_point
|
||||
///
|
||||
/// # Examples
|
||||
///
|
||||
/// Looks up a series of four elements. The first is found, with a
|
||||
@ -2481,8 +2493,11 @@ impl<T> VecDeque<T> {
|
||||
F: FnMut(&'a T) -> Ordering,
|
||||
{
|
||||
let (front, back) = self.as_slices();
|
||||
let cmp_back = back.first().map(|elem| f(elem));
|
||||
|
||||
if let Some(Ordering::Less | Ordering::Equal) = back.first().map(|elem| f(elem)) {
|
||||
if let Some(Ordering::Equal) = cmp_back {
|
||||
Ok(front.len())
|
||||
} else if let Some(Ordering::Less) = cmp_back {
|
||||
back.binary_search_by(f).map(|idx| idx + front.len()).map_err(|idx| idx + front.len())
|
||||
} else {
|
||||
front.binary_search_by(f)
|
||||
@ -2492,8 +2507,7 @@ impl<T> VecDeque<T> {
|
||||
/// Binary searches this sorted `VecDeque` with a key extraction function.
|
||||
///
|
||||
/// Assumes that the `VecDeque` is sorted by the key, for instance with
|
||||
/// [`make_contiguous().sort_by_key()`](#method.make_contiguous) using the same
|
||||
/// key extraction function.
|
||||
/// [`make_contiguous().sort_by_key()`] using the same key extraction function.
|
||||
///
|
||||
/// If the value is found then [`Result::Ok`] is returned, containing the
|
||||
/// index of the matching element. If there are multiple matches, then any
|
||||
@ -2501,6 +2515,13 @@ impl<T> VecDeque<T> {
|
||||
/// [`Result::Err`] is returned, containing the index where a matching
|
||||
/// element could be inserted while maintaining sorted order.
|
||||
///
|
||||
/// See also [`binary_search`], [`binary_search_by`], and [`partition_point`].
|
||||
///
|
||||
/// [`make_contiguous().sort_by_key()`]: VecDeque::make_contiguous
|
||||
/// [`binary_search`]: VecDeque::binary_search
|
||||
/// [`binary_search_by`]: VecDeque::binary_search_by
|
||||
/// [`partition_point`]: VecDeque::partition_point
|
||||
///
|
||||
/// # Examples
|
||||
///
|
||||
/// Looks up a series of four elements in a slice of pairs sorted by
|
||||
@ -2531,6 +2552,51 @@ impl<T> VecDeque<T> {
|
||||
{
|
||||
self.binary_search_by(|k| f(k).cmp(b))
|
||||
}
|
||||
|
||||
/// Returns the index of the partition point according to the given predicate
|
||||
/// (the index of the first element of the second partition).
|
||||
///
|
||||
/// The deque is assumed to be partitioned according to the given predicate.
|
||||
/// This means that all elements for which the predicate returns true are at the start of the deque
|
||||
/// and all elements for which the predicate returns false are at the end.
|
||||
/// For example, [7, 15, 3, 5, 4, 12, 6] is a partitioned under the predicate x % 2 != 0
|
||||
/// (all odd numbers are at the start, all even at the end).
|
||||
///
|
||||
/// If this deque is not partitioned, the returned result is unspecified and meaningless,
|
||||
/// as this method performs a kind of binary search.
|
||||
///
|
||||
/// See also [`binary_search`], [`binary_search_by`], and [`binary_search_by_key`].
|
||||
///
|
||||
/// [`binary_search`]: VecDeque::binary_search
|
||||
/// [`binary_search_by`]: VecDeque::binary_search_by
|
||||
/// [`binary_search_by_key`]: VecDeque::binary_search_by_key
|
||||
///
|
||||
/// # Examples
|
||||
///
|
||||
/// ```
|
||||
/// #![feature(vecdeque_binary_search)]
|
||||
/// use std::collections::VecDeque;
|
||||
///
|
||||
/// let deque: VecDeque<_> = vec![1, 2, 3, 3, 5, 6, 7].into();
|
||||
/// let i = deque.partition_point(|&x| x < 5);
|
||||
///
|
||||
/// assert_eq!(i, 4);
|
||||
/// assert!(deque.iter().take(i).all(|&x| x < 5));
|
||||
/// assert!(deque.iter().skip(i).all(|&x| !(x < 5)));
|
||||
/// ```
|
||||
#[unstable(feature = "vecdeque_binary_search", issue = "78021")]
|
||||
pub fn partition_point<P>(&self, mut pred: P) -> usize
|
||||
where
|
||||
P: FnMut(&T) -> bool,
|
||||
{
|
||||
let (front, back) = self.as_slices();
|
||||
|
||||
if let Some(true) = back.first().map(|v| pred(v)) {
|
||||
back.partition_point(pred) + front.len()
|
||||
} else {
|
||||
front.partition_point(pred)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
impl<T: Clone> VecDeque<T> {
|
||||
|
@ -1699,6 +1699,24 @@ fn test_binary_search_by_key() {
|
||||
assert_eq!(deque.binary_search_by_key(&4, |&(v,)| v), Err(3));
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn test_partition_point() {
|
||||
// Contiguous (front only) search:
|
||||
let deque: VecDeque<_> = vec![1, 2, 3, 5, 6].into();
|
||||
assert!(deque.as_slices().1.is_empty());
|
||||
assert_eq!(deque.partition_point(|&v| v <= 3), 3);
|
||||
|
||||
// Split search (both front & back non-empty):
|
||||
let mut deque: VecDeque<_> = vec![5, 6].into();
|
||||
deque.push_front(3);
|
||||
deque.push_front(2);
|
||||
deque.push_front(1);
|
||||
deque.push_back(10);
|
||||
assert!(!deque.as_slices().0.is_empty());
|
||||
assert!(!deque.as_slices().1.is_empty());
|
||||
assert_eq!(deque.partition_point(|&v| v <= 5), 4);
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn test_zero_sized_push() {
|
||||
const N: usize = 8;
|
||||
|
@ -43,7 +43,6 @@ use std::path::PathBuf;
|
||||
use std::str;
|
||||
use std::string::ToString;
|
||||
|
||||
use itertools::Itertools;
|
||||
use rustc_ast_pretty::pprust;
|
||||
use rustc_attr::{Deprecation, StabilityLevel};
|
||||
use rustc_data_structures::fx::FxHashSet;
|
||||
@ -486,18 +485,7 @@ fn settings(root_path: &str, suffix: &str, themes: &[StylePath]) -> Result<Strin
|
||||
],
|
||||
)
|
||||
.into(),
|
||||
(
|
||||
"Auto-hide item declarations",
|
||||
vec![
|
||||
("auto-hide-struct", "Auto-hide structs declaration", true),
|
||||
("auto-hide-enum", "Auto-hide enums declaration", false),
|
||||
("auto-hide-union", "Auto-hide unions declaration", true),
|
||||
("auto-hide-trait", "Auto-hide traits declaration", true),
|
||||
("auto-hide-macro", "Auto-hide macros declaration", false),
|
||||
],
|
||||
)
|
||||
.into(),
|
||||
("auto-hide-attributes", "Auto-hide item attributes.", true).into(),
|
||||
("auto-hide-large-items", "Auto-hide item contents for large items.", true).into(),
|
||||
("auto-hide-method-docs", "Auto-hide item methods' documentation", false).into(),
|
||||
("auto-hide-trait-implementations", "Auto-hide trait implementation documentation", true)
|
||||
.into(),
|
||||
@ -947,19 +935,21 @@ fn render_assoc_item(
|
||||
+ name.as_str().len()
|
||||
+ generics_len;
|
||||
|
||||
let (indent, end_newline) = if parent == ItemType::Trait {
|
||||
let (indent, indent_str, end_newline) = if parent == ItemType::Trait {
|
||||
header_len += 4;
|
||||
(4, false)
|
||||
let indent_str = " ";
|
||||
render_attributes_in_pre(w, meth, indent_str);
|
||||
(4, indent_str, false)
|
||||
} else {
|
||||
(0, true)
|
||||
render_attributes_in_code(w, meth);
|
||||
(0, "", true)
|
||||
};
|
||||
render_attributes(w, meth, false);
|
||||
w.reserve(header_len + "<a href=\"\" class=\"fnname\">{".len() + "</a>".len());
|
||||
write!(
|
||||
w,
|
||||
"{}{}{}{}{}{}{}fn <a href=\"{href}\" class=\"fnname\">{name}</a>\
|
||||
{generics}{decl}{notable_traits}{where_clause}",
|
||||
if parent == ItemType::Trait { " " } else { "" },
|
||||
indent_str,
|
||||
vis,
|
||||
constness,
|
||||
asyncness,
|
||||
@ -1015,35 +1005,33 @@ const ALLOWED_ATTRIBUTES: &[Symbol] = &[
|
||||
sym::non_exhaustive,
|
||||
];
|
||||
|
||||
// The `top` parameter is used when generating the item declaration to ensure it doesn't have a
|
||||
// left padding. For example:
|
||||
//
|
||||
// #[foo] <----- "top" attribute
|
||||
// struct Foo {
|
||||
// #[bar] <---- not "top" attribute
|
||||
// bar: usize,
|
||||
// }
|
||||
fn render_attributes(w: &mut Buffer, it: &clean::Item, top: bool) {
|
||||
let attrs = it
|
||||
.attrs
|
||||
fn attributes(it: &clean::Item) -> Vec<String> {
|
||||
it.attrs
|
||||
.other_attrs
|
||||
.iter()
|
||||
.filter_map(|attr| {
|
||||
if ALLOWED_ATTRIBUTES.contains(&attr.name_or_empty()) {
|
||||
Some(pprust::attribute_to_string(&attr))
|
||||
Some(pprust::attribute_to_string(&attr).replace("\n", "").replace(" ", " "))
|
||||
} else {
|
||||
None
|
||||
}
|
||||
})
|
||||
.join("\n");
|
||||
.collect()
|
||||
}
|
||||
|
||||
if !attrs.is_empty() {
|
||||
write!(
|
||||
w,
|
||||
"<span class=\"docblock attributes{}\">{}</span>",
|
||||
if top { " top-attr" } else { "" },
|
||||
&attrs
|
||||
);
|
||||
// When an attribute is rendered inside a `<pre>` tag, it is formatted using
|
||||
// a whitespace prefix and newline.
|
||||
fn render_attributes_in_pre(w: &mut Buffer, it: &clean::Item, prefix: &str) {
|
||||
for a in attributes(it) {
|
||||
write!(w, "{}{}\n", prefix, a);
|
||||
}
|
||||
}
|
||||
|
||||
// When an attribute is rendered inside a <code> tag, it is formatted using
|
||||
// a div to produce a newline after it.
|
||||
fn render_attributes_in_code(w: &mut Buffer, it: &clean::Item) {
|
||||
for a in attributes(it) {
|
||||
write!(w, "<div class=\"code-attribute\">{}</div>", a);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -11,8 +11,8 @@ use rustc_span::symbol::{kw, sym, Symbol};
|
||||
|
||||
use super::{
|
||||
collect_paths_for_type, document, ensure_trailing_slash, item_ty_to_strs, notable_traits_decl,
|
||||
render_assoc_item, render_assoc_items, render_attributes, render_impl,
|
||||
render_stability_since_raw, write_srclink, AssocItemLink, Context,
|
||||
render_assoc_item, render_assoc_items, render_attributes_in_code, render_attributes_in_pre,
|
||||
render_impl, render_stability_since_raw, write_srclink, AssocItemLink, Context,
|
||||
};
|
||||
use crate::clean::{self, GetDefId};
|
||||
use crate::formats::cache::Cache;
|
||||
@ -131,6 +131,26 @@ pub(super) fn print_item(cx: &Context<'_>, item: &clean::Item, buf: &mut Buffer)
|
||||
}
|
||||
}
|
||||
|
||||
/// For large structs, enums, unions, etc, determine whether to hide their fields
|
||||
fn should_hide_fields(n_fields: usize) -> bool {
|
||||
n_fields > 12
|
||||
}
|
||||
|
||||
fn toggle_open(w: &mut Buffer, text: &str) {
|
||||
write!(
|
||||
w,
|
||||
"<details class=\"rustdoc-toggle type-contents-toggle\">\
|
||||
<summary class=\"hideme\">\
|
||||
<span>Show {}</span>\
|
||||
</summary>",
|
||||
text
|
||||
);
|
||||
}
|
||||
|
||||
fn toggle_close(w: &mut Buffer) {
|
||||
w.write_str("</details>");
|
||||
}
|
||||
|
||||
fn item_module(w: &mut Buffer, cx: &Context<'_>, item: &clean::Item, items: &[clean::Item]) {
|
||||
document(w, cx, item, None);
|
||||
|
||||
@ -377,7 +397,7 @@ fn item_function(w: &mut Buffer, cx: &Context<'_>, it: &clean::Item, f: &clean::
|
||||
)
|
||||
.len();
|
||||
w.write_str("<pre class=\"rust fn\">");
|
||||
render_attributes(w, it, false);
|
||||
render_attributes_in_pre(w, it, "");
|
||||
write!(
|
||||
w,
|
||||
"{vis}{constness}{asyncness}{unsafety}{abi}fn \
|
||||
@ -406,7 +426,7 @@ fn item_trait(w: &mut Buffer, cx: &Context<'_>, it: &clean::Item, t: &clean::Tra
|
||||
// Output the trait definition
|
||||
wrap_into_docblock(w, |w| {
|
||||
w.write_str("<pre class=\"rust trait\">");
|
||||
render_attributes(w, it, true);
|
||||
render_attributes_in_pre(w, it, "");
|
||||
write!(
|
||||
w,
|
||||
"{}{}{}trait {}{}{}",
|
||||
@ -429,10 +449,25 @@ fn item_trait(w: &mut Buffer, cx: &Context<'_>, it: &clean::Item, t: &clean::Tra
|
||||
} else {
|
||||
// FIXME: we should be using a derived_id for the Anchors here
|
||||
w.write_str("{\n");
|
||||
let mut toggle = false;
|
||||
|
||||
// If there are too many associated types, hide _everything_
|
||||
if should_hide_fields(types.len()) {
|
||||
toggle = true;
|
||||
toggle_open(w, "associated items");
|
||||
}
|
||||
for t in &types {
|
||||
render_assoc_item(w, t, AssocItemLink::Anchor(None), ItemType::Trait, cx);
|
||||
w.write_str(";\n");
|
||||
}
|
||||
// If there are too many associated constants, hide everything after them
|
||||
// We also do this if the types + consts is large because otherwise we could
|
||||
// render a bunch of types and _then_ a bunch of consts just because both were
|
||||
// _just_ under the limit
|
||||
if !toggle && should_hide_fields(types.len() + consts.len()) {
|
||||
toggle = true;
|
||||
toggle_open(w, "associated constants and methods");
|
||||
}
|
||||
if !types.is_empty() && !consts.is_empty() {
|
||||
w.write_str("\n");
|
||||
}
|
||||
@ -440,6 +475,10 @@ fn item_trait(w: &mut Buffer, cx: &Context<'_>, it: &clean::Item, t: &clean::Tra
|
||||
render_assoc_item(w, t, AssocItemLink::Anchor(None), ItemType::Trait, cx);
|
||||
w.write_str(";\n");
|
||||
}
|
||||
if !toggle && should_hide_fields(required.len() + provided.len()) {
|
||||
toggle = true;
|
||||
toggle_open(w, "methods");
|
||||
}
|
||||
if !consts.is_empty() && !required.is_empty() {
|
||||
w.write_str("\n");
|
||||
}
|
||||
@ -470,6 +509,9 @@ fn item_trait(w: &mut Buffer, cx: &Context<'_>, it: &clean::Item, t: &clean::Tra
|
||||
w.write_str("<div class=\"item-spacer\"></div>");
|
||||
}
|
||||
}
|
||||
if toggle {
|
||||
toggle_close(w);
|
||||
}
|
||||
w.write_str("}");
|
||||
}
|
||||
w.write_str("</pre>")
|
||||
@ -693,7 +735,7 @@ fn item_trait(w: &mut Buffer, cx: &Context<'_>, it: &clean::Item, t: &clean::Tra
|
||||
|
||||
fn item_trait_alias(w: &mut Buffer, cx: &Context<'_>, it: &clean::Item, t: &clean::TraitAlias) {
|
||||
w.write_str("<pre class=\"rust trait-alias\">");
|
||||
render_attributes(w, it, false);
|
||||
render_attributes_in_pre(w, it, "");
|
||||
write!(
|
||||
w,
|
||||
"trait {}{}{} = {};</pre>",
|
||||
@ -714,7 +756,7 @@ fn item_trait_alias(w: &mut Buffer, cx: &Context<'_>, it: &clean::Item, t: &clea
|
||||
|
||||
fn item_opaque_ty(w: &mut Buffer, cx: &Context<'_>, it: &clean::Item, t: &clean::OpaqueTy) {
|
||||
w.write_str("<pre class=\"rust opaque\">");
|
||||
render_attributes(w, it, false);
|
||||
render_attributes_in_pre(w, it, "");
|
||||
write!(
|
||||
w,
|
||||
"type {}{}{where_clause} = impl {bounds};</pre>",
|
||||
@ -735,7 +777,7 @@ fn item_opaque_ty(w: &mut Buffer, cx: &Context<'_>, it: &clean::Item, t: &clean:
|
||||
|
||||
fn item_typedef(w: &mut Buffer, cx: &Context<'_>, it: &clean::Item, t: &clean::Typedef) {
|
||||
w.write_str("<pre class=\"rust typedef\">");
|
||||
render_attributes(w, it, false);
|
||||
render_attributes_in_pre(w, it, "");
|
||||
write!(
|
||||
w,
|
||||
"type {}{}{where_clause} = {type_};</pre>",
|
||||
@ -757,7 +799,7 @@ fn item_typedef(w: &mut Buffer, cx: &Context<'_>, it: &clean::Item, t: &clean::T
|
||||
fn item_union(w: &mut Buffer, cx: &Context<'_>, it: &clean::Item, s: &clean::Union) {
|
||||
wrap_into_docblock(w, |w| {
|
||||
w.write_str("<pre class=\"rust union\">");
|
||||
render_attributes(w, it, true);
|
||||
render_attributes_in_pre(w, it, "");
|
||||
render_union(w, it, Some(&s.generics), &s.fields, "", true, cx);
|
||||
w.write_str("</pre>")
|
||||
});
|
||||
@ -803,7 +845,7 @@ fn item_union(w: &mut Buffer, cx: &Context<'_>, it: &clean::Item, s: &clean::Uni
|
||||
fn item_enum(w: &mut Buffer, cx: &Context<'_>, it: &clean::Item, e: &clean::Enum) {
|
||||
wrap_into_docblock(w, |w| {
|
||||
w.write_str("<pre class=\"rust enum\">");
|
||||
render_attributes(w, it, true);
|
||||
render_attributes_in_pre(w, it, "");
|
||||
write!(
|
||||
w,
|
||||
"{}enum {}{}{}",
|
||||
@ -816,6 +858,10 @@ fn item_enum(w: &mut Buffer, cx: &Context<'_>, it: &clean::Item, e: &clean::Enum
|
||||
w.write_str(" {}");
|
||||
} else {
|
||||
w.write_str(" {\n");
|
||||
let toggle = should_hide_fields(e.variants.len());
|
||||
if toggle {
|
||||
toggle_open(w, "variants");
|
||||
}
|
||||
for v in &e.variants {
|
||||
w.write_str(" ");
|
||||
let name = v.name.as_ref().unwrap();
|
||||
@ -844,6 +890,9 @@ fn item_enum(w: &mut Buffer, cx: &Context<'_>, it: &clean::Item, e: &clean::Enum
|
||||
if e.variants_stripped {
|
||||
w.write_str(" // some variants omitted\n");
|
||||
}
|
||||
if toggle {
|
||||
toggle_close(w);
|
||||
}
|
||||
w.write_str("}");
|
||||
}
|
||||
w.write_str("</pre>")
|
||||
@ -976,7 +1025,7 @@ fn item_primitive(w: &mut Buffer, cx: &Context<'_>, it: &clean::Item) {
|
||||
|
||||
fn item_constant(w: &mut Buffer, cx: &Context<'_>, it: &clean::Item, c: &clean::Constant) {
|
||||
w.write_str("<pre class=\"rust const\">");
|
||||
render_attributes(w, it, false);
|
||||
render_attributes_in_code(w, it);
|
||||
|
||||
write!(
|
||||
w,
|
||||
@ -1015,7 +1064,7 @@ fn item_constant(w: &mut Buffer, cx: &Context<'_>, it: &clean::Item, c: &clean::
|
||||
fn item_struct(w: &mut Buffer, cx: &Context<'_>, it: &clean::Item, s: &clean::Struct) {
|
||||
wrap_into_docblock(w, |w| {
|
||||
w.write_str("<pre class=\"rust struct\">");
|
||||
render_attributes(w, it, true);
|
||||
render_attributes_in_code(w, it);
|
||||
render_struct(w, it, Some(&s.generics), s.struct_type, &s.fields, "", true, cx);
|
||||
w.write_str("</pre>")
|
||||
});
|
||||
@ -1064,7 +1113,7 @@ fn item_struct(w: &mut Buffer, cx: &Context<'_>, it: &clean::Item, s: &clean::St
|
||||
|
||||
fn item_static(w: &mut Buffer, cx: &Context<'_>, it: &clean::Item, s: &clean::Static) {
|
||||
w.write_str("<pre class=\"rust static\">");
|
||||
render_attributes(w, it, false);
|
||||
render_attributes_in_code(w, it);
|
||||
write!(
|
||||
w,
|
||||
"{vis}static {mutability}{name}: {typ}</pre>",
|
||||
@ -1078,7 +1127,7 @@ fn item_static(w: &mut Buffer, cx: &Context<'_>, it: &clean::Item, s: &clean::St
|
||||
|
||||
fn item_foreign_type(w: &mut Buffer, cx: &Context<'_>, it: &clean::Item) {
|
||||
w.write_str("<pre class=\"rust foreigntype\">extern {\n");
|
||||
render_attributes(w, it, false);
|
||||
render_attributes_in_code(w, it);
|
||||
write!(
|
||||
w,
|
||||
" {}type {};\n}}</pre>",
|
||||
@ -1171,7 +1220,7 @@ fn wrap_into_docblock<F>(w: &mut Buffer, f: F)
|
||||
where
|
||||
F: FnOnce(&mut Buffer),
|
||||
{
|
||||
w.write_str("<div class=\"docblock type-decl hidden-by-usual-hider\">");
|
||||
w.write_str("<div class=\"docblock type-decl\">");
|
||||
f(w);
|
||||
w.write_str("</div>")
|
||||
}
|
||||
@ -1261,6 +1310,13 @@ fn render_union(
|
||||
}
|
||||
|
||||
write!(w, " {{\n{}", tab);
|
||||
let count_fields =
|
||||
fields.iter().filter(|f| matches!(*f.kind, clean::StructFieldItem(..))).count();
|
||||
let toggle = should_hide_fields(count_fields);
|
||||
if toggle {
|
||||
toggle_open(w, "fields");
|
||||
}
|
||||
|
||||
for field in fields {
|
||||
if let clean::StructFieldItem(ref ty) = *field.kind {
|
||||
write!(
|
||||
@ -1277,6 +1333,9 @@ fn render_union(
|
||||
if it.has_stripped_fields().unwrap() {
|
||||
write!(w, " // some fields omitted\n{}", tab);
|
||||
}
|
||||
if toggle {
|
||||
toggle_close(w);
|
||||
}
|
||||
w.write_str("}");
|
||||
}
|
||||
|
||||
@ -1305,8 +1364,14 @@ fn render_struct(
|
||||
if let Some(g) = g {
|
||||
write!(w, "{}", print_where_clause(g, cx.cache(), cx.tcx(), 0, true),)
|
||||
}
|
||||
let mut has_visible_fields = false;
|
||||
w.write_str(" {");
|
||||
let count_fields =
|
||||
fields.iter().filter(|f| matches!(*f.kind, clean::StructFieldItem(..))).count();
|
||||
let has_visible_fields = count_fields > 0;
|
||||
let toggle = should_hide_fields(count_fields);
|
||||
if toggle {
|
||||
toggle_open(w, "fields");
|
||||
}
|
||||
for field in fields {
|
||||
if let clean::StructFieldItem(ref ty) = *field.kind {
|
||||
write!(
|
||||
@ -1317,7 +1382,6 @@ fn render_struct(
|
||||
field.name.as_ref().unwrap(),
|
||||
ty.print(cx.cache(), cx.tcx()),
|
||||
);
|
||||
has_visible_fields = true;
|
||||
}
|
||||
}
|
||||
|
||||
@ -1331,6 +1395,9 @@ fn render_struct(
|
||||
// `{ /* fields omitted */ }` to save space.
|
||||
write!(w, " /* fields omitted */ ");
|
||||
}
|
||||
if toggle {
|
||||
toggle_close(w);
|
||||
}
|
||||
w.write_str("}");
|
||||
}
|
||||
CtorKind::Fn => {
|
||||
|
@ -2316,6 +2316,9 @@ function hideThemeButtonState() {
|
||||
if (hasClass(innerToggle, "will-expand")) {
|
||||
updateLocalStorage("rustdoc-collapse", "false");
|
||||
removeClass(innerToggle, "will-expand");
|
||||
onEachLazy(document.getElementsByTagName("details"), function(e) {
|
||||
e.open = true;
|
||||
});
|
||||
onEveryMatchingChild(innerToggle, "inner", function(e) {
|
||||
e.innerHTML = labelForToggleButton(false);
|
||||
});
|
||||
@ -2328,6 +2331,9 @@ function hideThemeButtonState() {
|
||||
} else {
|
||||
updateLocalStorage("rustdoc-collapse", "true");
|
||||
addClass(innerToggle, "will-expand");
|
||||
onEachLazy(document.getElementsByTagName("details"), function(e) {
|
||||
e.open = false;
|
||||
});
|
||||
onEveryMatchingChild(innerToggle, "inner", function(e) {
|
||||
var parent = e.parentNode;
|
||||
var superParent = null;
|
||||
@ -2569,6 +2575,7 @@ function hideThemeButtonState() {
|
||||
var toggle = createSimpleToggle(false);
|
||||
var hideMethodDocs = getSettingValue("auto-hide-method-docs") === "true";
|
||||
var hideImplementors = getSettingValue("auto-collapse-implementors") !== "false";
|
||||
var hideLargeItemContents = getSettingValue("auto-hide-large-items") !== "false";
|
||||
|
||||
var func = function(e) {
|
||||
var next = e.nextElementSibling;
|
||||
@ -2615,6 +2622,14 @@ function hideThemeButtonState() {
|
||||
onEachLazy(document.getElementsByClassName("associatedconstant"), func);
|
||||
onEachLazy(document.getElementsByClassName("impl"), funcImpl);
|
||||
var impl_call = function() {};
|
||||
// Large items are hidden by default in the HTML. If the setting overrides that, show 'em.
|
||||
if (!hideLargeItemContents) {
|
||||
onEachLazy(document.getElementsByTagName("details"), function (e) {
|
||||
if (hasClass(e, "type-contents-toggle")) {
|
||||
e.open = true;
|
||||
}
|
||||
});
|
||||
}
|
||||
if (hideMethodDocs === true) {
|
||||
impl_call = function(e, newToggle) {
|
||||
if (e.id.match(/^impl(?:-\d+)?$/) === null) {
|
||||
@ -2683,18 +2698,7 @@ function hideThemeButtonState() {
|
||||
});
|
||||
}
|
||||
}
|
||||
var showItemDeclarations = getSettingValue("auto-hide-" + className);
|
||||
if (showItemDeclarations === null) {
|
||||
if (className === "enum" || className === "macro") {
|
||||
showItemDeclarations = "false";
|
||||
} else if (className === "struct" || className === "union" || className === "trait") {
|
||||
showItemDeclarations = "true";
|
||||
} else {
|
||||
// In case we found an unknown type, we just use the "parent" value.
|
||||
showItemDeclarations = getSettingValue("auto-hide-declarations");
|
||||
}
|
||||
}
|
||||
showItemDeclarations = showItemDeclarations === "false";
|
||||
|
||||
function buildToggleWrapper(e) {
|
||||
if (hasClass(e, "autohide")) {
|
||||
var wrap = e.previousElementSibling;
|
||||
@ -2721,11 +2725,8 @@ function hideThemeButtonState() {
|
||||
var extraClass;
|
||||
|
||||
if (hasClass(e, "type-decl")) {
|
||||
fontSize = "20px";
|
||||
otherMessage = " Show declaration";
|
||||
if (showItemDeclarations === false) {
|
||||
extraClass = "collapsed";
|
||||
}
|
||||
// We do something special for these
|
||||
return;
|
||||
} else if (hasClass(e, "sub-variant")) {
|
||||
otherMessage = " Show fields";
|
||||
} else if (hasClass(e, "non-exhaustive")) {
|
||||
@ -2750,11 +2751,8 @@ function hideThemeButtonState() {
|
||||
otherMessage,
|
||||
fontSize,
|
||||
extraClass,
|
||||
hasClass(e, "type-decl") === false || showItemDeclarations === true),
|
||||
true),
|
||||
e);
|
||||
if (hasClass(e, "type-decl") === true && showItemDeclarations === true) {
|
||||
collapseDocs(e.previousSibling.childNodes[0], "toggle");
|
||||
}
|
||||
if (hasClass(e, "non-exhaustive") === true) {
|
||||
collapseDocs(e.previousSibling.childNodes[0], "toggle");
|
||||
}
|
||||
@ -2772,38 +2770,6 @@ function hideThemeButtonState() {
|
||||
}
|
||||
}());
|
||||
|
||||
function createToggleWrapper(tog) {
|
||||
var span = document.createElement("span");
|
||||
span.className = "toggle-label";
|
||||
span.style.display = "none";
|
||||
span.innerHTML = " Expand attributes";
|
||||
tog.appendChild(span);
|
||||
|
||||
var wrapper = document.createElement("div");
|
||||
wrapper.className = "toggle-wrapper toggle-attributes";
|
||||
wrapper.appendChild(tog);
|
||||
return wrapper;
|
||||
}
|
||||
|
||||
(function() {
|
||||
// To avoid checking on "rustdoc-item-attributes" value on every loop...
|
||||
var itemAttributesFunc = function() {};
|
||||
if (getSettingValue("auto-hide-attributes") !== "false") {
|
||||
itemAttributesFunc = function(x) {
|
||||
collapseDocs(x.previousSibling.childNodes[0], "toggle");
|
||||
};
|
||||
}
|
||||
var attributesToggle = createToggleWrapper(createSimpleToggle(false));
|
||||
onEachLazy(main.getElementsByClassName("attributes"), function(i_e) {
|
||||
var attr_tog = attributesToggle.cloneNode(true);
|
||||
if (hasClass(i_e, "top-attr") === true) {
|
||||
addClass(attr_tog, "top-attr");
|
||||
}
|
||||
i_e.parentNode.insertBefore(attr_tog, i_e);
|
||||
itemAttributesFunc(i_e);
|
||||
});
|
||||
}());
|
||||
|
||||
(function() {
|
||||
// To avoid checking on "rustdoc-line-numbers" value on every loop...
|
||||
var lineNumbersFunc = function() {};
|
||||
|
@ -1056,12 +1056,6 @@ h3 > .collapse-toggle, h4 > .collapse-toggle {
|
||||
margin-top: 3px;
|
||||
}
|
||||
|
||||
.enum > .toggle-wrapper + .docblock, .struct > .toggle-wrapper + .docblock {
|
||||
margin-left: 30px;
|
||||
margin-bottom: 20px;
|
||||
margin-top: 5px;
|
||||
}
|
||||
|
||||
.docblock > .section-header:first-child {
|
||||
margin-left: 15px;
|
||||
margin-top: 0;
|
||||
@ -1071,30 +1065,10 @@ h3 > .collapse-toggle, h4 > .collapse-toggle {
|
||||
left: -10px;
|
||||
}
|
||||
|
||||
.enum > .collapsed, .struct > .collapsed {
|
||||
margin-bottom: 25px;
|
||||
}
|
||||
|
||||
#main > .variant, #main > .structfield {
|
||||
display: block;
|
||||
}
|
||||
|
||||
.attributes {
|
||||
display: block;
|
||||
margin-top: 0px !important;
|
||||
margin-right: 0px;
|
||||
margin-bottom: 0px !important;
|
||||
margin-left: 30px;
|
||||
}
|
||||
.toggle-attributes.collapsed {
|
||||
margin-bottom: 0;
|
||||
}
|
||||
.impl-items > .toggle-attributes {
|
||||
margin-left: 20px;
|
||||
}
|
||||
.impl-items .attributes {
|
||||
font-weight: 500;
|
||||
}
|
||||
|
||||
:target > code {
|
||||
opacity: 1;
|
||||
@ -1781,16 +1755,54 @@ div.name.expand::before {
|
||||
top: 2px;
|
||||
}
|
||||
|
||||
/* This part is to fix the "Expand attributes" part in the type declaration. */
|
||||
.type-decl > pre > .toggle-wrapper.toggle-attributes.top-attr {
|
||||
margin-left: 0 !important;
|
||||
/* The hideme class is used on summary tags that contain a span with
|
||||
placeholder text shown only when the toggle is closed. For instance,
|
||||
"Expand description" or "Show methods". */
|
||||
details.rustdoc-toggle > summary.hideme {
|
||||
cursor: pointer;
|
||||
}
|
||||
.type-decl > pre > .docblock.attributes.top-attr {
|
||||
margin-left: 1.8em !important;
|
||||
|
||||
details.rustdoc-toggle > summary::-webkit-details-marker {
|
||||
display: none;
|
||||
}
|
||||
.type-decl > pre > .toggle-attributes {
|
||||
margin-left: 2.2em;
|
||||
|
||||
details.rustdoc-toggle > summary.hideme > span {
|
||||
margin-left: 9px;
|
||||
}
|
||||
.type-decl > pre > .docblock.attributes {
|
||||
margin-left: 4em;
|
||||
|
||||
details.rustdoc-toggle > summary::before {
|
||||
content: "[+]";
|
||||
font-weight: 300;
|
||||
font-size: 0.8em;
|
||||
letter-spacing: 1px;
|
||||
}
|
||||
|
||||
details.rustdoc-toggle > summary.hideme::before {
|
||||
position: relative;
|
||||
}
|
||||
|
||||
details.rustdoc-toggle > summary:not(.hideme)::before {
|
||||
float: left;
|
||||
}
|
||||
|
||||
/* When a "hideme" summary is open and the "Expand description" or "Show
|
||||
methods" text is hidden, we want the [-] toggle that remains to not
|
||||
affect the layout of the items to its right. To do that, we use
|
||||
absolute positioning. Note that we also set position: relative
|
||||
on the parent <details> to make this work properly. */
|
||||
details.rustdoc-toggle[open] > summary.hideme {
|
||||
position: absolute;
|
||||
}
|
||||
|
||||
details.rustdoc-toggle[open] {
|
||||
position: relative;
|
||||
}
|
||||
|
||||
details.rustdoc-toggle[open] > summary.hideme > span {
|
||||
display: none;
|
||||
}
|
||||
|
||||
details.rustdoc-toggle[open] > summary::before {
|
||||
content: "[−]";
|
||||
display: inline;
|
||||
}
|
||||
|
@ -1,6 +1,5 @@
|
||||
// From rust:
|
||||
/* global resourcesSuffix */
|
||||
|
||||
var darkThemes = ["dark", "ayu"];
|
||||
window.currentTheme = document.getElementById("themeStyle");
|
||||
window.mainTheme = document.getElementById("mainThemeStyle");
|
||||
|
@ -224,7 +224,9 @@ a {
|
||||
color: #39AFD7;
|
||||
}
|
||||
|
||||
.collapse-toggle {
|
||||
.collapse-toggle,
|
||||
details.rustdoc-toggle > summary.hideme > span,
|
||||
details.rustdoc-toggle > summary::before {
|
||||
color: #999;
|
||||
}
|
||||
|
||||
|
@ -186,7 +186,9 @@ a.test-arrow {
|
||||
color: #dedede;
|
||||
}
|
||||
|
||||
.collapse-toggle {
|
||||
.collapse-toggle,
|
||||
details.rustdoc-toggle > summary.hideme > span,
|
||||
details.rustdoc-toggle > summary::before {
|
||||
color: #999;
|
||||
}
|
||||
|
||||
|
@ -184,7 +184,9 @@ a.test-arrow {
|
||||
color: #f5f5f5;
|
||||
}
|
||||
|
||||
.collapse-toggle {
|
||||
.collapse-toggle,
|
||||
details.rustdoc-toggle > summary.hideme > span,
|
||||
details.rustdoc-toggle > summary::before {
|
||||
color: #999;
|
||||
}
|
||||
|
||||
|
@ -1,21 +1,21 @@
|
||||
#![crate_name = "foo"]
|
||||
|
||||
// @has foo/fn.f.html '//*[@class="docblock attributes"]' '#[no_mangle]'
|
||||
// @has foo/fn.f.html '//*[@class="rust fn"]' '#[no_mangle]'
|
||||
#[no_mangle]
|
||||
pub extern "C" fn f() {}
|
||||
|
||||
// @has foo/fn.g.html '//*[@class="docblock attributes"]' '#[export_name = "bar"]'
|
||||
// @has foo/fn.g.html '//*[@class="rust fn"]' '#[export_name = "bar"]'
|
||||
#[export_name = "bar"]
|
||||
pub extern "C" fn g() {}
|
||||
|
||||
// @matches foo/enum.Foo.html '//*[@class="docblock attributes top-attr"]' \
|
||||
// '(?m)\A#\[repr\(i64\)\]\n#\[must_use\]\Z'
|
||||
// @matches foo/enum.Foo.html '//*[@class="rust enum"]' \
|
||||
// '#\[repr\(i64\)\]\n#\[must_use\]'
|
||||
#[repr(i64)]
|
||||
#[must_use]
|
||||
pub enum Foo {
|
||||
Bar,
|
||||
}
|
||||
|
||||
// @has foo/struct.Repr.html '//*[@class="docblock attributes top-attr"]' '#[repr(C, align(8))]'
|
||||
// @has foo/struct.Repr.html '//*[@class="docblock type-decl"]' '#[repr(C, align(8))]'
|
||||
#[repr(C, align(8))]
|
||||
pub struct Repr;
|
||||
|
155
src/test/rustdoc/item-hide-threshold.rs
Normal file
155
src/test/rustdoc/item-hide-threshold.rs
Normal file
@ -0,0 +1,155 @@
|
||||
#![allow(unused)]
|
||||
|
||||
// @has 'item_hide_threshold/struct.PubStruct.html'
|
||||
// @count - '//details[@class="rustdoc-toggle type-contents-toggle"]' 0
|
||||
pub struct PubStruct {
|
||||
pub a: usize,
|
||||
pub b: usize,
|
||||
}
|
||||
|
||||
// @has 'item_hide_threshold/struct.BigPubStruct.html'
|
||||
// @count - '//details[@class="rustdoc-toggle type-contents-toggle"]' 1
|
||||
// @has - '//details[@class="rustdoc-toggle type-contents-toggle"]' 'Show fields'
|
||||
pub struct BigPubStruct {
|
||||
pub a: usize,
|
||||
pub b: usize,
|
||||
pub c: usize,
|
||||
pub d: usize,
|
||||
pub e: usize,
|
||||
pub f: usize,
|
||||
pub g: usize,
|
||||
pub h: usize,
|
||||
pub i: usize,
|
||||
pub j: usize,
|
||||
pub k: usize,
|
||||
pub l: usize,
|
||||
pub m: usize,
|
||||
}
|
||||
|
||||
// @has 'item_hide_threshold/union.BigUnion.html'
|
||||
// @count - '//details[@class="rustdoc-toggle type-contents-toggle"]' 1
|
||||
// @has - '//details[@class="rustdoc-toggle type-contents-toggle"]' 'Show fields'
|
||||
pub union BigUnion {
|
||||
pub a: usize,
|
||||
pub b: usize,
|
||||
pub c: usize,
|
||||
pub d: usize,
|
||||
pub e: usize,
|
||||
pub f: usize,
|
||||
pub g: usize,
|
||||
pub h: usize,
|
||||
pub i: usize,
|
||||
pub j: usize,
|
||||
pub k: usize,
|
||||
pub l: usize,
|
||||
pub m: usize,
|
||||
}
|
||||
|
||||
// @has 'item_hide_threshold/union.Union.html'
|
||||
// @count - '//details[@class="rustdoc-toggle type-contents-toggle"]' 0
|
||||
pub union Union {
|
||||
pub a: usize,
|
||||
pub b: usize,
|
||||
pub c: usize,
|
||||
}
|
||||
|
||||
// @has 'item_hide_threshold/struct.PrivStruct.html'
|
||||
// @count - '//details[@class="rustdoc-toggle type-contents-toggle"]' 0
|
||||
// @has - '//div[@class="docblock type-decl"]' 'fields omitted'
|
||||
pub struct PrivStruct {
|
||||
a: usize,
|
||||
b: usize,
|
||||
}
|
||||
|
||||
// @has 'item_hide_threshold/enum.Enum.html'
|
||||
// @count - '//details[@class="rustdoc-toggle type-contents-toggle"]' 0
|
||||
pub enum Enum {
|
||||
A, B, C,
|
||||
D {
|
||||
a: u8,
|
||||
b: u8
|
||||
}
|
||||
}
|
||||
|
||||
// @has 'item_hide_threshold/enum.LargeEnum.html'
|
||||
// @count - '//details[@class="rustdoc-toggle type-contents-toggle"]' 1
|
||||
// @has - '//details[@class="rustdoc-toggle type-contents-toggle"]' 'Show variants'
|
||||
pub enum LargeEnum {
|
||||
A, B, C, D, E, F(u8), G, H, I, J, K, L, M
|
||||
}
|
||||
|
||||
// @has 'item_hide_threshold/trait.Trait.html'
|
||||
// @count - '//details[@class="rustdoc-toggle type-contents-toggle"]' 0
|
||||
pub trait Trait {
|
||||
type A;
|
||||
#[must_use]
|
||||
fn foo();
|
||||
fn bar();
|
||||
}
|
||||
|
||||
// @has 'item_hide_threshold/trait.GinormousTrait.html'
|
||||
// @count - '//details[@class="rustdoc-toggle type-contents-toggle"]' 1
|
||||
// @has - '//details[@class="rustdoc-toggle type-contents-toggle"]' 'Show associated items'
|
||||
pub trait GinormousTrait {
|
||||
type A;
|
||||
type B;
|
||||
type C;
|
||||
type D;
|
||||
type E;
|
||||
type F;
|
||||
type G;
|
||||
type H;
|
||||
type I;
|
||||
type J;
|
||||
type K;
|
||||
type L;
|
||||
type M;
|
||||
const N: usize = 1;
|
||||
#[must_use]
|
||||
fn foo();
|
||||
fn bar();
|
||||
}
|
||||
|
||||
// @has 'item_hide_threshold/trait.HugeTrait.html'
|
||||
// @count - '//details[@class="rustdoc-toggle type-contents-toggle"]' 1
|
||||
// @has - '//details[@class="rustdoc-toggle type-contents-toggle"]' 'Show associated constants and methods'
|
||||
pub trait HugeTrait {
|
||||
type A;
|
||||
const M: usize = 1;
|
||||
const N: usize = 1;
|
||||
const O: usize = 1;
|
||||
const P: usize = 1;
|
||||
const Q: usize = 1;
|
||||
const R: usize = 1;
|
||||
const S: usize = 1;
|
||||
const T: usize = 1;
|
||||
const U: usize = 1;
|
||||
const V: usize = 1;
|
||||
const W: usize = 1;
|
||||
const X: usize = 1;
|
||||
#[must_use]
|
||||
fn foo();
|
||||
fn bar();
|
||||
}
|
||||
|
||||
// @has 'item_hide_threshold/trait.BigTrait.html'
|
||||
// @count - '//details[@class="rustdoc-toggle type-contents-toggle"]' 1
|
||||
// @has - '//details[@class="rustdoc-toggle type-contents-toggle"]' 'Show methods'
|
||||
pub trait BigTrait {
|
||||
type A;
|
||||
#[must_use]
|
||||
fn foo();
|
||||
fn bar();
|
||||
fn baz();
|
||||
fn quux();
|
||||
fn frob();
|
||||
fn greeble();
|
||||
fn blap();
|
||||
fn whoop();
|
||||
fn pow();
|
||||
fn bang();
|
||||
fn oomph();
|
||||
fn argh();
|
||||
fn wap();
|
||||
fn ouch();
|
||||
}
|
@ -2,7 +2,7 @@
|
||||
|
||||
|
||||
pub trait Foo {
|
||||
// @has foo/trait.Foo.html '//h3[@id="tymethod.foo"]//span[@class="docblock attributes"]' '#[must_use]'
|
||||
// @has foo/trait.Foo.html '//h3[@id="tymethod.foo"]//div[@class="code-attribute"]' '#[must_use]'
|
||||
#[must_use]
|
||||
fn foo();
|
||||
}
|
||||
@ -11,11 +11,11 @@ pub trait Foo {
|
||||
pub struct Bar;
|
||||
|
||||
impl Bar {
|
||||
// @has foo/struct.Bar.html '//h4[@id="method.bar"]//span[@class="docblock attributes"]' '#[must_use]'
|
||||
// @has foo/struct.Bar.html '//h4[@id="method.bar"]//div[@class="code-attribute"]' '#[must_use]'
|
||||
#[must_use]
|
||||
pub fn bar() {}
|
||||
|
||||
// @has foo/struct.Bar.html '//h4[@id="method.bar2"]//span[@class="docblock attributes"]' '#[must_use]'
|
||||
// @has foo/struct.Bar.html '//h4[@id="method.bar2"]//div[@class="code-attribute"]' '#[must_use]'
|
||||
#[must_use]
|
||||
pub fn bar2() {}
|
||||
}
|
||||
|
@ -1,6 +1,6 @@
|
||||
fn test() {
|
||||
let v: isize;
|
||||
//~^ HELP make this binding mutable
|
||||
//~^ HELP consider making this binding mutable
|
||||
//~| SUGGESTION mut v
|
||||
v = 1; //~ NOTE first assignment
|
||||
println!("v={}", v);
|
||||
|
@ -2,7 +2,7 @@ error[E0384]: cannot assign twice to immutable variable `v`
|
||||
--> $DIR/assign-imm-local-twice.rs:7:5
|
||||
|
|
||||
LL | let v: isize;
|
||||
| - help: make this binding mutable: `mut v`
|
||||
| - help: consider making this binding mutable: `mut v`
|
||||
...
|
||||
LL | v = 1;
|
||||
| ----- first assignment to `v`
|
||||
|
@ -13,7 +13,7 @@ LL | pub async fn g(x: usize) {
|
||||
| -
|
||||
| |
|
||||
| first assignment to `x`
|
||||
| help: make this binding mutable: `mut x`
|
||||
| help: consider making this binding mutable: `mut x`
|
||||
LL | x += 1;
|
||||
| ^^^^^^ cannot assign twice to immutable variable
|
||||
|
||||
|
@ -29,7 +29,7 @@ LL | let x = 3;
|
||||
| -
|
||||
| |
|
||||
| first assignment to `x`
|
||||
| help: make this binding mutable: `mut x`
|
||||
| help: consider making this binding mutable: `mut x`
|
||||
LL | unsafe {
|
||||
LL | llvm_asm!("nop" : "=r"(x));
|
||||
| ^ cannot assign twice to immutable variable
|
||||
@ -41,7 +41,7 @@ LL | let x = 3;
|
||||
| -
|
||||
| |
|
||||
| first assignment to `x`
|
||||
| help: make this binding mutable: `mut x`
|
||||
| help: consider making this binding mutable: `mut x`
|
||||
LL | unsafe {
|
||||
LL | llvm_asm!("nop" : "+r"(x));
|
||||
| ^ cannot assign twice to immutable variable
|
||||
|
@ -5,7 +5,7 @@ LL | x => {
|
||||
| -
|
||||
| |
|
||||
| first assignment to `x`
|
||||
| help: make this binding mutable: `mut x`
|
||||
| help: consider making this binding mutable: `mut x`
|
||||
LL | x += 1;
|
||||
| ^^^^^^ cannot assign twice to immutable variable
|
||||
|
||||
@ -16,7 +16,7 @@ LL | E::Foo(x) => {
|
||||
| -
|
||||
| |
|
||||
| first assignment to `x`
|
||||
| help: make this binding mutable: `mut x`
|
||||
| help: consider making this binding mutable: `mut x`
|
||||
LL | x += 1;
|
||||
| ^^^^^^ cannot assign twice to immutable variable
|
||||
|
||||
@ -27,7 +27,7 @@ LL | S { bar: x } => {
|
||||
| -
|
||||
| |
|
||||
| first assignment to `x`
|
||||
| help: make this binding mutable: `mut x`
|
||||
| help: consider making this binding mutable: `mut x`
|
||||
LL | x += 1;
|
||||
| ^^^^^^ cannot assign twice to immutable variable
|
||||
|
||||
@ -38,7 +38,7 @@ LL | (x,) => {
|
||||
| -
|
||||
| |
|
||||
| first assignment to `x`
|
||||
| help: make this binding mutable: `mut x`
|
||||
| help: consider making this binding mutable: `mut x`
|
||||
LL | x += 1;
|
||||
| ^^^^^^ cannot assign twice to immutable variable
|
||||
|
||||
@ -49,7 +49,7 @@ LL | [x,_,_] => {
|
||||
| -
|
||||
| |
|
||||
| first assignment to `x`
|
||||
| help: make this binding mutable: `mut x`
|
||||
| help: consider making this binding mutable: `mut x`
|
||||
LL | x += 1;
|
||||
| ^^^^^^ cannot assign twice to immutable variable
|
||||
|
||||
|
@ -2,7 +2,7 @@ error[E0384]: cannot assign to immutable argument `_x`
|
||||
--> $DIR/immutable-arg.rs:2:5
|
||||
|
|
||||
LL | fn foo(_x: u32) {
|
||||
| -- help: make this binding mutable: `mut _x`
|
||||
| -- help: consider making this binding mutable: `mut _x`
|
||||
LL | _x = 4;
|
||||
| ^^^^^^ cannot assign to immutable argument
|
||||
|
||||
|
@ -1,6 +1,6 @@
|
||||
fn test_drop_replace() {
|
||||
let b: Box<isize>;
|
||||
//~^ HELP make this binding mutable
|
||||
//~^ HELP consider making this binding mutable
|
||||
//~| SUGGESTION mut b
|
||||
b = Box::new(1); //~ NOTE first assignment
|
||||
b = Box::new(2); //~ ERROR cannot assign twice to immutable variable `b`
|
||||
@ -9,13 +9,13 @@ fn test_drop_replace() {
|
||||
|
||||
fn test_call() {
|
||||
let b = Box::new(1); //~ NOTE first assignment
|
||||
//~| HELP make this binding mutable
|
||||
//~| HELP consider making this binding mutable
|
||||
//~| SUGGESTION mut b
|
||||
b = Box::new(2); //~ ERROR cannot assign twice to immutable variable `b`
|
||||
//~| NOTE cannot assign twice to immutable
|
||||
}
|
||||
|
||||
fn test_args(b: Box<i32>) { //~ HELP make this binding mutable
|
||||
fn test_args(b: Box<i32>) { //~ HELP consider making this binding mutable
|
||||
//~| SUGGESTION mut b
|
||||
b = Box::new(2); //~ ERROR cannot assign to immutable argument `b`
|
||||
//~| NOTE cannot assign to immutable argument
|
||||
|
@ -2,7 +2,7 @@ error[E0384]: cannot assign twice to immutable variable `b`
|
||||
--> $DIR/issue-45199.rs:6:5
|
||||
|
|
||||
LL | let b: Box<isize>;
|
||||
| - help: make this binding mutable: `mut b`
|
||||
| - help: consider making this binding mutable: `mut b`
|
||||
...
|
||||
LL | b = Box::new(1);
|
||||
| - first assignment to `b`
|
||||
@ -16,7 +16,7 @@ LL | let b = Box::new(1);
|
||||
| -
|
||||
| |
|
||||
| first assignment to `b`
|
||||
| help: make this binding mutable: `mut b`
|
||||
| help: consider making this binding mutable: `mut b`
|
||||
...
|
||||
LL | b = Box::new(2);
|
||||
| ^ cannot assign twice to immutable variable
|
||||
@ -25,7 +25,7 @@ error[E0384]: cannot assign to immutable argument `b`
|
||||
--> $DIR/issue-45199.rs:20:5
|
||||
|
|
||||
LL | fn test_args(b: Box<i32>) {
|
||||
| - help: make this binding mutable: `mut b`
|
||||
| - help: consider making this binding mutable: `mut b`
|
||||
LL |
|
||||
LL | b = Box::new(2);
|
||||
| ^ cannot assign to immutable argument
|
||||
|
@ -5,7 +5,7 @@ LL | let x = 42;
|
||||
| -
|
||||
| |
|
||||
| first assignment to `x`
|
||||
| help: make this binding mutable: `mut x`
|
||||
| help: consider making this binding mutable: `mut x`
|
||||
LL | x = 43;
|
||||
| ^^^^^^ cannot assign twice to immutable variable
|
||||
|
||||
|
@ -0,0 +1,8 @@
|
||||
// check-fail
|
||||
|
||||
struct Foo {}
|
||||
impl Foo {
|
||||
fn bar(foo: Foo<Target = usize>) {}
|
||||
//~^ associated type bindings are not allowed here
|
||||
}
|
||||
fn main() {}
|
@ -0,0 +1,9 @@
|
||||
error[E0229]: associated type bindings are not allowed here
|
||||
--> $DIR/issue-83753-invalid-associated-type-supertrait-hrtb.rs:5:21
|
||||
|
|
||||
LL | fn bar(foo: Foo<Target = usize>) {}
|
||||
| ^^^^^^^^^^^^^^ associated type not allowed here
|
||||
|
||||
error: aborting due to previous error
|
||||
|
||||
For more information about this error, try `rustc --explain E0229`.
|
@ -0,0 +1,7 @@
|
||||
// check-fail
|
||||
|
||||
static STATIC_VAR_FIVE: &One();
|
||||
//~^ cannot find type
|
||||
//~| free static item without body
|
||||
|
||||
fn main() {}
|
@ -0,0 +1,17 @@
|
||||
error: free static item without body
|
||||
--> $DIR/issue-83907-invalid-fn-like-path.rs:3:1
|
||||
|
|
||||
LL | static STATIC_VAR_FIVE: &One();
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^-
|
||||
| |
|
||||
| help: provide a definition for the static: `= <expr>;`
|
||||
|
||||
error[E0412]: cannot find type `One` in this scope
|
||||
--> $DIR/issue-83907-invalid-fn-like-path.rs:3:26
|
||||
|
|
||||
LL | static STATIC_VAR_FIVE: &One();
|
||||
| ^^^ not found in this scope
|
||||
|
||||
error: aborting due to 2 previous errors
|
||||
|
||||
For more information about this error, try `rustc --explain E0412`.
|
@ -12,7 +12,7 @@ error[E0384]: cannot assign to immutable argument `y`
|
||||
--> $DIR/ex3-both-anon-regions-one-is-struct-2.rs:4:5
|
||||
|
|
||||
LL | fn foo(mut x: Ref, y: &u32) {
|
||||
| - help: make this binding mutable: `mut y`
|
||||
| - help: consider making this binding mutable: `mut y`
|
||||
LL | y = x.b;
|
||||
| ^^^^^^^ cannot assign to immutable argument
|
||||
|
||||
|
@ -2,7 +2,7 @@ error[E0384]: cannot assign twice to immutable variable `x`
|
||||
--> $DIR/liveness-assign-imm-local-notes.rs:10:9
|
||||
|
|
||||
LL | let x;
|
||||
| - help: make this binding mutable: `mut x`
|
||||
| - help: consider making this binding mutable: `mut x`
|
||||
...
|
||||
LL | x = 2;
|
||||
| ----- first assignment to `x`
|
||||
@ -13,7 +13,7 @@ error[E0384]: cannot assign twice to immutable variable `x`
|
||||
--> $DIR/liveness-assign-imm-local-notes.rs:21:13
|
||||
|
|
||||
LL | let x;
|
||||
| - help: make this binding mutable: `mut x`
|
||||
| - help: consider making this binding mutable: `mut x`
|
||||
...
|
||||
LL | x = 2;
|
||||
| ----- first assignment to `x`
|
||||
@ -24,7 +24,7 @@ error[E0384]: cannot assign twice to immutable variable `x`
|
||||
--> $DIR/liveness-assign-imm-local-notes.rs:30:13
|
||||
|
|
||||
LL | let x;
|
||||
| - help: make this binding mutable: `mut x`
|
||||
| - help: consider making this binding mutable: `mut x`
|
||||
...
|
||||
LL | x = 1;
|
||||
| ^^^^^ cannot assign twice to immutable variable
|
||||
@ -33,7 +33,7 @@ error[E0384]: cannot assign twice to immutable variable `x`
|
||||
--> $DIR/liveness-assign-imm-local-notes.rs:32:13
|
||||
|
|
||||
LL | let x;
|
||||
| - help: make this binding mutable: `mut x`
|
||||
| - help: consider making this binding mutable: `mut x`
|
||||
...
|
||||
LL | x = 1;
|
||||
| ----- first assignment to `x`
|
||||
|
@ -1,6 +1,6 @@
|
||||
fn test() {
|
||||
let v: isize;
|
||||
//~^ HELP make this binding mutable
|
||||
//~^ HELP consider making this binding mutable
|
||||
//~| SUGGESTION mut v
|
||||
loop {
|
||||
v = 1; //~ ERROR cannot assign twice to immutable variable `v`
|
||||
|
@ -2,7 +2,7 @@ error[E0384]: cannot assign twice to immutable variable `v`
|
||||
--> $DIR/liveness-assign-imm-local-in-loop.rs:6:9
|
||||
|
|
||||
LL | let v: isize;
|
||||
| - help: make this binding mutable: `mut v`
|
||||
| - help: consider making this binding mutable: `mut v`
|
||||
...
|
||||
LL | v = 1;
|
||||
| ^^^^^ cannot assign twice to immutable variable
|
||||
|
@ -1,6 +1,6 @@
|
||||
fn test() {
|
||||
let v: isize;
|
||||
//~^ HELP make this binding mutable
|
||||
//~^ HELP consider making this binding mutable
|
||||
//~| SUGGESTION mut v
|
||||
v = 2; //~ NOTE first assignment
|
||||
v += 1; //~ ERROR cannot assign twice to immutable variable `v`
|
||||
|
@ -2,7 +2,7 @@ error[E0384]: cannot assign twice to immutable variable `v`
|
||||
--> $DIR/liveness-assign-imm-local-in-op-eq.rs:6:5
|
||||
|
|
||||
LL | let v: isize;
|
||||
| - help: make this binding mutable: `mut v`
|
||||
| - help: consider making this binding mutable: `mut v`
|
||||
...
|
||||
LL | v = 2;
|
||||
| ----- first assignment to `v`
|
||||
|
@ -1,6 +1,6 @@
|
||||
fn test() {
|
||||
let b = Box::new(1); //~ NOTE first assignment
|
||||
//~| HELP make this binding mutable
|
||||
//~| HELP consider making this binding mutable
|
||||
//~| SUGGESTION mut b
|
||||
drop(b);
|
||||
b = Box::new(2); //~ ERROR cannot assign twice to immutable variable `b`
|
||||
|
@ -5,7 +5,7 @@ LL | let b = Box::new(1);
|
||||
| -
|
||||
| |
|
||||
| first assignment to `b`
|
||||
| help: make this binding mutable: `mut b`
|
||||
| help: consider making this binding mutable: `mut b`
|
||||
...
|
||||
LL | b = Box::new(2);
|
||||
| ^ cannot assign twice to immutable variable
|
||||
|
@ -1,6 +1,6 @@
|
||||
fn test() {
|
||||
let v: isize = 1; //~ NOTE first assignment
|
||||
//~| HELP make this binding mutable
|
||||
//~| HELP consider making this binding mutable
|
||||
//~| SUGGESTION mut v
|
||||
v.clone();
|
||||
v = 2; //~ ERROR cannot assign twice to immutable variable `v`
|
||||
|
@ -5,7 +5,7 @@ LL | let v: isize = 1;
|
||||
| -
|
||||
| |
|
||||
| first assignment to `v`
|
||||
| help: make this binding mutable: `mut v`
|
||||
| help: consider making this binding mutable: `mut v`
|
||||
...
|
||||
LL | v = 2;
|
||||
| ^^^^^ cannot assign twice to immutable variable
|
||||
|
@ -2,7 +2,7 @@ error[E0384]: cannot assign twice to immutable variable `x`
|
||||
--> $DIR/llvm-asm-out-assign-imm.rs:25:39
|
||||
|
|
||||
LL | let x: isize;
|
||||
| - help: make this binding mutable: `mut x`
|
||||
| - help: consider making this binding mutable: `mut x`
|
||||
LL | x = 1;
|
||||
| ----- first assignment to `x`
|
||||
...
|
||||
|
@ -5,7 +5,7 @@ LL | let &mut x = foo;
|
||||
| -
|
||||
| |
|
||||
| first assignment to `x`
|
||||
| help: make this binding mutable: `mut x`
|
||||
| help: consider making this binding mutable: `mut x`
|
||||
LL | x += 1;
|
||||
| ^^^^^^ cannot assign twice to immutable variable
|
||||
|
||||
|
@ -16,7 +16,7 @@ LL | let [ref _x0_hold, _x1, ref xs_hold @ ..] = arr;
|
||||
| ---
|
||||
| |
|
||||
| first assignment to `_x1`
|
||||
| help: make this binding mutable: `mut _x1`
|
||||
| help: consider making this binding mutable: `mut _x1`
|
||||
LL | _x1 = U;
|
||||
| ^^^^^^^ cannot assign twice to immutable variable
|
||||
|
||||
@ -74,7 +74,7 @@ LL | let (ref _x0, _x1, ref _x2, ..) = tup;
|
||||
| ---
|
||||
| |
|
||||
| first assignment to `_x1`
|
||||
| help: make this binding mutable: `mut _x1`
|
||||
| help: consider making this binding mutable: `mut _x1`
|
||||
LL | _x1 = U;
|
||||
| ^^^^^^^ cannot assign twice to immutable variable
|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user