Auto merge of #80806 - JohnTitor:rollup-y64z7ph, r=JohnTitor
Rollup of 7 pull requests Successful merges: - #79675 (Make sure rust-call errors occur correctly for traits) - #80372 (Don't panic when an external crate can't be resolved) - #80761 (handle generic trait methods in coverage-report tests) - #80785 (rustc_ast_pretty: Remove `PrintState::insert_extra_parens`) - #80791 (Fix type name in doc example for Iter and IterMut) - #80794 (Use Option::map_or instead of `.map(..).unwrap_or(..)`) - #80799 (Get rid of custom pretty-printing in rustdoc) Failed merges: r? `@ghost` `@rustbot` modify labels: rollup
This commit is contained in:
commit
9155a9dae5
|
@ -8,11 +8,6 @@ use rustc_ast as ast;
|
|||
use rustc_ast::token::{Nonterminal, Token, TokenKind};
|
||||
use rustc_ast::tokenstream::{TokenStream, TokenTree};
|
||||
|
||||
pub fn nonterminal_to_string_no_extra_parens(nt: &Nonterminal) -> String {
|
||||
let state = State::without_insert_extra_parens();
|
||||
state.nonterminal_to_string(nt)
|
||||
}
|
||||
|
||||
pub fn nonterminal_to_string(nt: &Nonterminal) -> String {
|
||||
State::new().nonterminal_to_string(nt)
|
||||
}
|
||||
|
|
|
@ -88,13 +88,6 @@ pub struct State<'a> {
|
|||
comments: Option<Comments<'a>>,
|
||||
ann: &'a (dyn PpAnn + 'a),
|
||||
is_expanded: bool,
|
||||
// If `true`, additional parenthesis (separate from `ExprKind::Paren`)
|
||||
// are inserted to ensure that proper precedence is preserved
|
||||
// in the pretty-printed output.
|
||||
//
|
||||
// This is usually `true`, except when performing the pretty-print/reparse
|
||||
// check in `nt_to_tokenstream`
|
||||
insert_extra_parens: bool,
|
||||
}
|
||||
|
||||
crate const INDENT_UNIT: usize = 4;
|
||||
|
@ -115,7 +108,6 @@ pub fn print_crate<'a>(
|
|||
comments: Some(Comments::new(sm, filename, input)),
|
||||
ann,
|
||||
is_expanded,
|
||||
insert_extra_parens: true,
|
||||
};
|
||||
|
||||
if is_expanded && !krate.attrs.iter().any(|attr| attr.has_name(sym::no_core)) {
|
||||
|
@ -235,7 +227,6 @@ impl std::ops::DerefMut for State<'_> {
|
|||
}
|
||||
|
||||
pub trait PrintState<'a>: std::ops::Deref<Target = pp::Printer> + std::ops::DerefMut {
|
||||
fn insert_extra_parens(&self) -> bool;
|
||||
fn comments(&mut self) -> &mut Option<Comments<'a>>;
|
||||
fn print_ident(&mut self, ident: Ident);
|
||||
fn print_generic_args(&mut self, args: &ast::GenericArgs, colons_before_params: bool);
|
||||
|
@ -819,16 +810,12 @@ pub trait PrintState<'a>: std::ops::Deref<Target = pp::Printer> + std::ops::Dere
|
|||
|
||||
fn to_string(&self, f: impl FnOnce(&mut State<'_>)) -> String {
|
||||
let mut printer = State::new();
|
||||
printer.insert_extra_parens = self.insert_extra_parens();
|
||||
f(&mut printer);
|
||||
printer.s.eof()
|
||||
}
|
||||
}
|
||||
|
||||
impl<'a> PrintState<'a> for State<'a> {
|
||||
fn insert_extra_parens(&self) -> bool {
|
||||
self.insert_extra_parens
|
||||
}
|
||||
fn comments(&mut self) -> &mut Option<Comments<'a>> {
|
||||
&mut self.comments
|
||||
}
|
||||
|
@ -865,17 +852,7 @@ impl<'a> PrintState<'a> for State<'a> {
|
|||
|
||||
impl<'a> State<'a> {
|
||||
pub fn new() -> State<'a> {
|
||||
State {
|
||||
s: pp::mk_printer(),
|
||||
comments: None,
|
||||
ann: &NoAnn,
|
||||
is_expanded: false,
|
||||
insert_extra_parens: true,
|
||||
}
|
||||
}
|
||||
|
||||
pub(super) fn without_insert_extra_parens() -> State<'a> {
|
||||
State { insert_extra_parens: false, ..State::new() }
|
||||
State { s: pp::mk_printer(), comments: None, ann: &NoAnn, is_expanded: false }
|
||||
}
|
||||
|
||||
// Synthesizes a comment that was not textually present in the original source
|
||||
|
@ -1680,8 +1657,7 @@ impl<'a> State<'a> {
|
|||
}
|
||||
|
||||
/// Prints `expr` or `(expr)` when `needs_par` holds.
|
||||
fn print_expr_cond_paren(&mut self, expr: &ast::Expr, mut needs_par: bool) {
|
||||
needs_par &= self.insert_extra_parens;
|
||||
fn print_expr_cond_paren(&mut self, expr: &ast::Expr, needs_par: bool) {
|
||||
if needs_par {
|
||||
self.popen();
|
||||
}
|
||||
|
|
|
@ -138,9 +138,6 @@ impl std::ops::DerefMut for State<'_> {
|
|||
}
|
||||
|
||||
impl<'a> PrintState<'a> for State<'a> {
|
||||
fn insert_extra_parens(&self) -> bool {
|
||||
true
|
||||
}
|
||||
fn comments(&mut self) -> &mut Option<Comments<'a>> {
|
||||
&mut self.comments
|
||||
}
|
||||
|
|
|
@ -283,8 +283,7 @@ pub fn nt_to_tokenstream(
|
|||
} else if matches!(synthesize_tokens, CanSynthesizeMissingTokens::Yes) {
|
||||
return fake_token_stream(sess, nt);
|
||||
} else {
|
||||
let pretty = rustc_ast_pretty::pprust::nonterminal_to_string_no_extra_parens(&nt);
|
||||
panic!("Missing tokens for nt {:?}", pretty);
|
||||
panic!("Missing tokens for nt {:?}", pprust::nonterminal_to_string(nt));
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -103,6 +103,10 @@ pub(super) fn check_fn<'a, 'tcx>(
|
|||
Node::ImplItem(hir::ImplItem {
|
||||
kind: hir::ImplItemKind::Fn(header, ..), ..
|
||||
}) => Some(header),
|
||||
Node::TraitItem(hir::TraitItem {
|
||||
kind: hir::TraitItemKind::Fn(header, ..),
|
||||
..
|
||||
}) => Some(header),
|
||||
// Closures are RustCall, but they tuple their arguments, so shouldn't be checked
|
||||
Node::Expr(hir::Expr { kind: hir::ExprKind::Closure(..), .. }) => None,
|
||||
node => bug!("Item being checked wasn't a function/closure: {:?}", node),
|
||||
|
|
|
@ -51,7 +51,7 @@ fn size_from_ptr<T>(_: *const T) -> usize {
|
|||
/// Basic usage:
|
||||
///
|
||||
/// ```
|
||||
/// // First, we declare a type which has `iter` method to get the `Iter` struct (&[usize here]):
|
||||
/// // First, we declare a type which has `iter` method to get the `Iter` struct (`&[usize]` here):
|
||||
/// let slice = &[1, 2, 3];
|
||||
///
|
||||
/// // Then, we iterate over it:
|
||||
|
@ -112,7 +112,7 @@ impl<'a, T> Iter<'a, T> {
|
|||
///
|
||||
/// ```
|
||||
/// // First, we declare a type which has the `iter` method to get the `Iter`
|
||||
/// // struct (&[usize here]):
|
||||
/// // struct (`&[usize]` here):
|
||||
/// let slice = &[1, 2, 3];
|
||||
///
|
||||
/// // Then, we get the iterator:
|
||||
|
@ -167,7 +167,7 @@ impl<T> AsRef<[T]> for Iter<'_, T> {
|
|||
///
|
||||
/// ```
|
||||
/// // First, we declare a type which has `iter_mut` method to get the `IterMut`
|
||||
/// // struct (&[usize here]):
|
||||
/// // struct (`&[usize]` here):
|
||||
/// let mut slice = &mut [1, 2, 3];
|
||||
///
|
||||
/// // Then, we iterate over it and increment each element value:
|
||||
|
@ -246,7 +246,7 @@ impl<'a, T> IterMut<'a, T> {
|
|||
///
|
||||
/// ```
|
||||
/// // First, we declare a type which has `iter_mut` method to get the `IterMut`
|
||||
/// // struct (&[usize here]):
|
||||
/// // struct (`&[usize]` here):
|
||||
/// let mut slice = &mut [1, 2, 3];
|
||||
///
|
||||
/// {
|
||||
|
|
|
@ -942,7 +942,7 @@ impl<'a> Clean<Arguments> for (&'a [hir::Ty<'a>], &'a [Ident]) {
|
|||
.iter()
|
||||
.enumerate()
|
||||
.map(|(i, ty)| {
|
||||
let mut name = self.1.get(i).map(|ident| ident.name).unwrap_or(kw::Empty);
|
||||
let mut name = self.1.get(i).map_or(kw::Empty, |ident| ident.name);
|
||||
if name.is_empty() {
|
||||
name = kw::Underscore;
|
||||
}
|
||||
|
@ -963,7 +963,7 @@ impl<'a> Clean<Arguments> for (&'a [hir::Ty<'a>], hir::BodyId) {
|
|||
.iter()
|
||||
.enumerate()
|
||||
.map(|(i, ty)| Argument {
|
||||
name: name_from_pat(&body.params[i].pat),
|
||||
name: Symbol::intern(&rustc_hir_pretty::param_to_string(&body.params[i])),
|
||||
type_: ty.clean(cx),
|
||||
})
|
||||
.collect(),
|
||||
|
@ -1001,7 +1001,7 @@ impl<'tcx> Clean<FnDecl> for (DefId, ty::PolyFnSig<'tcx>) {
|
|||
.iter()
|
||||
.map(|t| Argument {
|
||||
type_: t.clean(cx),
|
||||
name: names.next().map(|i| i.name).unwrap_or(kw::Empty),
|
||||
name: names.next().map_or(kw::Empty, |i| i.name),
|
||||
})
|
||||
.collect(),
|
||||
},
|
||||
|
|
|
@ -314,25 +314,6 @@ crate fn strip_path(path: &Path) -> Path {
|
|||
Path { global: path.global, res: path.res, segments }
|
||||
}
|
||||
|
||||
crate fn qpath_to_string(p: &hir::QPath<'_>) -> String {
|
||||
let segments = match *p {
|
||||
hir::QPath::Resolved(_, ref path) => &path.segments,
|
||||
hir::QPath::TypeRelative(_, ref segment) => return segment.ident.to_string(),
|
||||
hir::QPath::LangItem(lang_item, ..) => return lang_item.name().to_string(),
|
||||
};
|
||||
|
||||
let mut s = String::new();
|
||||
for (i, seg) in segments.iter().enumerate() {
|
||||
if i > 0 {
|
||||
s.push_str("::");
|
||||
}
|
||||
if seg.ident.name != kw::PathRoot {
|
||||
s.push_str(&seg.ident.as_str());
|
||||
}
|
||||
}
|
||||
s
|
||||
}
|
||||
|
||||
crate fn build_deref_target_impls(cx: &DocContext<'_>, items: &[Item], ret: &mut Vec<Item>) {
|
||||
let tcx = cx.tcx;
|
||||
|
||||
|
@ -376,57 +357,6 @@ impl ToSource for rustc_span::Span {
|
|||
}
|
||||
}
|
||||
|
||||
crate fn name_from_pat(p: &hir::Pat<'_>) -> Symbol {
|
||||
use rustc_hir::*;
|
||||
debug!("trying to get a name from pattern: {:?}", p);
|
||||
|
||||
Symbol::intern(&match p.kind {
|
||||
PatKind::Wild => return kw::Underscore,
|
||||
PatKind::Binding(_, _, ident, _) => return ident.name,
|
||||
PatKind::TupleStruct(ref p, ..) | PatKind::Path(ref p) => qpath_to_string(p),
|
||||
PatKind::Struct(ref name, ref fields, etc) => format!(
|
||||
"{} {{ {}{} }}",
|
||||
qpath_to_string(name),
|
||||
fields
|
||||
.iter()
|
||||
.map(|fp| format!("{}: {}", fp.ident, name_from_pat(&fp.pat)))
|
||||
.collect::<Vec<String>>()
|
||||
.join(", "),
|
||||
if etc { ", .." } else { "" }
|
||||
),
|
||||
PatKind::Or(ref pats) => pats
|
||||
.iter()
|
||||
.map(|p| name_from_pat(&**p).to_string())
|
||||
.collect::<Vec<String>>()
|
||||
.join(" | "),
|
||||
PatKind::Tuple(ref elts, _) => format!(
|
||||
"({})",
|
||||
elts.iter()
|
||||
.map(|p| name_from_pat(&**p).to_string())
|
||||
.collect::<Vec<String>>()
|
||||
.join(", ")
|
||||
),
|
||||
PatKind::Box(ref p) => return name_from_pat(&**p),
|
||||
PatKind::Ref(ref p, _) => return name_from_pat(&**p),
|
||||
PatKind::Lit(..) => {
|
||||
warn!(
|
||||
"tried to get argument name from PatKind::Lit, which is silly in function arguments"
|
||||
);
|
||||
return Symbol::intern("()");
|
||||
}
|
||||
PatKind::Range(..) => panic!(
|
||||
"tried to get argument name from PatKind::Range, \
|
||||
which is not allowed in function arguments"
|
||||
),
|
||||
PatKind::Slice(ref begin, ref mid, ref end) => {
|
||||
let begin = begin.iter().map(|p| name_from_pat(&**p).to_string());
|
||||
let mid = mid.as_ref().map(|p| format!("..{}", name_from_pat(&**p))).into_iter();
|
||||
let end = end.iter().map(|p| name_from_pat(&**p).to_string());
|
||||
format!("[{}]", begin.chain(mid).chain(end).collect::<Vec<_>>().join(", "))
|
||||
}
|
||||
})
|
||||
}
|
||||
|
||||
crate fn print_const(cx: &DocContext<'_>, n: &'tcx ty::Const<'_>) -> String {
|
||||
match n.val {
|
||||
ty::ConstKind::Unevaluated(def, _, promoted) => {
|
||||
|
|
|
@ -434,16 +434,15 @@ crate fn create_resolver<'a>(
|
|||
sess.time("load_extern_crates", || {
|
||||
for extern_name in &extern_names {
|
||||
debug!("loading extern crate {}", extern_name);
|
||||
resolver
|
||||
if let Err(()) = resolver
|
||||
.resolve_str_path_error(
|
||||
DUMMY_SP,
|
||||
extern_name,
|
||||
TypeNS,
|
||||
LocalDefId { local_def_index: CRATE_DEF_INDEX }.to_def_id(),
|
||||
)
|
||||
.unwrap_or_else(|()| {
|
||||
panic!("Unable to resolve external crate {}", extern_name)
|
||||
});
|
||||
) {
|
||||
warn!("unable to resolve external crate {} (do you have an unused `--extern` crate?)", extern_name)
|
||||
}
|
||||
}
|
||||
});
|
||||
});
|
||||
|
|
|
@ -172,7 +172,7 @@ else
|
|||
# files are redundant, so there is no need to generate `expected_*.json` files or
|
||||
# compare actual JSON results.)
|
||||
|
||||
$(DIFF) --ignore-matching-lines='::<.*>.*:$$' \
|
||||
$(DIFF) --ignore-matching-lines='^ | .*::<.*>.*:$$' --ignore-matching-lines='^ | <.*>::.*:$$' \
|
||||
expected_show_coverage.$@.txt "$(TMPDIR)"/actual_show_coverage.$@.txt || \
|
||||
( grep -q '^\/\/ ignore-llvm-cov-show-diffs' $(SOURCEDIR)/$@.rs && \
|
||||
>&2 echo 'diff failed, but suppressed with `// ignore-llvm-cov-show-diffs` in $(SOURCEDIR)/$@.rs' \
|
||||
|
|
5
src/test/rustdoc-ui/intra-doc/unused-extern-crate.rs
Normal file
5
src/test/rustdoc-ui/intra-doc/unused-extern-crate.rs
Normal file
|
@ -0,0 +1,5 @@
|
|||
// compile-flags: --extern zip=whatever.rlib
|
||||
#![deny(broken_intra_doc_links)]
|
||||
/// See [zip] crate.
|
||||
//~^ ERROR unresolved
|
||||
pub struct ArrayZip;
|
15
src/test/rustdoc-ui/intra-doc/unused-extern-crate.stderr
Normal file
15
src/test/rustdoc-ui/intra-doc/unused-extern-crate.stderr
Normal file
|
@ -0,0 +1,15 @@
|
|||
error: unresolved link to `zip`
|
||||
--> $DIR/unused-extern-crate.rs:3:10
|
||||
|
|
||||
LL | /// See [zip] crate.
|
||||
| ^^^ no item named `zip` in scope
|
||||
|
|
||||
note: the lint level is defined here
|
||||
--> $DIR/unused-extern-crate.rs:2:9
|
||||
|
|
||||
LL | #![deny(broken_intra_doc_links)]
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^
|
||||
= help: to escape `[` and `]` characters, add '\' before them like `\[` or `\]`
|
||||
|
||||
error: aborting due to previous error
|
||||
|
3
src/test/rustdoc-ui/range-pattern.rs
Normal file
3
src/test/rustdoc-ui/range-pattern.rs
Normal file
|
@ -0,0 +1,3 @@
|
|||
// check-pass
|
||||
|
||||
fn func(0u8..=255: u8) {}
|
5
src/test/rustdoc/range-arg-pattern.rs
Normal file
5
src/test/rustdoc/range-arg-pattern.rs
Normal file
|
@ -0,0 +1,5 @@
|
|||
#![crate_name = "foo"]
|
||||
|
||||
// @has foo/fn.f.html
|
||||
// @has - '//*[@class="rust fn"]' 'pub fn f(0u8 ...255: u8)'
|
||||
pub fn f(0u8...255: u8) {}
|
|
@ -3,6 +3,30 @@
|
|||
extern "rust-call" fn b(_i: i32) {}
|
||||
//~^ ERROR A function with the "rust-call" ABI must take a single non-self argument that is a tuple
|
||||
|
||||
trait Tr {
|
||||
extern "rust-call" fn a();
|
||||
|
||||
extern "rust-call" fn b() {}
|
||||
//~^ ERROR A function with the "rust-call" ABI must take a single non-self argument
|
||||
}
|
||||
|
||||
struct Foo;
|
||||
|
||||
impl Foo {
|
||||
extern "rust-call" fn bar() {}
|
||||
//~^ ERROR A function with the "rust-call" ABI must take a single non-self argument
|
||||
}
|
||||
|
||||
impl Tr for Foo {
|
||||
extern "rust-call" fn a() {}
|
||||
//~^ ERROR A function with the "rust-call" ABI must take a single non-self argument
|
||||
}
|
||||
|
||||
fn main () {
|
||||
b(10);
|
||||
|
||||
Foo::bar();
|
||||
|
||||
<Foo as Tr>::a();
|
||||
<Foo as Tr>::b();
|
||||
}
|
||||
|
|
|
@ -4,5 +4,23 @@ error: A function with the "rust-call" ABI must take a single non-self argument
|
|||
LL | extern "rust-call" fn b(_i: i32) {}
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
|
||||
error: aborting due to previous error
|
||||
error: A function with the "rust-call" ABI must take a single non-self argument that is a tuple
|
||||
--> $DIR/issue-22565-rust-call.rs:9:5
|
||||
|
|
||||
LL | extern "rust-call" fn b() {}
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
|
||||
error: A function with the "rust-call" ABI must take a single non-self argument that is a tuple
|
||||
--> $DIR/issue-22565-rust-call.rs:16:5
|
||||
|
|
||||
LL | extern "rust-call" fn bar() {}
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
|
||||
error: A function with the "rust-call" ABI must take a single non-self argument that is a tuple
|
||||
--> $DIR/issue-22565-rust-call.rs:21:5
|
||||
|
|
||||
LL | extern "rust-call" fn a() {}
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
|
||||
error: aborting due to 4 previous errors
|
||||
|
||||
|
|
Loading…
Reference in a new issue