Skip to content

Commit f733f48

Browse files
committed
Auto merge of #45862 - GuillaumeGomez:rollup, r=GuillaumeGomez
Rollup of 4 pull requests - Successful merges: #45582, #45766, #45830, #45849 - Failed merges:
2 parents 49bee9d + 661c507 commit f733f48

File tree

7 files changed

+276
-37
lines changed

7 files changed

+276
-37
lines changed

src/librustdoc/html/layout.rs

+1-1
Original file line numberDiff line numberDiff line change
@@ -105,7 +105,7 @@ r##"<!DOCTYPE html>
105105
<dd>Switch tab</dd>
106106
<dt>&#9166;</dt>
107107
<dd>Go to active search result</dd>
108-
<dt>+</dt>
108+
<dt style="width:31px;">+ / -</dt>
109109
<dd>Collapse/expand all sections</dd>
110110
</dl>
111111
</div>

src/librustdoc/html/render.rs

+139-31
Original file line numberDiff line numberDiff line change
@@ -2498,7 +2498,7 @@ fn item_trait(w: &mut fmt::Formatter, cx: &Context, it: &clean::Item,
24982498

24992499
if !foreign.is_empty() {
25002500
write!(w, "
2501-
<h2 id='foreign-impls' class='section-header'>
2501+
<h2 id='foreign-impls' class='small-section-header'>
25022502
Implementations on Foreign Types<a href='#foreign-impls' class='anchor'></a>
25032503
</h2>
25042504
")?;
@@ -3591,7 +3591,8 @@ fn sidebar_assoc_items(it: &clean::Item) -> String {
35913591
let mut links = HashSet::new();
35923592
let ret = v.iter()
35933593
.filter_map(|i| if let Some(ref i) = i.inner_impl().trait_ {
3594-
let out = format!("{:#}", i).replace("<", "&lt;").replace(">", "&gt;");
3594+
let i_display = format!("{:#}", i);
3595+
let out = Escape(&i_display);
35953596
let encoded = small_url_encode(&format!("{:#}", i));
35963597
let generated = format!("<a href=\"#impl-{}\">{}</a>", encoded, out);
35973598
if !links.contains(&generated) && links.insert(generated.clone()) {
@@ -3617,11 +3618,12 @@ fn sidebar_assoc_items(it: &clean::Item) -> String {
36173618
fn sidebar_struct(fmt: &mut fmt::Formatter, it: &clean::Item,
36183619
s: &clean::Struct) -> fmt::Result {
36193620
let mut sidebar = String::new();
3621+
let fields = get_struct_fields_name(&s.fields);
36203622

3621-
if s.fields.iter()
3622-
.any(|f| if let clean::StructFieldItem(..) = f.inner { true } else { false }) {
3623+
if !fields.is_empty() {
36233624
if let doctree::Plain = s.struct_type {
3624-
sidebar.push_str("<li><a href=\"#fields\">Fields</a></li>");
3625+
sidebar.push_str(&format!("<a class=\"sidebar-title\" href=\"#fields\">Fields</a>\
3626+
<div class=\"sidebar-links\">{}</div>", fields));
36253627
}
36263628
}
36273629

@@ -3633,40 +3635,122 @@ fn sidebar_struct(fmt: &mut fmt::Formatter, it: &clean::Item,
36333635
Ok(())
36343636
}
36353637

3638+
fn extract_for_impl_name(item: &clean::Item) -> Option<(String, String)> {
3639+
match item.inner {
3640+
clean::ItemEnum::ImplItem(ref i) => {
3641+
if let Some(ref trait_) = i.trait_ {
3642+
Some((format!("{:#}", i.for_), format!("{:#}", trait_)))
3643+
} else {
3644+
None
3645+
}
3646+
},
3647+
_ => None,
3648+
}
3649+
}
3650+
36363651
fn sidebar_trait(fmt: &mut fmt::Formatter, it: &clean::Item,
36373652
t: &clean::Trait) -> fmt::Result {
36383653
let mut sidebar = String::new();
36393654

3640-
let has_types = t.items.iter().any(|m| m.is_associated_type());
3641-
let has_consts = t.items.iter().any(|m| m.is_associated_const());
3642-
let has_required = t.items.iter().any(|m| m.is_ty_method());
3643-
let has_provided = t.items.iter().any(|m| m.is_method());
3655+
let types = t.items
3656+
.iter()
3657+
.filter_map(|m| {
3658+
match m.name {
3659+
Some(ref name) if m.is_associated_type() => {
3660+
Some(format!("<a href=\"#associatedtype.{name}\">{name}</a>",
3661+
name=name))
3662+
}
3663+
_ => None,
3664+
}
3665+
})
3666+
.collect::<String>();
3667+
let consts = t.items
3668+
.iter()
3669+
.filter_map(|m| {
3670+
match m.name {
3671+
Some(ref name) if m.is_associated_const() => {
3672+
Some(format!("<a href=\"#associatedconstant.{name}\">{name}</a>",
3673+
name=name))
3674+
}
3675+
_ => None,
3676+
}
3677+
})
3678+
.collect::<String>();
3679+
let required = t.items
3680+
.iter()
3681+
.filter_map(|m| {
3682+
match m.name {
3683+
Some(ref name) if m.is_ty_method() => {
3684+
Some(format!("<a href=\"#tymethod.{name}\">{name}</a>",
3685+
name=name))
3686+
}
3687+
_ => None,
3688+
}
3689+
})
3690+
.collect::<String>();
3691+
let provided = t.items
3692+
.iter()
3693+
.filter_map(|m| {
3694+
match m.name {
3695+
Some(ref name) if m.is_method() => {
3696+
Some(format!("<a href=\"#method.{name}\">{name}</a>", name=name))
3697+
}
3698+
_ => None,
3699+
}
3700+
})
3701+
.collect::<String>();
36443702

3645-
if has_types {
3646-
sidebar.push_str("<li><a href=\"#associated-types\">Associated Types</a></li>");
3703+
if !types.is_empty() {
3704+
sidebar.push_str(&format!("<a class=\"sidebar-title\" href=\"#associated-types\">\
3705+
Associated Types</a><div class=\"sidebar-links\">{}</div>",
3706+
types));
36473707
}
3648-
if has_consts {
3649-
sidebar.push_str("<li><a href=\"#associated-const\">Associated Constants</a></li>");
3708+
if !consts.is_empty() {
3709+
sidebar.push_str(&format!("<a class=\"sidebar-title\" href=\"#associated-const\">\
3710+
Associated Constants</a><div class=\"sidebar-links\">{}</div>",
3711+
consts));
36503712
}
3651-
if has_required {
3652-
sidebar.push_str("<li><a href=\"#required-methods\">Required Methods</a></li>");
3713+
if !required.is_empty() {
3714+
sidebar.push_str(&format!("<a class=\"sidebar-title\" href=\"#required-methods\">\
3715+
Required Methods</a><div class=\"sidebar-links\">{}</div>",
3716+
required));
36533717
}
3654-
if has_provided {
3655-
sidebar.push_str("<li><a href=\"#provided-methods\">Provided Methods</a></li>");
3718+
if !provided.is_empty() {
3719+
sidebar.push_str(&format!("<a class=\"sidebar-title\" href=\"#provided-methods\">\
3720+
Provided Methods</a><div class=\"sidebar-links\">{}</div>",
3721+
provided));
36563722
}
36573723

36583724
let c = cache();
36593725

36603726
if let Some(implementors) = c.implementors.get(&it.def_id) {
3661-
if implementors.iter().any(|i| i.impl_.for_.def_id()
3662-
.map_or(false, |d| !c.paths.contains_key(&d)))
3663-
{
3664-
sidebar.push_str("<li><a href=\"#foreign-impls\">\
3665-
Implementations on Foreign Types</a></li>");
3666-
}
3667-
}
3668-
3669-
sidebar.push_str("<li><a href=\"#implementors\">Implementors</a></li>");
3727+
let res = implementors.iter()
3728+
.filter(|i| i.impl_.for_.def_id()
3729+
.map_or(false, |d| !c.paths.contains_key(&d)))
3730+
.filter_map(|i| {
3731+
if let Some(item) = implementor2item(&c, i) {
3732+
match extract_for_impl_name(&item) {
3733+
Some((ref name, ref url)) => {
3734+
Some(format!("<a href=\"#impl-{}\">{}</a>",
3735+
small_url_encode(url),
3736+
Escape(name)))
3737+
}
3738+
_ => None,
3739+
}
3740+
} else {
3741+
None
3742+
}
3743+
})
3744+
.collect::<String>();
3745+
if !res.is_empty() {
3746+
sidebar.push_str(&format!("<a class=\"sidebar-title\" href=\"#foreign-impls\">\
3747+
Implementations on Foreign Types</a><div \
3748+
class=\"sidebar-links\">{}</div>",
3749+
res));
3750+
}
3751+
}
3752+
3753+
sidebar.push_str("<a class=\"sidebar-title\" href=\"#implementors\">Implementors</a>");
36703754

36713755
sidebar.push_str(&sidebar_assoc_items(it));
36723756

@@ -3693,13 +3777,29 @@ fn sidebar_typedef(fmt: &mut fmt::Formatter, it: &clean::Item,
36933777
Ok(())
36943778
}
36953779

3780+
fn get_struct_fields_name(fields: &[clean::Item]) -> String {
3781+
fields.iter()
3782+
.filter(|f| if let clean::StructFieldItem(..) = f.inner {
3783+
true
3784+
} else {
3785+
false
3786+
})
3787+
.filter_map(|f| match f.name {
3788+
Some(ref name) => Some(format!("<a href=\"#structfield.{name}\">\
3789+
{name}</a>", name=name)),
3790+
_ => None,
3791+
})
3792+
.collect()
3793+
}
3794+
36963795
fn sidebar_union(fmt: &mut fmt::Formatter, it: &clean::Item,
36973796
u: &clean::Union) -> fmt::Result {
36983797
let mut sidebar = String::new();
3798+
let fields = get_struct_fields_name(&u.fields);
36993799

3700-
if u.fields.iter()
3701-
.any(|f| if let clean::StructFieldItem(..) = f.inner { true } else { false }) {
3702-
sidebar.push_str("<li><a href=\"#fields\">Fields</a></li>");
3800+
if !fields.is_empty() {
3801+
sidebar.push_str(&format!("<a class=\"sidebar-title\" href=\"#fields\">Fields</a>\
3802+
<div class=\"sidebar-links\">{}</div>", fields));
37033803
}
37043804

37053805
sidebar.push_str(&sidebar_assoc_items(it));
@@ -3714,8 +3814,16 @@ fn sidebar_enum(fmt: &mut fmt::Formatter, it: &clean::Item,
37143814
e: &clean::Enum) -> fmt::Result {
37153815
let mut sidebar = String::new();
37163816

3717-
if !e.variants.is_empty() {
3718-
sidebar.push_str("<li><a href=\"#variants\">Variants</a></li>");
3817+
let variants = e.variants.iter()
3818+
.filter_map(|v| match v.name {
3819+
Some(ref name) => Some(format!("<a href=\"#variant.{name}\">{name}\
3820+
</a>", name = name)),
3821+
_ => None,
3822+
})
3823+
.collect::<String>();
3824+
if !variants.is_empty() {
3825+
sidebar.push_str(&format!("<a class=\"sidebar-title\" href=\"#variants\">Variants</a>\
3826+
<div class=\"sidebar-links\">{}</div>", variants));
37193827
}
37203828

37213829
sidebar.push_str(&sidebar_assoc_items(it));

src/librustdoc/html/static/main.js

+1
Original file line numberDiff line numberDiff line change
@@ -213,6 +213,7 @@
213213
break;
214214

215215
case "+":
216+
case "-":
216217
ev.preventDefault();
217218
toggleAllDocs();
218219
break;

src/librustdoc/html/static/rustdoc.css

+2-1
Original file line numberDiff line numberDiff line change
@@ -582,13 +582,14 @@ body.blur > :not(#help) {
582582
display: block;
583583
margin-top: -1px;
584584
}
585-
#help dd { margin: 5px 33px; }
585+
#help dd { margin: 5px 35px; }
586586
#help .infos { padding-left: 0; }
587587
#help h1, #help h2 { margin-top: 0; }
588588
#help > div div {
589589
width: 50%;
590590
float: left;
591591
padding: 20px;
592+
padding-left: 17px;
592593
}
593594

594595
.stab {

src/libstd/env.rs

+4
Original file line numberDiff line numberDiff line change
@@ -671,6 +671,10 @@ pub struct ArgsOs { inner: sys::args::Args }
671671
/// set to arbitrary text, and may not even exist. This means this property should
672672
/// not be relied upon for security purposes.
673673
///
674+
/// On Unix systems shell usually expands unquoted arguments with glob patterns
675+
/// (such as `*` and `?`). On Windows this is not done, and such arguments are
676+
/// passed as-is.
677+
///
674678
/// # Panics
675679
///
676680
/// The returned iterator will panic during iteration if any argument to the

src/libstd/sys/unix/ext/fs.rs

+70-4
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,9 @@ use sys;
2020
use sys_common::{FromInner, AsInner, AsInnerMut};
2121
use sys::platform::fs::MetadataExt as UnixMetadataExt;
2222

23-
/// Unix-specific extensions to `File`
23+
/// Unix-specific extensions to [`File`].
24+
///
25+
/// [`File`]: ../../../../std/fs/struct.File.html
2426
#[stable(feature = "file_offset", since = "1.15.0")]
2527
pub trait FileExt {
2628
/// Reads a number of bytes starting from a given offset.
@@ -515,19 +517,79 @@ impl MetadataExt for fs::Metadata {
515517
fn blocks(&self) -> u64 { self.st_blocks() }
516518
}
517519

518-
/// Add special unix types (block/char device, fifo and socket)
520+
/// Add support for special unix types (block/char device, fifo and socket).
519521
#[stable(feature = "file_type_ext", since = "1.5.0")]
520522
pub trait FileTypeExt {
521523
/// Returns whether this file type is a block device.
524+
///
525+
/// # Examples
526+
///
527+
/// ```
528+
/// use std::fs;
529+
/// use std::os::unix::fs::FileTypeExt;
530+
///
531+
/// # use std::io;
532+
/// # fn f() -> io::Result<()> {
533+
/// let meta = fs::metadata("block_device_file")?;
534+
/// let file_type = meta.file_type();
535+
/// assert!(file_type.is_block_device());
536+
/// # Ok(())
537+
/// # }
538+
/// ```
522539
#[stable(feature = "file_type_ext", since = "1.5.0")]
523540
fn is_block_device(&self) -> bool;
524541
/// Returns whether this file type is a char device.
542+
///
543+
/// # Examples
544+
///
545+
/// ```
546+
/// use std::fs;
547+
/// use std::os::unix::fs::FileTypeExt;
548+
///
549+
/// # use std::io;
550+
/// # fn f() -> io::Result<()> {
551+
/// let meta = fs::metadata("char_device_file")?;
552+
/// let file_type = meta.file_type();
553+
/// assert!(file_type.is_char_device());
554+
/// # Ok(())
555+
/// # }
556+
/// ```
525557
#[stable(feature = "file_type_ext", since = "1.5.0")]
526558
fn is_char_device(&self) -> bool;
527559
/// Returns whether this file type is a fifo.
560+
///
561+
/// # Examples
562+
///
563+
/// ```
564+
/// use std::fs;
565+
/// use std::os::unix::fs::FileTypeExt;
566+
///
567+
/// # use std::io;
568+
/// # fn f() -> io::Result<()> {
569+
/// let meta = fs::metadata("fifo_file")?;
570+
/// let file_type = meta.file_type();
571+
/// assert!(file_type.is_fifo());
572+
/// # Ok(())
573+
/// # }
574+
/// ```
528575
#[stable(feature = "file_type_ext", since = "1.5.0")]
529576
fn is_fifo(&self) -> bool;
530577
/// Returns whether this file type is a socket.
578+
///
579+
/// # Examples
580+
///
581+
/// ```
582+
/// use std::fs;
583+
/// use std::os::unix::fs::FileTypeExt;
584+
///
585+
/// # use std::io;
586+
/// # fn f() -> io::Result<()> {
587+
/// let meta = fs::metadata("unix.socket")?;
588+
/// let file_type = meta.file_type();
589+
/// assert!(file_type.is_socket());
590+
/// # Ok(())
591+
/// # }
592+
/// ```
531593
#[stable(feature = "file_type_ext", since = "1.5.0")]
532594
fn is_socket(&self) -> bool;
533595
}
@@ -540,7 +602,9 @@ impl FileTypeExt for fs::FileType {
540602
fn is_socket(&self) -> bool { self.as_inner().is(libc::S_IFSOCK) }
541603
}
542604

543-
/// Unix-specific extension methods for `fs::DirEntry`
605+
/// Unix-specific extension methods for [`fs::DirEntry`].
606+
///
607+
/// [`fs::DirEntry`]: ../../../../std/fs/struct.DirEntry.html
544608
#[stable(feature = "dir_entry_ext", since = "1.1.0")]
545609
pub trait DirEntryExt {
546610
/// Returns the underlying `d_ino` field in the contained `dirent`
@@ -600,7 +664,9 @@ pub fn symlink<P: AsRef<Path>, Q: AsRef<Path>>(src: P, dst: Q) -> io::Result<()>
600664
}
601665

602666
#[stable(feature = "dir_builder", since = "1.6.0")]
603-
/// An extension trait for `fs::DirBuilder` for unix-specific options.
667+
/// An extension trait for [`fs::DirBuilder`] for unix-specific options.
668+
///
669+
/// [`fs::DirBuilder`]: ../../../../std/fs/struct.DirBuilder.html
604670
pub trait DirBuilderExt {
605671
/// Sets the mode to create new directories with. This option defaults to
606672
/// 0o777.

0 commit comments

Comments
 (0)