mirror of
https://github.com/rust-lang/rust.git
synced 2024-11-30 10:45:18 +00:00
Transform const generics if the function uses rustc_legacy_const_generics
This commit is contained in:
parent
9981e56d3b
commit
bd8d7e4a45
@ -749,11 +749,42 @@ fn clean_fn_or_proc_macro(
|
|||||||
} else {
|
} else {
|
||||||
hir::Constness::NotConst
|
hir::Constness::NotConst
|
||||||
};
|
};
|
||||||
|
clean_fn_decl_legacy_const_generics(&mut func, attrs);
|
||||||
FunctionItem(func)
|
FunctionItem(func)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// This is needed to make it more "readable" when documenting functions using
|
||||||
|
/// `rustc_legacy_const_generics`. More information in
|
||||||
|
/// <https://github.com/rust-lang/rust/issues/83167>.
|
||||||
|
fn clean_fn_decl_legacy_const_generics(func: &mut Function, attrs: &[ast::Attribute]) {
|
||||||
|
for meta_item_list in attrs
|
||||||
|
.iter()
|
||||||
|
.filter(|a| a.has_name(sym::rustc_legacy_const_generics))
|
||||||
|
.filter_map(|a| a.meta_item_list())
|
||||||
|
{
|
||||||
|
for (pos, literal) in meta_item_list.iter().filter_map(|meta| meta.literal()).enumerate() {
|
||||||
|
match literal.kind {
|
||||||
|
ast::LitKind::Int(a, _) => {
|
||||||
|
let gen = func.generics.params.remove(0);
|
||||||
|
if let GenericParamDef { name, kind: GenericParamDefKind::Const { ty, .. } } =
|
||||||
|
gen
|
||||||
|
{
|
||||||
|
func.decl
|
||||||
|
.inputs
|
||||||
|
.values
|
||||||
|
.insert(a as _, Argument { name, type_: *ty, is_const: true });
|
||||||
|
} else {
|
||||||
|
panic!("unexpected non const in position {}", pos);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
_ => panic!("invalid arg index"),
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
impl<'a> Clean<Function> for (&'a hir::FnSig<'a>, &'a hir::Generics<'a>, hir::BodyId) {
|
impl<'a> Clean<Function> for (&'a hir::FnSig<'a>, &'a hir::Generics<'a>, hir::BodyId) {
|
||||||
fn clean(&self, cx: &mut DocContext<'_>) -> Function {
|
fn clean(&self, cx: &mut DocContext<'_>) -> Function {
|
||||||
let (generics, decl) = enter_impl_trait(cx, |cx| {
|
let (generics, decl) = enter_impl_trait(cx, |cx| {
|
||||||
@ -779,7 +810,7 @@ impl<'a> Clean<Arguments> for (&'a [hir::Ty<'a>], &'a [Ident]) {
|
|||||||
if name.is_empty() {
|
if name.is_empty() {
|
||||||
name = kw::Underscore;
|
name = kw::Underscore;
|
||||||
}
|
}
|
||||||
Argument { name, type_: ty.clean(cx) }
|
Argument { name, type_: ty.clean(cx), is_const: false }
|
||||||
})
|
})
|
||||||
.collect(),
|
.collect(),
|
||||||
}
|
}
|
||||||
@ -798,6 +829,7 @@ impl<'a> Clean<Arguments> for (&'a [hir::Ty<'a>], hir::BodyId) {
|
|||||||
.map(|(i, ty)| Argument {
|
.map(|(i, ty)| Argument {
|
||||||
name: name_from_pat(body.params[i].pat),
|
name: name_from_pat(body.params[i].pat),
|
||||||
type_: ty.clean(cx),
|
type_: ty.clean(cx),
|
||||||
|
is_const: false,
|
||||||
})
|
})
|
||||||
.collect(),
|
.collect(),
|
||||||
}
|
}
|
||||||
@ -828,6 +860,7 @@ impl<'tcx> Clean<FnDecl> for (DefId, ty::PolyFnSig<'tcx>) {
|
|||||||
.map(|t| Argument {
|
.map(|t| Argument {
|
||||||
type_: t.clean(cx),
|
type_: t.clean(cx),
|
||||||
name: names.next().map_or(kw::Empty, |i| i.name),
|
name: names.next().map_or(kw::Empty, |i| i.name),
|
||||||
|
is_const: false,
|
||||||
})
|
})
|
||||||
.collect(),
|
.collect(),
|
||||||
},
|
},
|
||||||
|
@ -1353,6 +1353,9 @@ crate struct Arguments {
|
|||||||
crate struct Argument {
|
crate struct Argument {
|
||||||
crate type_: Type,
|
crate type_: Type,
|
||||||
crate name: Symbol,
|
crate name: Symbol,
|
||||||
|
/// This field is used to represent "const" arguments from the `rustc_legacy_const_generics`
|
||||||
|
/// feature. More information in <https://github.com/rust-lang/rust/issues/83167>.
|
||||||
|
crate is_const: bool,
|
||||||
}
|
}
|
||||||
|
|
||||||
#[derive(Clone, PartialEq, Debug)]
|
#[derive(Clone, PartialEq, Debug)]
|
||||||
|
@ -1177,6 +1177,10 @@ impl clean::FnDecl {
|
|||||||
args.push_str(" <br>");
|
args.push_str(" <br>");
|
||||||
args_plain.push(' ');
|
args_plain.push(' ');
|
||||||
}
|
}
|
||||||
|
if input.is_const {
|
||||||
|
args.push_str("const ");
|
||||||
|
args_plain.push_str("const ");
|
||||||
|
}
|
||||||
if !input.name.is_empty() {
|
if !input.name.is_empty() {
|
||||||
args.push_str(&format!("{}: ", input.name));
|
args.push_str(&format!("{}: ", input.name));
|
||||||
args_plain.push_str(&format!("{}: ", input.name));
|
args_plain.push_str(&format!("{}: ", input.name));
|
||||||
|
Loading…
Reference in New Issue
Block a user