Auto merge of #102121 - JohnTitor:rollup-3fb1wrt, r=JohnTitor
Rollup of 12 pull requests Successful merges: - #101952 (Avoid panicking on missing fallback) - #102030 (Don't crate-locally reexport walk functions in tidy) - #102032 (Adding ignore fuchsia tests for signal interpretation cases) - #102033 (Adding needs-unwind to nicer-assert-messages compiler ui tests) - #102054 (Unify "all items" page's sidebar with other pages) - #102071 (Adding needs-unwind for tests testing memory size of Futures/Closures) - #102073 (Adding ignore fuchsia tests for execvp) - #102075 (rustdoc: remove no-op CSS `.content > .methods > .method`) - #102079 (Update books) - #102084 (Adding needs-unwind for test using panic::catch_unwind) - #102100 (Prevent usage of .stab elements to create scrollable areas in doc blocks) - #102102 (Add doc aliases on Sized trait) Failed merges: r? `@ghost` `@rustbot` modify labels: rollup
This commit is contained in:
commit
626b02a8f9
@ -81,6 +81,7 @@ impl<T: ?Sized> !Send for *mut T {}
|
||||
/// ```
|
||||
///
|
||||
/// [trait object]: ../../book/ch17-02-trait-objects.html
|
||||
#[doc(alias = "?", alias = "?Sized")]
|
||||
#[stable(feature = "rust1", since = "1.0.0")]
|
||||
#[lang = "sized"]
|
||||
#[rustc_on_unimplemented(
|
||||
|
@ -1 +1 @@
|
||||
Subproject commit 0a5421ceb238357b3634fb75234eba4d1dad643c
|
||||
Subproject commit f1e5ad844d0c61738006cdef26227beeb136948e
|
@ -1 +1 @@
|
||||
Subproject commit befe6840874311635c417cf731377f07234ee373
|
||||
Subproject commit 4ce51cb7441a6f02b5bf9b07b2eb755c21ab7954
|
@ -1 +1 @@
|
||||
Subproject commit d880e6ac2acf133dce640da24b9fb692844f02d4
|
||||
Subproject commit f53bfa056929217870a5d2df1366d2e7ba35096d
|
@ -1 +1 @@
|
||||
Subproject commit f62e93c28323ed9637d0a205a0c256498674a509
|
||||
Subproject commit a7cdac33ca7356ad49d5c2b5e2c5010889b33eee
|
@ -1 +1 @@
|
||||
Subproject commit 03301f8ae55fa6f20f7ea152a517598e6db2cdb7
|
||||
Subproject commit 767a6bd9727a596d7cfdbaeee475e65b2670ea3a
|
@ -1 +1 @@
|
||||
Subproject commit 04892c1a6fc145602ac7367945fda9d4ee83c9fb
|
||||
Subproject commit f587d6e7cddeaa3cf0a33ec1e368df1a408fa0aa
|
@ -17,8 +17,8 @@
|
||||
use super::search_index::build_index;
|
||||
use super::write_shared::write_shared;
|
||||
use super::{
|
||||
collect_spans_and_sources, print_sidebar, scrape_examples_help, AllTypes, LinkFromSrc, NameDoc,
|
||||
StylePath, BASIC_KEYWORDS,
|
||||
collect_spans_and_sources, print_sidebar, scrape_examples_help, sidebar_module_like, AllTypes,
|
||||
LinkFromSrc, NameDoc, StylePath, BASIC_KEYWORDS,
|
||||
};
|
||||
|
||||
use crate::clean::{self, types::ExternalLocation, ExternalCrate};
|
||||
@ -597,16 +597,24 @@ fn after_krate(&mut self) -> Result<(), Error> {
|
||||
keywords: BASIC_KEYWORDS,
|
||||
resource_suffix: &shared.resource_suffix,
|
||||
};
|
||||
let sidebar = if shared.cache.crate_version.is_some() {
|
||||
format!("<h2 class=\"location\">Crate {}</h2>", crate_name)
|
||||
} else {
|
||||
String::new()
|
||||
};
|
||||
let all = shared.all.replace(AllTypes::new());
|
||||
let mut sidebar = Buffer::html();
|
||||
if shared.cache.crate_version.is_some() {
|
||||
write!(sidebar, "<h2 class=\"location\">Crate {}</h2>", crate_name)
|
||||
};
|
||||
|
||||
let mut items = Buffer::html();
|
||||
sidebar_module_like(&mut items, all.item_sections());
|
||||
if !items.is_empty() {
|
||||
sidebar.push_str("<div class=\"sidebar-elems\">");
|
||||
sidebar.push_buffer(items);
|
||||
sidebar.push_str("</div>");
|
||||
}
|
||||
|
||||
let v = layout::render(
|
||||
&shared.layout,
|
||||
&page,
|
||||
sidebar,
|
||||
sidebar.into_inner(),
|
||||
|buf: &mut Buffer| all.print(buf),
|
||||
&shared.style_files,
|
||||
);
|
||||
|
@ -290,19 +290,66 @@ fn append(&mut self, item_name: String, item_type: &ItemType) {
|
||||
};
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
impl AllTypes {
|
||||
fn item_sections(&self) -> FxHashSet<ItemSection> {
|
||||
let mut sections = FxHashSet::default();
|
||||
|
||||
if !self.structs.is_empty() {
|
||||
sections.insert(ItemSection::Structs);
|
||||
}
|
||||
if !self.enums.is_empty() {
|
||||
sections.insert(ItemSection::Enums);
|
||||
}
|
||||
if !self.unions.is_empty() {
|
||||
sections.insert(ItemSection::Unions);
|
||||
}
|
||||
if !self.primitives.is_empty() {
|
||||
sections.insert(ItemSection::PrimitiveTypes);
|
||||
}
|
||||
if !self.traits.is_empty() {
|
||||
sections.insert(ItemSection::Traits);
|
||||
}
|
||||
if !self.macros.is_empty() {
|
||||
sections.insert(ItemSection::Macros);
|
||||
}
|
||||
if !self.functions.is_empty() {
|
||||
sections.insert(ItemSection::Functions);
|
||||
}
|
||||
if !self.typedefs.is_empty() {
|
||||
sections.insert(ItemSection::TypeDefinitions);
|
||||
}
|
||||
if !self.opaque_tys.is_empty() {
|
||||
sections.insert(ItemSection::OpaqueTypes);
|
||||
}
|
||||
if !self.statics.is_empty() {
|
||||
sections.insert(ItemSection::Statics);
|
||||
}
|
||||
if !self.constants.is_empty() {
|
||||
sections.insert(ItemSection::Constants);
|
||||
}
|
||||
if !self.attributes.is_empty() {
|
||||
sections.insert(ItemSection::AttributeMacros);
|
||||
}
|
||||
if !self.derives.is_empty() {
|
||||
sections.insert(ItemSection::DeriveMacros);
|
||||
}
|
||||
if !self.trait_aliases.is_empty() {
|
||||
sections.insert(ItemSection::TraitAliases);
|
||||
}
|
||||
|
||||
sections
|
||||
}
|
||||
|
||||
fn print(self, f: &mut Buffer) {
|
||||
fn print_entries(f: &mut Buffer, e: &FxHashSet<ItemEntry>, title: &str) {
|
||||
fn print_entries(f: &mut Buffer, e: &FxHashSet<ItemEntry>, kind: ItemSection) {
|
||||
if !e.is_empty() {
|
||||
let mut e: Vec<&ItemEntry> = e.iter().collect();
|
||||
e.sort();
|
||||
write!(
|
||||
f,
|
||||
"<h3 id=\"{}\">{}</h3><ul class=\"all-items\">",
|
||||
title.replace(' ', "-"), // IDs cannot contain whitespaces.
|
||||
title
|
||||
"<h3 id=\"{id}\">{title}</h3><ul class=\"all-items\">",
|
||||
id = kind.id(),
|
||||
title = kind.name(),
|
||||
);
|
||||
|
||||
for s in e.iter() {
|
||||
@ -320,20 +367,20 @@ fn print_entries(f: &mut Buffer, e: &FxHashSet<ItemEntry>, title: &str) {
|
||||
);
|
||||
// Note: print_entries does not escape the title, because we know the current set of titles
|
||||
// doesn't require escaping.
|
||||
print_entries(f, &self.structs, "Structs");
|
||||
print_entries(f, &self.enums, "Enums");
|
||||
print_entries(f, &self.unions, "Unions");
|
||||
print_entries(f, &self.primitives, "Primitives");
|
||||
print_entries(f, &self.traits, "Traits");
|
||||
print_entries(f, &self.macros, "Macros");
|
||||
print_entries(f, &self.attributes, "Attribute Macros");
|
||||
print_entries(f, &self.derives, "Derive Macros");
|
||||
print_entries(f, &self.functions, "Functions");
|
||||
print_entries(f, &self.typedefs, "Typedefs");
|
||||
print_entries(f, &self.trait_aliases, "Trait Aliases");
|
||||
print_entries(f, &self.opaque_tys, "Opaque Types");
|
||||
print_entries(f, &self.statics, "Statics");
|
||||
print_entries(f, &self.constants, "Constants");
|
||||
print_entries(f, &self.structs, ItemSection::Structs);
|
||||
print_entries(f, &self.enums, ItemSection::Enums);
|
||||
print_entries(f, &self.unions, ItemSection::Unions);
|
||||
print_entries(f, &self.primitives, ItemSection::PrimitiveTypes);
|
||||
print_entries(f, &self.traits, ItemSection::Traits);
|
||||
print_entries(f, &self.macros, ItemSection::Macros);
|
||||
print_entries(f, &self.attributes, ItemSection::AttributeMacros);
|
||||
print_entries(f, &self.derives, ItemSection::DeriveMacros);
|
||||
print_entries(f, &self.functions, ItemSection::Functions);
|
||||
print_entries(f, &self.typedefs, ItemSection::TypeDefinitions);
|
||||
print_entries(f, &self.trait_aliases, ItemSection::TraitAliases);
|
||||
print_entries(f, &self.opaque_tys, ItemSection::OpaqueTypes);
|
||||
print_entries(f, &self.statics, ItemSection::Statics);
|
||||
print_entries(f, &self.constants, ItemSection::Constants);
|
||||
}
|
||||
}
|
||||
|
||||
@ -2468,7 +2515,7 @@ fn sidebar_enum(cx: &Context<'_>, buf: &mut Buffer, it: &clean::Item, e: &clean:
|
||||
}
|
||||
|
||||
#[derive(Debug, Copy, Clone, PartialEq, Eq, Hash)]
|
||||
enum ItemSection {
|
||||
pub(crate) enum ItemSection {
|
||||
Reexports,
|
||||
PrimitiveTypes,
|
||||
Modules,
|
||||
@ -2620,25 +2667,11 @@ fn item_ty_to_section(ty: ItemType) -> ItemSection {
|
||||
}
|
||||
}
|
||||
|
||||
fn sidebar_module(buf: &mut Buffer, items: &[clean::Item]) {
|
||||
pub(crate) fn sidebar_module_like(buf: &mut Buffer, item_sections_in_use: FxHashSet<ItemSection>) {
|
||||
use std::fmt::Write as _;
|
||||
|
||||
let mut sidebar = String::new();
|
||||
|
||||
let item_sections_in_use: FxHashSet<_> = items
|
||||
.iter()
|
||||
.filter(|it| {
|
||||
!it.is_stripped()
|
||||
&& it
|
||||
.name
|
||||
.or_else(|| {
|
||||
if let clean::ImportItem(ref i) = *it.kind &&
|
||||
let clean::ImportKind::Simple(s) = i.kind { Some(s) } else { None }
|
||||
})
|
||||
.is_some()
|
||||
})
|
||||
.map(|it| item_ty_to_section(it.type_()))
|
||||
.collect();
|
||||
for &sec in ItemSection::ALL.iter().filter(|sec| item_sections_in_use.contains(sec)) {
|
||||
let _ = write!(sidebar, "<li><a href=\"#{}\">{}</a></li>", sec.id(), sec.name());
|
||||
}
|
||||
@ -2656,6 +2689,25 @@ fn sidebar_module(buf: &mut Buffer, items: &[clean::Item]) {
|
||||
}
|
||||
}
|
||||
|
||||
fn sidebar_module(buf: &mut Buffer, items: &[clean::Item]) {
|
||||
let item_sections_in_use: FxHashSet<_> = items
|
||||
.iter()
|
||||
.filter(|it| {
|
||||
!it.is_stripped()
|
||||
&& it
|
||||
.name
|
||||
.or_else(|| {
|
||||
if let clean::ImportItem(ref i) = *it.kind &&
|
||||
let clean::ImportKind::Simple(s) = i.kind { Some(s) } else { None }
|
||||
})
|
||||
.is_some()
|
||||
})
|
||||
.map(|it| item_ty_to_section(it.type_()))
|
||||
.collect();
|
||||
|
||||
sidebar_module_like(buf, item_sections_in_use);
|
||||
}
|
||||
|
||||
fn sidebar_foreign_type(cx: &Context<'_>, buf: &mut Buffer, it: &clean::Item) {
|
||||
let mut sidebar = Buffer::new();
|
||||
sidebar_assoc_items(cx, &mut sidebar, it);
|
||||
|
@ -728,10 +728,6 @@ pre, .rustdoc.source .example-wrap {
|
||||
padding: 0;
|
||||
}
|
||||
|
||||
.content > .methods > .method {
|
||||
font-size: 1rem;
|
||||
position: relative;
|
||||
}
|
||||
/* Shift "where ..." part of method or fn definition down a line */
|
||||
.content .method .where,
|
||||
.content .fn .where,
|
||||
@ -1092,6 +1088,12 @@ so that we can apply CSS-filters to change the arrow color in themes */
|
||||
margin-right: 0.3rem;
|
||||
}
|
||||
|
||||
/* This is to prevent the `.stab` elements to overflow the .docblock elements. */
|
||||
.docblock .stab {
|
||||
padding: 0 0.125em;
|
||||
margin-bottom: 0;
|
||||
}
|
||||
|
||||
/* Black one-pixel outline around emoji shapes */
|
||||
.emoji {
|
||||
text-shadow:
|
||||
|
21
src/test/rustdoc-gui/check-stab-in-docblock.goml
Normal file
21
src/test/rustdoc-gui/check-stab-in-docblock.goml
Normal file
@ -0,0 +1,21 @@
|
||||
// This test checks that using `.stab` attributes in `.docblock` elements doesn't
|
||||
// create scrollable paragraphs.
|
||||
goto: file://|DOC_PATH|/test_docs/index.html
|
||||
// Needs the text to be display to check for scrollable content.
|
||||
show-text: true
|
||||
size: (786, 600)
|
||||
// Confirms that there 3 paragraphs.
|
||||
assert-count: (".top-doc .docblock p", 3)
|
||||
// Checking that there is no scrollable content.
|
||||
assert-property: (
|
||||
".top-doc .docblock p:nth-of-type(1)",
|
||||
{"scrollHeight": "120", "clientHeight": "120", "scrollWidth": "502", "clientWidth": "502"},
|
||||
)
|
||||
assert-property: (
|
||||
".top-doc .docblock p:nth-of-type(2)",
|
||||
{"scrollHeight": "48", "clientHeight": "48", "scrollWidth": "502", "clientWidth": "502"},
|
||||
)
|
||||
assert-property: (
|
||||
".top-doc .docblock p:nth-of-type(3)",
|
||||
{"scrollHeight": "48", "clientHeight": "48", "scrollWidth": "502", "clientWidth": "502"},
|
||||
)
|
@ -6,6 +6,24 @@
|
||||
#![feature(rustdoc_internals)]
|
||||
#![feature(doc_cfg)]
|
||||
|
||||
/*!
|
||||
Enable the feature <span class="stab portability"><code>some-feature</code></span> to enjoy
|
||||
this crate even more!
|
||||
Enable the feature <span class="stab portability"><code>some-feature</code></span> to enjoy
|
||||
this crate even more!
|
||||
Enable the feature <span class="stab portability"><code>some-feature</code></span> to enjoy
|
||||
this crate even more!
|
||||
|
||||
Also, stop using `bar` as it's <span class="stab deprecated" title="">deprecated</span>.
|
||||
Also, stop using `bar` as it's <span class="stab deprecated" title="">deprecated</span>.
|
||||
Also, stop using `bar` as it's <span class="stab deprecated" title="">deprecated</span>.
|
||||
|
||||
Finally, you can use `quz` only on <span class="stab portability"><code>Unix or x86-64</code>
|
||||
</span>.
|
||||
Finally, you can use `quz` only on <span class="stab portability"><code>Unix or x86-64</code>
|
||||
</span>.
|
||||
*/
|
||||
|
||||
use std::convert::AsRef;
|
||||
use std::fmt;
|
||||
|
||||
|
35
src/test/rustdoc/sidebar-all-page.rs
Normal file
35
src/test/rustdoc/sidebar-all-page.rs
Normal file
@ -0,0 +1,35 @@
|
||||
#![crate_name = "foo"]
|
||||
|
||||
#![feature(rustdoc_internals)]
|
||||
|
||||
// @has 'foo/all.html'
|
||||
// @has - '//*[@class="sidebar-elems"]//li' 'Structs'
|
||||
// @has - '//*[@class="sidebar-elems"]//li' 'Enums'
|
||||
// @has - '//*[@class="sidebar-elems"]//li' 'Unions'
|
||||
// @has - '//*[@class="sidebar-elems"]//li' 'Functions'
|
||||
// @has - '//*[@class="sidebar-elems"]//li' 'Traits'
|
||||
// @has - '//*[@class="sidebar-elems"]//li' 'Macros'
|
||||
// @has - '//*[@class="sidebar-elems"]//li' 'Type Definitions'
|
||||
// @has - '//*[@class="sidebar-elems"]//li' 'Constants'
|
||||
// @has - '//*[@class="sidebar-elems"]//li' 'Statics'
|
||||
// @has - '//*[@class="sidebar-elems"]//li' 'Primitive Types'
|
||||
|
||||
pub struct Foo;
|
||||
pub enum Enum {
|
||||
A,
|
||||
}
|
||||
pub union Bar {
|
||||
a: u8,
|
||||
b: u16,
|
||||
}
|
||||
pub fn foo() {}
|
||||
pub trait Trait {}
|
||||
#[macro_export]
|
||||
macro_rules! foo {
|
||||
() => {}
|
||||
}
|
||||
pub type Type = u8;
|
||||
pub const FOO: u8 = 0;
|
||||
pub static BAR: u8 = 0;
|
||||
#[doc(primitive = "u8")]
|
||||
mod u8 {}
|
@ -3,6 +3,7 @@
|
||||
#![allow(unused_imports)]
|
||||
// ignore-emscripten can't run commands
|
||||
// ignore-sgx no processes
|
||||
// ignore-fuchsia must translate zircon signal to SIGSEGV/SIGBUS, FIXME (#58590)
|
||||
#![feature(rustc_private)]
|
||||
|
||||
extern crate libc;
|
||||
|
@ -12,6 +12,7 @@
|
||||
// ignore-sgx no processes
|
||||
// ignore-musl FIXME #31506
|
||||
// ignore-pretty
|
||||
// ignore-fuchsia no exception handler registered for segfault
|
||||
// compile-flags: -C lto
|
||||
// no-prefer-dynamic
|
||||
|
||||
|
@ -10,6 +10,7 @@
|
||||
// ignore-wasm
|
||||
// ignore-emscripten no processes
|
||||
// ignore-sgx no processes
|
||||
// ignore-fuchsia no exception handler registered for segfault
|
||||
|
||||
use std::env;
|
||||
use std::mem::MaybeUninit;
|
||||
|
@ -8,6 +8,7 @@
|
||||
// See issue #59123 for a full explanation.
|
||||
|
||||
// ignore-emscripten (sizes don't match)
|
||||
// needs-unwind Size of Futures change on panic=abort
|
||||
// run-pass
|
||||
|
||||
// edition:2018
|
||||
|
@ -5,6 +5,7 @@
|
||||
// being reflected in the size.
|
||||
|
||||
// ignore-emscripten (sizes don't match)
|
||||
// needs-unwind Size of Futures change on panic=abort
|
||||
// run-pass
|
||||
|
||||
// edition:2018
|
||||
|
@ -5,6 +5,7 @@
|
||||
// ignore-pretty issue #37199
|
||||
// ignore-emscripten no processes
|
||||
// ignore-sgx no processes
|
||||
// ignore-fuchsia no execvp syscall provided
|
||||
|
||||
#![feature(process_exec)]
|
||||
|
||||
|
@ -12,6 +12,7 @@
|
||||
// edition:2018
|
||||
// ignore-wasm32 issue #62807
|
||||
// ignore-asmjs issue #62807
|
||||
// needs-unwind Size of Closures change on panic=abort
|
||||
|
||||
#![feature(generators, generator_trait)]
|
||||
|
||||
|
@ -3,6 +3,7 @@
|
||||
// run-fail
|
||||
// exec-env:RUST_BACKTRACE=0
|
||||
// check-run-results
|
||||
// needs-unwind uses catch_unwind
|
||||
|
||||
use std::sync::Once;
|
||||
use std::panic;
|
||||
|
@ -1,3 +1,3 @@
|
||||
thread 'main' panicked at 'Here Once instance is poisoned.', $DIR/issue-87707.rs:13:24
|
||||
thread 'main' panicked at 'Here Once instance is poisoned.', $DIR/issue-87707.rs:14:24
|
||||
note: run with `RUST_BACKTRACE=1` environment variable to display a backtrace
|
||||
thread 'main' panicked at 'Once instance has previously been poisoned', $DIR/issue-87707.rs:15:7
|
||||
thread 'main' panicked at 'Once instance has previously been poisoned', $DIR/issue-87707.rs:16:7
|
||||
|
@ -2,6 +2,7 @@
|
||||
// ignore-tidy-linelength
|
||||
// only-x86_64
|
||||
// run-pass
|
||||
// needs-unwind Asserting on contents of error message
|
||||
|
||||
#![allow(path_statements, unused_allocation)]
|
||||
#![feature(box_syntax, core_intrinsics, generic_assert, generic_assert_internals)]
|
||||
|
@ -2,6 +2,7 @@
|
||||
// ignore-tidy-linelength
|
||||
// only-x86_64
|
||||
// run-pass
|
||||
// needs-unwind Asserting on contents of error message
|
||||
|
||||
#![feature(core_intrinsics, generic_assert, generic_assert_internals)]
|
||||
|
||||
|
@ -1,6 +1,7 @@
|
||||
// aux-build:common.rs
|
||||
// only-x86_64
|
||||
// run-pass
|
||||
// needs-unwind Asserting on contents of error message
|
||||
|
||||
#![feature(core_intrinsics, generic_assert, generic_assert_internals)]
|
||||
|
||||
|
@ -2,6 +2,7 @@
|
||||
// ignore-emscripten no processes
|
||||
// ignore-sgx no processes
|
||||
// ignore-windows
|
||||
// ignore-fuchsia code returned as ZX_TASK_RETCODE_EXCEPTION_KILL, FIXME (#58590)
|
||||
|
||||
use std::env;
|
||||
use std::process::Command;
|
||||
|
@ -5,6 +5,7 @@
|
||||
// ignore-android: FIXME (#20004)
|
||||
// ignore-emscripten no processes
|
||||
// ignore-sgx no processes
|
||||
// ignore-fuchsia must translate zircon signal to SIGABRT, FIXME (#58590)
|
||||
|
||||
#![feature(core_intrinsics)]
|
||||
#![feature(rustc_private)]
|
||||
|
@ -543,8 +543,18 @@ macro_rules! tarball_name {
|
||||
for (substr, fallback_target) in fallback {
|
||||
if target_name.contains(substr) {
|
||||
let t = Target::from_compressed_tar(self, &tarball_name!(fallback_target));
|
||||
// Fallbacks must always be available.
|
||||
assert!(t.available);
|
||||
// Fallbacks should typically be available on 'production' builds
|
||||
// but may not be available for try builds, which only build one target by
|
||||
// default. Ideally we'd gate this being a hard error on whether we're in a
|
||||
// production build or not, but it's not information that's readily available
|
||||
// here.
|
||||
if !t.available {
|
||||
eprintln!(
|
||||
"{:?} not available for fallback",
|
||||
tarball_name!(fallback_target)
|
||||
);
|
||||
continue;
|
||||
}
|
||||
return t;
|
||||
}
|
||||
}
|
||||
|
@ -21,6 +21,7 @@ pub fn check(_path: &Path, _bad: &mut bool) {}
|
||||
|
||||
#[cfg(unix)]
|
||||
mod os_impl {
|
||||
use crate::walk::{filter_dirs, walk_no_read};
|
||||
use std::fs;
|
||||
use std::os::unix::prelude::*;
|
||||
use std::path::Path;
|
||||
@ -100,10 +101,10 @@ pub fn check(path: &Path, bad: &mut bool) {
|
||||
|
||||
const ALLOWED: &[&str] = &["configure", "x"];
|
||||
|
||||
crate::walk_no_read(
|
||||
walk_no_read(
|
||||
path,
|
||||
&mut |path| {
|
||||
crate::filter_dirs(path)
|
||||
filter_dirs(path)
|
||||
|| path.ends_with("src/etc")
|
||||
// This is a list of directories that we almost certainly
|
||||
// don't need to walk. A future PR will likely want to
|
||||
|
@ -1,5 +1,6 @@
|
||||
//! Tidy check to prevent creation of unnecessary debug artifacts while running tests.
|
||||
|
||||
use crate::walk::{filter_dirs, walk};
|
||||
use std::path::{Path, PathBuf};
|
||||
|
||||
const GRAPHVIZ_POSTFLOW_MSG: &str = "`borrowck_graphviz_postflow` attribute in test";
|
||||
@ -7,7 +8,7 @@
|
||||
pub fn check(path: &Path, bad: &mut bool) {
|
||||
let test_dir: PathBuf = path.join("test");
|
||||
|
||||
super::walk(&test_dir, &mut super::filter_dirs, &mut |entry, contents| {
|
||||
walk(&test_dir, &mut filter_dirs, &mut |entry, contents| {
|
||||
let filename = entry.path();
|
||||
let is_rust = filename.extension().map_or(false, |ext| ext == "rs");
|
||||
if !is_rust {
|
||||
|
@ -1,5 +1,6 @@
|
||||
//! Tidy check to ensure that crate `edition` is '2018' or '2021'.
|
||||
|
||||
use crate::walk::{filter_dirs, walk};
|
||||
use std::path::Path;
|
||||
|
||||
fn is_edition_2021(mut line: &str) -> bool {
|
||||
@ -8,9 +9,9 @@ fn is_edition_2021(mut line: &str) -> bool {
|
||||
}
|
||||
|
||||
pub fn check(path: &Path, bad: &mut bool) {
|
||||
super::walk(
|
||||
walk(
|
||||
path,
|
||||
&mut |path| super::filter_dirs(path) || path.ends_with("src/test"),
|
||||
&mut |path| filter_dirs(path) || path.ends_with("src/test"),
|
||||
&mut |entry, contents| {
|
||||
let file = entry.path();
|
||||
let filename = file.file_name().unwrap();
|
||||
|
@ -1,6 +1,7 @@
|
||||
//! Checks that all error codes have at least one test to prevent having error
|
||||
//! codes that are silently not thrown by the compiler anymore.
|
||||
|
||||
use crate::walk::{filter_dirs, walk};
|
||||
use std::collections::{HashMap, HashSet};
|
||||
use std::ffi::OsStr;
|
||||
use std::fs::read_to_string;
|
||||
@ -217,7 +218,7 @@ pub fn check(paths: &[&Path], bad: &mut bool) {
|
||||
println!("Checking which error codes lack tests...");
|
||||
|
||||
for path in paths {
|
||||
super::walk(path, &mut super::filter_dirs, &mut |entry, contents| {
|
||||
walk(path, &mut filter_dirs, &mut |entry, contents| {
|
||||
let file_name = entry.file_name();
|
||||
let entry_path = entry.path();
|
||||
|
||||
|
@ -3,14 +3,15 @@
|
||||
//! This ensures that error codes are used at most once and also prints out some
|
||||
//! statistics about the error codes.
|
||||
|
||||
use crate::walk::{filter_dirs, walk};
|
||||
use std::collections::HashMap;
|
||||
use std::path::Path;
|
||||
|
||||
pub fn check(path: &Path, bad: &mut bool) {
|
||||
let mut map: HashMap<_, Vec<_>> = HashMap::new();
|
||||
super::walk(
|
||||
walk(
|
||||
path,
|
||||
&mut |path| super::filter_dirs(path) || path.ends_with("src/test"),
|
||||
&mut |path| filter_dirs(path) || path.ends_with("src/test"),
|
||||
&mut |entry, contents| {
|
||||
let file = entry.path();
|
||||
let filename = file.file_name().unwrap().to_string_lossy();
|
||||
|
@ -9,6 +9,7 @@
|
||||
//! * All unstable lang features have tests to ensure they are actually unstable.
|
||||
//! * Language features in a group are sorted by feature name.
|
||||
|
||||
use crate::walk::{filter_dirs, walk, walk_many};
|
||||
use std::collections::HashMap;
|
||||
use std::fmt;
|
||||
use std::fs;
|
||||
@ -92,14 +93,14 @@ pub fn check(
|
||||
let lib_features = get_and_check_lib_features(lib_path, bad, &features);
|
||||
assert!(!lib_features.is_empty());
|
||||
|
||||
super::walk_many(
|
||||
walk_many(
|
||||
&[
|
||||
&src_path.join("test/ui"),
|
||||
&src_path.join("test/ui-fulldeps"),
|
||||
&src_path.join("test/rustdoc-ui"),
|
||||
&src_path.join("test/rustdoc"),
|
||||
],
|
||||
&mut |path| super::filter_dirs(path),
|
||||
&mut filter_dirs,
|
||||
&mut |entry, contents| {
|
||||
let file = entry.path();
|
||||
let filename = file.file_name().unwrap().to_string_lossy();
|
||||
@ -466,9 +467,9 @@ fn map_lib_features(
|
||||
base_src_path: &Path,
|
||||
mf: &mut dyn FnMut(Result<(&str, Feature), &str>, &Path, usize),
|
||||
) {
|
||||
super::walk(
|
||||
walk(
|
||||
base_src_path,
|
||||
&mut |path| super::filter_dirs(path) || path.ends_with("src/test"),
|
||||
&mut |path| filter_dirs(path) || path.ends_with("src/test"),
|
||||
&mut |entry, contents| {
|
||||
let file = entry.path();
|
||||
let filename = file.file_name().unwrap().to_string_lossy();
|
||||
|
@ -3,8 +3,6 @@
|
||||
//! This library contains the tidy lints and exposes it
|
||||
//! to be used by tools.
|
||||
|
||||
use walk::{filter_dirs, walk, walk_many, walk_no_read};
|
||||
|
||||
/// A helper macro to `unwrap` a result except also print out details like:
|
||||
///
|
||||
/// * The expression that failed
|
||||
|
@ -30,6 +30,7 @@
|
||||
//! platform-specific cfgs are allowed. Not sure yet how to deal with
|
||||
//! this in the long term.
|
||||
|
||||
use crate::walk::{filter_dirs, walk};
|
||||
use std::iter::Iterator;
|
||||
use std::path::Path;
|
||||
|
||||
@ -67,7 +68,7 @@ pub fn check(path: &Path, bad: &mut bool) {
|
||||
// Sanity check that the complex parsing here works.
|
||||
let mut saw_target_arch = false;
|
||||
let mut saw_cfg_bang = false;
|
||||
super::walk(path, &mut super::filter_dirs, &mut |entry, contents| {
|
||||
walk(path, &mut filter_dirs, &mut |entry, contents| {
|
||||
let file = entry.path();
|
||||
let filestr = file.to_string_lossy().replace("\\", "/");
|
||||
if !filestr.ends_with(".rs") {
|
||||
|
@ -16,6 +16,7 @@
|
||||
//! A number of these checks can be opted-out of with various directives of the form:
|
||||
//! `// ignore-tidy-CHECK-NAME`.
|
||||
|
||||
use crate::walk::{filter_dirs, walk};
|
||||
use regex::Regex;
|
||||
use std::path::Path;
|
||||
|
||||
@ -218,13 +219,13 @@ fn is_unexplained_ignore(extension: &str, line: &str) -> bool {
|
||||
|
||||
pub fn check(path: &Path, bad: &mut bool) {
|
||||
fn skip(path: &Path) -> bool {
|
||||
super::filter_dirs(path) || skip_markdown_path(path)
|
||||
filter_dirs(path) || skip_markdown_path(path)
|
||||
}
|
||||
let problematic_consts_strings: Vec<String> = (PROBLEMATIC_CONSTS.iter().map(u32::to_string))
|
||||
.chain(PROBLEMATIC_CONSTS.iter().map(|v| format!("{:x}", v)))
|
||||
.chain(PROBLEMATIC_CONSTS.iter().map(|v| format!("{:X}", v)))
|
||||
.collect();
|
||||
super::walk(path, &mut skip, &mut |entry, contents| {
|
||||
walk(path, &mut skip, &mut |entry, contents| {
|
||||
let file = entry.path();
|
||||
let filename = file.file_name().unwrap().to_string_lossy();
|
||||
let extensions = [".rs", ".py", ".js", ".sh", ".c", ".cpp", ".h", ".md", ".css", ".ftl"];
|
||||
|
@ -36,7 +36,7 @@ struct RevisionInfo<'a> {
|
||||
|
||||
pub fn check(path: &Path, bad: &mut bool) {
|
||||
let tests = path.join("test");
|
||||
super::walk(
|
||||
crate::walk::walk(
|
||||
&tests,
|
||||
&mut |path| path.extension().map(|p| p == "rs") == Some(false),
|
||||
&mut |entry, content| {
|
||||
|
@ -47,7 +47,7 @@ fn check_entries(path: &Path, bad: &mut bool) {
|
||||
pub fn check(path: &Path, bad: &mut bool) {
|
||||
check_entries(&path, bad);
|
||||
for path in &[&path.join("test/ui"), &path.join("test/ui-fulldeps")] {
|
||||
super::walk_no_read(path, &mut |_| false, &mut |entry| {
|
||||
crate::walk::walk_no_read(path, &mut |_| false, &mut |entry| {
|
||||
let file_path = entry.path();
|
||||
if let Some(ext) = file_path.extension() {
|
||||
if ext == "stderr" || ext == "stdout" {
|
||||
|
@ -7,6 +7,7 @@
|
||||
//! named `tests.rs` or `benches.rs`, or directories named `tests` or `benches` unconfigured
|
||||
//! during normal build.
|
||||
|
||||
use crate::walk::{filter_dirs, walk};
|
||||
use std::path::Path;
|
||||
|
||||
pub fn check(root_path: &Path, bad: &mut bool) {
|
||||
@ -20,7 +21,7 @@ pub fn check(root_path: &Path, bad: &mut bool) {
|
||||
let mut skip = |path: &Path| {
|
||||
let file_name = path.file_name().unwrap_or_default();
|
||||
if path.is_dir() {
|
||||
super::filter_dirs(path)
|
||||
filter_dirs(path)
|
||||
|| path.ends_with("src/test")
|
||||
|| path.ends_with("src/doc")
|
||||
|| (file_name == "tests" || file_name == "benches") && !is_core(path)
|
||||
@ -34,7 +35,7 @@ pub fn check(root_path: &Path, bad: &mut bool) {
|
||||
}
|
||||
};
|
||||
|
||||
super::walk(root_path, &mut skip, &mut |entry, contents| {
|
||||
walk(root_path, &mut skip, &mut |entry, contents| {
|
||||
let path = entry.path();
|
||||
let is_core = path.starts_with(core);
|
||||
for (i, line) in contents.lines().enumerate() {
|
||||
|
Loading…
Reference in New Issue
Block a user