Rollup merge of #108723 - notriddle:notriddle/where-clause, r=GuillaumeGomez
rustdoc: function signature search with traits in `where` clause ## Before ![image](https://user-images.githubusercontent.com/1593513/222873534-a640a72a-c654-4702-9f3b-175129d9591d.png) ## After ![image](https://user-images.githubusercontent.com/1593513/222873544-fdfc431d-2b65-4b56-bede-0302ea9f153a.png)
This commit is contained in:
commit
9cabc40ab1
@ -7,9 +7,7 @@
|
||||
use serde::ser::{Serialize, SerializeStruct, Serializer};
|
||||
|
||||
use crate::clean;
|
||||
use crate::clean::types::{
|
||||
FnRetTy, Function, GenericBound, Generics, ItemId, Type, WherePredicate,
|
||||
};
|
||||
use crate::clean::types::{FnRetTy, Function, Generics, ItemId, Type, WherePredicate};
|
||||
use crate::formats::cache::{Cache, OrphanImplItem};
|
||||
use crate::formats::item_type::ItemType;
|
||||
use crate::html::format::join_with_double_colon;
|
||||
@ -482,29 +480,23 @@ fn insert_ty(res: &mut Vec<RenderType>, ty: Type, mut generics: Vec<RenderType>)
|
||||
if let Type::Generic(arg_s) = *arg {
|
||||
// First we check if the bounds are in a `where` predicate...
|
||||
if let Some(where_pred) = generics.where_predicates.iter().find(|g| match g {
|
||||
WherePredicate::BoundPredicate { ty, .. } => ty.def_id(cache) == arg.def_id(cache),
|
||||
WherePredicate::BoundPredicate { ty: Type::Generic(ty_s), .. } => *ty_s == arg_s,
|
||||
_ => false,
|
||||
}) {
|
||||
let mut ty_generics = Vec::new();
|
||||
let bounds = where_pred.get_bounds().unwrap_or_else(|| &[]);
|
||||
for bound in bounds.iter() {
|
||||
if let GenericBound::TraitBound(poly_trait, _) = bound {
|
||||
for param_def in poly_trait.generic_params.iter() {
|
||||
match ¶m_def.kind {
|
||||
clean::GenericParamDefKind::Type { default: Some(ty), .. } => {
|
||||
add_generics_and_bounds_as_types(
|
||||
self_,
|
||||
generics,
|
||||
ty,
|
||||
tcx,
|
||||
recurse + 1,
|
||||
&mut ty_generics,
|
||||
cache,
|
||||
)
|
||||
}
|
||||
_ => {}
|
||||
}
|
||||
}
|
||||
if let Some(path) = bound.get_trait_path() {
|
||||
let ty = Type::Path { path };
|
||||
add_generics_and_bounds_as_types(
|
||||
self_,
|
||||
generics,
|
||||
&ty,
|
||||
tcx,
|
||||
recurse + 1,
|
||||
&mut ty_generics,
|
||||
cache,
|
||||
);
|
||||
}
|
||||
}
|
||||
insert_ty(res, arg.clone(), ty_generics);
|
||||
|
7
tests/rustdoc-js-std/option-type-signatures.js
Normal file
7
tests/rustdoc-js-std/option-type-signatures.js
Normal file
@ -0,0 +1,7 @@
|
||||
const QUERY = 'option, fnonce -> option';
|
||||
|
||||
const EXPECTED = {
|
||||
'others': [
|
||||
{ 'path': 'std::option::Option', 'name': 'map' },
|
||||
],
|
||||
};
|
19
tests/rustdoc-js/where-clause.js
Normal file
19
tests/rustdoc-js/where-clause.js
Normal file
@ -0,0 +1,19 @@
|
||||
const QUERY = ['trait<nested>', '-> trait<nested>', 't1, t2'];
|
||||
|
||||
const EXPECTED = [
|
||||
{
|
||||
'in_args': [
|
||||
{ 'path': 'where_clause', 'name': 'abracadabra' },
|
||||
],
|
||||
},
|
||||
{
|
||||
'others': [
|
||||
{ 'path': 'where_clause', 'name': 'alacazam' },
|
||||
],
|
||||
},
|
||||
{
|
||||
'others': [
|
||||
{ 'path': 'where_clause', 'name': 'presto' },
|
||||
],
|
||||
},
|
||||
];
|
16
tests/rustdoc-js/where-clause.rs
Normal file
16
tests/rustdoc-js/where-clause.rs
Normal file
@ -0,0 +1,16 @@
|
||||
pub struct Nested;
|
||||
|
||||
pub trait Trait<T> {
|
||||
fn thank_you(x: T);
|
||||
}
|
||||
|
||||
pub fn abracadabra<X>(_: X) where X: Trait<Nested> {}
|
||||
|
||||
pub fn alacazam<X>() -> X where X: Trait<Nested> {}
|
||||
|
||||
pub trait T1 {}
|
||||
pub trait T2<'a, T> {
|
||||
fn please(_: &'a T);
|
||||
}
|
||||
|
||||
pub fn presto<A, B>(_: A, _: B) where A: T1, B: for <'b> T2<'b, Nested> {}
|
Loading…
Reference in New Issue
Block a user