rustdoc: simplify clean
by removing FnRetTy
The default fn ret ty is always unit. Just use that.
Looking back at the time when `FnRetTy` (then called
`FunctionRetTy`) was first added to rustdoc, it seems to originally
be there because `-> !` was a special form: the never type didn't
exist back then.
eb01b17b06 (diff-384affc1b4190940f114f3fcebbf969e7e18657a71ef9001da6b223a036687d9L921-L924)
This commit is contained in:
parent
a9251b6ce1
commit
1862fcb1df
@ -1111,8 +1111,8 @@ fn clean_fn_decl_with_args<'tcx>(
|
|||||||
args: Arguments,
|
args: Arguments,
|
||||||
) -> FnDecl {
|
) -> FnDecl {
|
||||||
let output = match decl.output {
|
let output = match decl.output {
|
||||||
hir::FnRetTy::Return(typ) => Return(clean_ty(typ, cx)),
|
hir::FnRetTy::Return(typ) => clean_ty(typ, cx),
|
||||||
hir::FnRetTy::DefaultReturn(..) => DefaultReturn,
|
hir::FnRetTy::DefaultReturn(..) => Type::Tuple(Vec::new()),
|
||||||
};
|
};
|
||||||
FnDecl { inputs: args, output, c_variadic: decl.c_variadic }
|
FnDecl { inputs: args, output, c_variadic: decl.c_variadic }
|
||||||
}
|
}
|
||||||
@ -1126,10 +1126,7 @@ fn clean_fn_decl_from_did_and_sig<'tcx>(
|
|||||||
|
|
||||||
// We assume all empty tuples are default return type. This theoretically can discard `-> ()`,
|
// We assume all empty tuples are default return type. This theoretically can discard `-> ()`,
|
||||||
// but shouldn't change any code meaning.
|
// but shouldn't change any code meaning.
|
||||||
let output = match clean_middle_ty(sig.output(), cx, None) {
|
let output = clean_middle_ty(sig.output(), cx, None);
|
||||||
Type::Tuple(inner) if inner.is_empty() => DefaultReturn,
|
|
||||||
ty => Return(ty),
|
|
||||||
};
|
|
||||||
|
|
||||||
FnDecl {
|
FnDecl {
|
||||||
output,
|
output,
|
||||||
|
@ -42,7 +42,6 @@ use crate::formats::item_type::ItemType;
|
|||||||
use crate::html::render::Context;
|
use crate::html::render::Context;
|
||||||
use crate::passes::collect_intra_doc_links::UrlFragment;
|
use crate::passes::collect_intra_doc_links::UrlFragment;
|
||||||
|
|
||||||
pub(crate) use self::FnRetTy::*;
|
|
||||||
pub(crate) use self::ItemKind::*;
|
pub(crate) use self::ItemKind::*;
|
||||||
pub(crate) use self::SelfTy::*;
|
pub(crate) use self::SelfTy::*;
|
||||||
pub(crate) use self::Type::{
|
pub(crate) use self::Type::{
|
||||||
@ -1353,7 +1352,7 @@ pub(crate) struct Function {
|
|||||||
#[derive(Clone, PartialEq, Eq, Debug, Hash)]
|
#[derive(Clone, PartialEq, Eq, Debug, Hash)]
|
||||||
pub(crate) struct FnDecl {
|
pub(crate) struct FnDecl {
|
||||||
pub(crate) inputs: Arguments,
|
pub(crate) inputs: Arguments,
|
||||||
pub(crate) output: FnRetTy,
|
pub(crate) output: Type,
|
||||||
pub(crate) c_variadic: bool,
|
pub(crate) c_variadic: bool,
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1371,18 +1370,16 @@ impl FnDecl {
|
|||||||
///
|
///
|
||||||
/// This function will panic if the return type does not match the expected sugaring for async
|
/// This function will panic if the return type does not match the expected sugaring for async
|
||||||
/// functions.
|
/// functions.
|
||||||
pub(crate) fn sugared_async_return_type(&self) -> FnRetTy {
|
pub(crate) fn sugared_async_return_type(&self) -> Type {
|
||||||
match &self.output {
|
if let Type::ImplTrait(v) = &self.output &&
|
||||||
FnRetTy::Return(Type::ImplTrait(bounds)) => match &bounds[0] {
|
let [GenericBound::TraitBound(PolyTrait { trait_, .. }, _ )] = &v[..]
|
||||||
GenericBound::TraitBound(PolyTrait { trait_, .. }, ..) => {
|
{
|
||||||
let bindings = trait_.bindings().unwrap();
|
let bindings = trait_.bindings().unwrap();
|
||||||
let ret_ty = bindings[0].term();
|
let ret_ty = bindings[0].term();
|
||||||
let ty = ret_ty.ty().expect("Unexpected constant return term");
|
let ty = ret_ty.ty().expect("Unexpected constant return term");
|
||||||
FnRetTy::Return(ty.clone())
|
ty.clone()
|
||||||
}
|
} else {
|
||||||
_ => panic!("unexpected desugaring of async function"),
|
panic!("unexpected desugaring of async function")
|
||||||
},
|
|
||||||
_ => panic!("unexpected desugaring of async function"),
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -1425,21 +1422,6 @@ impl Argument {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
#[derive(Clone, PartialEq, Eq, Debug, Hash)]
|
|
||||||
pub(crate) enum FnRetTy {
|
|
||||||
Return(Type),
|
|
||||||
DefaultReturn,
|
|
||||||
}
|
|
||||||
|
|
||||||
impl FnRetTy {
|
|
||||||
pub(crate) fn as_return(&self) -> Option<&Type> {
|
|
||||||
match self {
|
|
||||||
Return(ret) => Some(ret),
|
|
||||||
DefaultReturn => None,
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
#[derive(Clone, Debug)]
|
#[derive(Clone, Debug)]
|
||||||
pub(crate) struct Trait {
|
pub(crate) struct Trait {
|
||||||
pub(crate) def_id: DefId,
|
pub(crate) def_id: DefId,
|
||||||
@ -1641,6 +1623,10 @@ impl Type {
|
|||||||
matches!(self, Type::ImplTrait(_))
|
matches!(self, Type::ImplTrait(_))
|
||||||
}
|
}
|
||||||
|
|
||||||
|
pub(crate) fn is_unit(&self) -> bool {
|
||||||
|
matches!(self, Type::Tuple(v) if v.is_empty())
|
||||||
|
}
|
||||||
|
|
||||||
pub(crate) fn projection(&self) -> Option<(&Type, DefId, PathSegment)> {
|
pub(crate) fn projection(&self) -> Option<(&Type, DefId, PathSegment)> {
|
||||||
if let QPath(box QPathData { self_type, trait_, assoc, .. }) = self {
|
if let QPath(box QPathData { self_type, trait_, assoc, .. }) = self {
|
||||||
Some((self_type, trait_.as_ref()?.def_id(), assoc.clone()))
|
Some((self_type, trait_.as_ref()?.def_id(), assoc.clone()))
|
||||||
|
@ -1257,9 +1257,9 @@ impl clean::Impl {
|
|||||||
};
|
};
|
||||||
primitive_link_fragment(f, PrimitiveType::Tuple, &format!("fn ({name}₁, {name}₂, …, {name}ₙ{ellipsis})"), "#trait-implementations-1", cx)?;
|
primitive_link_fragment(f, PrimitiveType::Tuple, &format!("fn ({name}₁, {name}₂, …, {name}ₙ{ellipsis})"), "#trait-implementations-1", cx)?;
|
||||||
// Write output.
|
// Write output.
|
||||||
if let clean::FnRetTy::Return(ty) = &bare_fn.decl.output {
|
if !bare_fn.decl.output.is_unit() {
|
||||||
write!(f, " -> ")?;
|
write!(f, " -> ")?;
|
||||||
fmt_type(ty, f, use_absolute, cx)?;
|
fmt_type(&bare_fn.decl.output, f, use_absolute, cx)?;
|
||||||
}
|
}
|
||||||
} else if let Some(ty) = self.kind.as_blanket_ty() {
|
} else if let Some(ty) = self.kind.as_blanket_ty() {
|
||||||
fmt_type(ty, f, use_absolute, cx)?;
|
fmt_type(ty, f, use_absolute, cx)?;
|
||||||
@ -1296,22 +1296,6 @@ impl clean::Arguments {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
impl clean::FnRetTy {
|
|
||||||
pub(crate) fn print<'a, 'tcx: 'a>(
|
|
||||||
&'a self,
|
|
||||||
cx: &'a Context<'tcx>,
|
|
||||||
) -> impl fmt::Display + 'a + Captures<'tcx> {
|
|
||||||
display_fn(move |f| match self {
|
|
||||||
clean::Return(clean::Tuple(tys)) if tys.is_empty() => Ok(()),
|
|
||||||
clean::Return(ty) if f.alternate() => {
|
|
||||||
write!(f, " -> {:#}", ty.print(cx))
|
|
||||||
}
|
|
||||||
clean::Return(ty) => write!(f, " -> {}", ty.print(cx)),
|
|
||||||
clean::DefaultReturn => Ok(()),
|
|
||||||
})
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
impl clean::BareFunctionDecl {
|
impl clean::BareFunctionDecl {
|
||||||
fn print_hrtb_with_space<'a, 'tcx: 'a>(
|
fn print_hrtb_with_space<'a, 'tcx: 'a>(
|
||||||
&'a self,
|
&'a self,
|
||||||
@ -1366,7 +1350,7 @@ impl clean::FnDecl {
|
|||||||
"({args:#}{ellipsis}){arrow:#}",
|
"({args:#}{ellipsis}){arrow:#}",
|
||||||
args = self.inputs.print(cx),
|
args = self.inputs.print(cx),
|
||||||
ellipsis = ellipsis,
|
ellipsis = ellipsis,
|
||||||
arrow = self.output.print(cx)
|
arrow = self.print_output(cx)
|
||||||
)
|
)
|
||||||
} else {
|
} else {
|
||||||
write!(
|
write!(
|
||||||
@ -1374,7 +1358,7 @@ impl clean::FnDecl {
|
|||||||
"({args}{ellipsis}){arrow}",
|
"({args}{ellipsis}){arrow}",
|
||||||
args = self.inputs.print(cx),
|
args = self.inputs.print(cx),
|
||||||
ellipsis = ellipsis,
|
ellipsis = ellipsis,
|
||||||
arrow = self.output.print(cx)
|
arrow = self.print_output(cx)
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
@ -1464,9 +1448,22 @@ impl clean::FnDecl {
|
|||||||
Some(n) => write!(f, "\n{})", Indent(n))?,
|
Some(n) => write!(f, "\n{})", Indent(n))?,
|
||||||
};
|
};
|
||||||
|
|
||||||
fmt::Display::fmt(&self.output.print(cx), f)?;
|
fmt::Display::fmt(&self.print_output(cx), f)?;
|
||||||
Ok(())
|
Ok(())
|
||||||
}
|
}
|
||||||
|
|
||||||
|
pub(crate) fn print_output<'a, 'tcx: 'a>(
|
||||||
|
&'a self,
|
||||||
|
cx: &'a Context<'tcx>,
|
||||||
|
) -> impl fmt::Display + 'a + Captures<'tcx> {
|
||||||
|
display_fn(move |f| match &self.output {
|
||||||
|
clean::Tuple(tys) if tys.is_empty() => Ok(()),
|
||||||
|
ty if f.alternate() => {
|
||||||
|
write!(f, " -> {:#}", ty.print(cx))
|
||||||
|
}
|
||||||
|
ty => write!(f, " -> {}", ty.print(cx)),
|
||||||
|
})
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
pub(crate) fn visibility_print_with_space<'a, 'tcx: 'a>(
|
pub(crate) fn visibility_print_with_space<'a, 'tcx: 'a>(
|
||||||
|
@ -844,7 +844,7 @@ fn assoc_method(
|
|||||||
+ name.as_str().len()
|
+ name.as_str().len()
|
||||||
+ generics_len;
|
+ generics_len;
|
||||||
|
|
||||||
let notable_traits = d.output.as_return().and_then(|output| notable_traits_button(output, cx));
|
let notable_traits = notable_traits_button(&d.output, cx);
|
||||||
|
|
||||||
let (indent, indent_str, end_newline) = if parent == ItemType::Trait {
|
let (indent, indent_str, end_newline) = if parent == ItemType::Trait {
|
||||||
header_len += 4;
|
header_len += 4;
|
||||||
@ -1282,6 +1282,11 @@ fn should_render_item(item: &clean::Item, deref_mut_: bool, tcx: TyCtxt<'_>) ->
|
|||||||
pub(crate) fn notable_traits_button(ty: &clean::Type, cx: &mut Context<'_>) -> Option<String> {
|
pub(crate) fn notable_traits_button(ty: &clean::Type, cx: &mut Context<'_>) -> Option<String> {
|
||||||
let mut has_notable_trait = false;
|
let mut has_notable_trait = false;
|
||||||
|
|
||||||
|
if ty.is_unit() {
|
||||||
|
// Very common fast path.
|
||||||
|
return None;
|
||||||
|
}
|
||||||
|
|
||||||
let did = ty.def_id(cx.cache())?;
|
let did = ty.def_id(cx.cache())?;
|
||||||
|
|
||||||
// Box has pass-through impls for Read, Write, Iterator, and Future when the
|
// Box has pass-through impls for Read, Write, Iterator, and Future when the
|
||||||
|
@ -587,8 +587,7 @@ fn item_function(w: &mut Buffer, cx: &mut Context<'_>, it: &clean::Item, f: &cle
|
|||||||
+ name.as_str().len()
|
+ name.as_str().len()
|
||||||
+ generics_len;
|
+ generics_len;
|
||||||
|
|
||||||
let notable_traits =
|
let notable_traits = notable_traits_button(&f.decl.output, cx);
|
||||||
f.decl.output.as_return().and_then(|output| notable_traits_button(output, cx));
|
|
||||||
|
|
||||||
wrap_item(w, |w| {
|
wrap_item(w, |w| {
|
||||||
w.reserve(header_len);
|
w.reserve(header_len);
|
||||||
|
@ -7,7 +7,7 @@ use rustc_span::symbol::Symbol;
|
|||||||
use serde::ser::{Serialize, SerializeStruct, Serializer};
|
use serde::ser::{Serialize, SerializeStruct, Serializer};
|
||||||
|
|
||||||
use crate::clean;
|
use crate::clean;
|
||||||
use crate::clean::types::{FnRetTy, Function, Generics, ItemId, Type, WherePredicate};
|
use crate::clean::types::{Function, Generics, ItemId, Type, WherePredicate};
|
||||||
use crate::formats::cache::{Cache, OrphanImplItem};
|
use crate::formats::cache::{Cache, OrphanImplItem};
|
||||||
use crate::formats::item_type::ItemType;
|
use crate::formats::item_type::ItemType;
|
||||||
use crate::html::format::join_with_double_colon;
|
use crate::html::format::join_with_double_colon;
|
||||||
@ -656,22 +656,9 @@ fn get_fn_inputs_and_outputs<'tcx>(
|
|||||||
}
|
}
|
||||||
|
|
||||||
let mut ret_types = Vec::new();
|
let mut ret_types = Vec::new();
|
||||||
match decl.output {
|
add_generics_and_bounds_as_types(self_, generics, &decl.output, tcx, 0, &mut ret_types, cache);
|
||||||
FnRetTy::Return(ref return_type) => {
|
if ret_types.is_empty() {
|
||||||
add_generics_and_bounds_as_types(
|
ret_types.push(get_index_type(&decl.output, vec![]));
|
||||||
self_,
|
}
|
||||||
generics,
|
|
||||||
return_type,
|
|
||||||
tcx,
|
|
||||||
0,
|
|
||||||
&mut ret_types,
|
|
||||||
cache,
|
|
||||||
);
|
|
||||||
if ret_types.is_empty() {
|
|
||||||
ret_types.push(get_index_type(return_type, vec![]));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
_ => {}
|
|
||||||
};
|
|
||||||
(all_types, ret_types)
|
(all_types, ret_types)
|
||||||
}
|
}
|
||||||
|
@ -624,10 +624,7 @@ impl FromWithTcx<clean::FnDecl> for FnDecl {
|
|||||||
.into_iter()
|
.into_iter()
|
||||||
.map(|arg| (arg.name.to_string(), arg.type_.into_tcx(tcx)))
|
.map(|arg| (arg.name.to_string(), arg.type_.into_tcx(tcx)))
|
||||||
.collect(),
|
.collect(),
|
||||||
output: match output {
|
output: if output.is_unit() { None } else { Some(output.into_tcx(tcx)) },
|
||||||
clean::FnRetTy::Return(t) => Some(t.into_tcx(tcx)),
|
|
||||||
clean::FnRetTy::DefaultReturn => None,
|
|
||||||
},
|
|
||||||
c_variadic,
|
c_variadic,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user