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 serde::ser::{Serialize, SerializeStruct, Serializer};
|
||||||
|
|
||||||
use crate::clean;
|
use crate::clean;
|
||||||
use crate::clean::types::{
|
use crate::clean::types::{FnRetTy, Function, Generics, ItemId, Type, WherePredicate};
|
||||||
FnRetTy, Function, GenericBound, 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;
|
||||||
@ -482,29 +480,23 @@ fn insert_ty(res: &mut Vec<RenderType>, ty: Type, mut generics: Vec<RenderType>)
|
|||||||
if let Type::Generic(arg_s) = *arg {
|
if let Type::Generic(arg_s) = *arg {
|
||||||
// First we check if the bounds are in a `where` predicate...
|
// First we check if the bounds are in a `where` predicate...
|
||||||
if let Some(where_pred) = generics.where_predicates.iter().find(|g| match g {
|
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,
|
_ => false,
|
||||||
}) {
|
}) {
|
||||||
let mut ty_generics = Vec::new();
|
let mut ty_generics = Vec::new();
|
||||||
let bounds = where_pred.get_bounds().unwrap_or_else(|| &[]);
|
let bounds = where_pred.get_bounds().unwrap_or_else(|| &[]);
|
||||||
for bound in bounds.iter() {
|
for bound in bounds.iter() {
|
||||||
if let GenericBound::TraitBound(poly_trait, _) = bound {
|
if let Some(path) = bound.get_trait_path() {
|
||||||
for param_def in poly_trait.generic_params.iter() {
|
let ty = Type::Path { path };
|
||||||
match ¶m_def.kind {
|
add_generics_and_bounds_as_types(
|
||||||
clean::GenericParamDefKind::Type { default: Some(ty), .. } => {
|
self_,
|
||||||
add_generics_and_bounds_as_types(
|
generics,
|
||||||
self_,
|
&ty,
|
||||||
generics,
|
tcx,
|
||||||
ty,
|
recurse + 1,
|
||||||
tcx,
|
&mut ty_generics,
|
||||||
recurse + 1,
|
cache,
|
||||||
&mut ty_generics,
|
);
|
||||||
cache,
|
|
||||||
)
|
|
||||||
}
|
|
||||||
_ => {}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
insert_ty(res, arg.clone(), ty_generics);
|
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