Skip to content
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.

Commit 1d47366

Browse files
committedSep 24, 2024·
rustdoc-search: show types signatures in results
1 parent 6e6a0b1 commit 1d47366

File tree

10 files changed

+995
-126
lines changed

10 files changed

+995
-126
lines changed
 

‎src/librustdoc/html/static/css/rustdoc.css

Lines changed: 16 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -260,6 +260,7 @@ a.anchor,
260260
.mobile-topbar h2 a,
261261
h1 a,
262262
.search-results a,
263+
.search-results li,
263264
.stab,
264265
.result-name i {
265266
color: var(--main-color);
@@ -375,7 +376,7 @@ details:not(.toggle) summary {
375376
margin-bottom: .6em;
376377
}
377378

378-
code, pre, .code-header {
379+
code, pre, .code-header, .type-signature {
379380
font-family: "Source Code Pro", monospace;
380381
}
381382
.docblock code, .docblock-short code {
@@ -1189,22 +1190,28 @@ so that we can apply CSS-filters to change the arrow color in themes */
11891190

11901191
.search-results.active {
11911192
display: block;
1193+
margin: 0;
1194+
padding: 0;
11921195
}
11931196

11941197
.search-results > a {
1195-
display: flex;
1198+
display: grid;
1199+
grid-template-areas:
1200+
"search-result-name search-result-desc"
1201+
"search-result-type-signature search-result-type-signature";
1202+
grid-template-columns: .6fr .4fr;
11961203
/* A little margin ensures the browser's outlining of focused links has room to display. */
11971204
margin-left: 2px;
11981205
margin-right: 2px;
11991206
border-bottom: 1px solid var(--search-result-border-color);
1200-
gap: 1em;
1207+
column-gap: 1em;
12011208
}
12021209

12031210
.search-results > a > div.desc {
12041211
white-space: nowrap;
12051212
text-overflow: ellipsis;
12061213
overflow: hidden;
1207-
flex: 2;
1214+
grid-area: search-result-desc;
12081215
}
12091216

12101217
.search-results a:hover,
@@ -1216,7 +1223,7 @@ so that we can apply CSS-filters to change the arrow color in themes */
12161223
display: flex;
12171224
align-items: center;
12181225
justify-content: start;
1219-
flex: 3;
1226+
grid-area: search-result-name;
12201227
}
12211228
.search-results .result-name .alias {
12221229
color: var(--search-results-alias-color);
@@ -1237,6 +1244,10 @@ so that we can apply CSS-filters to change the arrow color in themes */
12371244
.search-results .result-name .path > * {
12381245
display: inline;
12391246
}
1247+
.search-results .type-signature {
1248+
grid-area: search-result-type-signature;
1249+
white-space: pre-wrap;
1250+
}
12401251

12411252
.popover {
12421253
position: absolute;

‎src/librustdoc/html/static/js/externs.js

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -92,6 +92,9 @@ let Results;
9292
* parent: (Object|undefined),
9393
* path: string,
9494
* ty: number,
95+
* type: FunctionSearchType?,
96+
* displayType: Promise<Array<Array<string>>>|null,
97+
* displayTypeMappedNames: Promise<Array<[string, Array<string>]>>|null,
9598
* }}
9699
*/
97100
let ResultObject;

‎src/librustdoc/html/static/js/search.js

Lines changed: 608 additions & 80 deletions
Large diffs are not rendered by default.

‎src/tools/rustdoc-js/tester.js

Lines changed: 43 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,14 @@
22
const fs = require("fs");
33
const path = require("path");
44

5+
6+
function arrayToCode(array) {
7+
return array.map((value, index) => {
8+
value = value.split("&nbsp;").join(" ");
9+
return (index % 2 === 1) ? ("`" + value + "`") : value;
10+
}).join("");
11+
}
12+
513
function loadContent(content) {
614
const Module = module.constructor;
715
const m = new Module();
@@ -180,15 +188,7 @@ function valueCheck(fullPath, expected, result, error_text, queryName) {
180188
if (!result_v.forEach) {
181189
throw result_v;
182190
}
183-
result_v.forEach((value, index) => {
184-
value = value.split("&nbsp;").join(" ");
185-
if (index % 2 === 1) {
186-
result_v[index] = "`" + value + "`";
187-
} else {
188-
result_v[index] = value;
189-
}
190-
});
191-
result_v = result_v.join("");
191+
result_v = arrayToCode(result_v);
192192
}
193193
const obj_path = fullPath + (fullPath.length > 0 ? "." : "") + key;
194194
valueCheck(obj_path, expected[key], result_v, error_text, queryName);
@@ -436,9 +436,41 @@ function loadSearchJS(doc_folder, resource_suffix) {
436436
searchModule.initSearch(searchIndex.searchIndex);
437437
const docSearch = searchModule.docSearch;
438438
return {
439-
doSearch: function(queryStr, filterCrate, currentCrate) {
440-
return docSearch.execQuery(searchModule.parseQuery(queryStr),
439+
doSearch: async function(queryStr, filterCrate, currentCrate) {
440+
const result = await docSearch.execQuery(searchModule.parseQuery(queryStr),
441441
filterCrate, currentCrate);
442+
for (const tab in result) {
443+
if (!Object.prototype.hasOwnProperty.call(result, tab)) {
444+
continue;
445+
}
446+
if (!(result[tab] instanceof Array)) {
447+
continue;
448+
}
449+
for (const entry of result[tab]) {
450+
for (const key in entry) {
451+
if (!Object.prototype.hasOwnProperty.call(entry, key)) {
452+
continue;
453+
}
454+
if (key === "displayTypeSignature") {
455+
const {type, mappedNames, whereClause} =
456+
await entry.displayTypeSignature;
457+
entry.displayType = arrayToCode(type);
458+
entry.displayMappedNames = [...mappedNames.entries()]
459+
.map(([name, qname]) => {
460+
return `${name} = ${qname}`;
461+
}).join(", ");
462+
entry.displayWhereClause = [...whereClause.entries()]
463+
.flatMap(([name, value]) => {
464+
if (value.length === 0) {
465+
return [];
466+
}
467+
return [`${name}: ${arrayToCode(value)}`];
468+
}).join(", ");
469+
}
470+
}
471+
}
472+
}
473+
return result;
442474
},
443475
getCorrections: function(queryStr, filterCrate, currentCrate) {
444476
const parsedQuery = searchModule.parseQuery(queryStr);
Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,42 @@
1+
// Check the "About this Result" popover.
2+
// Try a complex result.
3+
go-to: "file://" + |DOC_PATH| + "/lib2/index.html?search=scroll_traits::Iterator<T>,(T->bool)->(Extend<T>,Extend<T>)"
4+
5+
// These two commands are used to be sure the search will be run.
6+
focus: ".search-input"
7+
press-key: "Enter"
8+
9+
wait-for: "#search-tabs"
10+
assert-count: ("#search-tabs button", 1)
11+
assert-count: (".search-results > a", 1)
12+
13+
assert: "//div[@class='type-signature']/strong[text()='Iterator']"
14+
assert: "//div[@class='type-signature']/strong[text()='(']"
15+
assert: "//div[@class='type-signature']/strong[text()=')']"
16+
17+
assert: "//div[@class='type-signature']/div[@class='where']/strong[text()='FnMut']"
18+
assert: "//div[@class='type-signature']/div[@class='where']/strong[text()='Iterator::Item']"
19+
assert: "//div[@class='type-signature']/div[@class='where']/strong[text()='bool']"
20+
assert: "//div[@class='type-signature']/div[@class='where']/strong[text()='Extend']"
21+
22+
assert-text: ("div.type-signature div.where:nth-child(4)", "where")
23+
assert-text: ("div.type-signature div.where:nth-child(5)", " T matches Iterator::Item")
24+
assert-text: ("div.type-signature div.where:nth-child(6)", " F: FnMut (&Iterator::Item) -> bool")
25+
assert-text: ("div.type-signature div.where:nth-child(7)", " B: Default + Extend<Iterator::Item>")
26+
27+
// Try a simple result that *won't* give an info box.
28+
go-to: "file://" + |DOC_PATH| + "/lib2/index.html?search=F->lib2::WhereWhitespace<T>"
29+
30+
// These two commands are used to be sure the search will be run.
31+
focus: ".search-input"
32+
press-key: "Enter"
33+
34+
wait-for: "#search-tabs"
35+
assert-text: ("//div[@class='type-signature']", "F -> WhereWhitespace<T>")
36+
assert-count: ("#search-tabs button", 1)
37+
assert-count: (".search-results > a", 1)
38+
assert-count: ("//div[@class='type-signature']/div[@class='where']", 0)
39+
40+
assert: "//div[@class='type-signature']/strong[text()='F']"
41+
assert: "//div[@class='type-signature']/strong[text()='WhereWhitespace']"
42+
assert: "//div[@class='type-signature']/strong[text()='T']"

‎tests/rustdoc-js-std/option-type-signatures.js

Lines changed: 156 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -6,79 +6,217 @@ const EXPECTED = [
66
{
77
'query': 'option, fnonce -> option',
88
'others': [
9-
{ 'path': 'std::option::Option', 'name': 'map' },
9+
{
10+
'path': 'std::option::Option',
11+
'name': 'map',
12+
'displayType': '`Option`<T>, F -> `Option`<U>',
13+
'displayWhereClause': "F: `FnOnce` (T) -> U",
14+
},
15+
],
16+
},
17+
{
18+
'query': 'option<t>, fnonce -> option',
19+
'others': [
20+
{
21+
'path': 'std::option::Option',
22+
'name': 'map',
23+
'displayType': '`Option`<`T`>, F -> `Option`<U>',
24+
'displayWhereClause': "F: `FnOnce` (T) -> U",
25+
},
1026
],
1127
},
1228
{
1329
'query': 'option -> default',
1430
'others': [
15-
{ 'path': 'std::option::Option', 'name': 'unwrap_or_default' },
16-
{ 'path': 'std::option::Option', 'name': 'get_or_insert_default' },
31+
{
32+
'path': 'std::option::Option',
33+
'name': 'unwrap_or_default',
34+
'displayType': '`Option`<T> -> `T`',
35+
'displayWhereClause': "T: `Default`",
36+
},
37+
{
38+
'path': 'std::option::Option',
39+
'name': 'get_or_insert_default',
40+
'displayType': '&mut `Option`<T> -> &mut `T`',
41+
'displayWhereClause': "T: `Default`",
42+
},
1743
],
1844
},
1945
{
2046
'query': 'option -> []',
2147
'others': [
22-
{ 'path': 'std::option::Option', 'name': 'as_slice' },
23-
{ 'path': 'std::option::Option', 'name': 'as_mut_slice' },
48+
{
49+
'path': 'std::option::Option',
50+
'name': 'as_slice',
51+
'displayType': '&`Option`<T> -> &`[`T`]`',
52+
},
53+
{
54+
'path': 'std::option::Option',
55+
'name': 'as_mut_slice',
56+
'displayType': '&mut `Option`<T> -> &mut `[`T`]`',
57+
},
2458
],
2559
},
2660
{
2761
'query': 'option<t>, option<t> -> option<t>',
2862
'others': [
29-
{ 'path': 'std::option::Option', 'name': 'or' },
30-
{ 'path': 'std::option::Option', 'name': 'xor' },
63+
{
64+
'path': 'std::option::Option',
65+
'name': 'or',
66+
'displayType': '`Option`<`T`>, `Option`<`T`> -> `Option`<`T`>',
67+
},
68+
{
69+
'path': 'std::option::Option',
70+
'name': 'xor',
71+
'displayType': '`Option`<`T`>, `Option`<`T`> -> `Option`<`T`>',
72+
},
3173
],
3274
},
3375
{
3476
'query': 'option<t>, option<u> -> option<u>',
3577
'others': [
36-
{ 'path': 'std::option::Option', 'name': 'and' },
37-
{ 'path': 'std::option::Option', 'name': 'zip' },
78+
{
79+
'path': 'std::option::Option',
80+
'name': 'and',
81+
'displayType': '`Option`<`T`>, `Option`<`U`> -> `Option`<`U`>',
82+
},
83+
{
84+
'path': 'std::option::Option',
85+
'name': 'zip',
86+
'displayType': '`Option`<`T`>, `Option`<`U`> -> `Option`<(T, `U`)>',
87+
},
3888
],
3989
},
4090
{
4191
'query': 'option<t>, option<u> -> option<t>',
4292
'others': [
43-
{ 'path': 'std::option::Option', 'name': 'and' },
44-
{ 'path': 'std::option::Option', 'name': 'zip' },
93+
{
94+
'path': 'std::option::Option',
95+
'name': 'and',
96+
'displayType': '`Option`<`T`>, `Option`<`U`> -> `Option`<`U`>',
97+
},
98+
{
99+
'path': 'std::option::Option',
100+
'name': 'zip',
101+
'displayType': '`Option`<`T`>, `Option`<`U`> -> `Option`<(`T`, U)>',
102+
},
45103
],
46104
},
47105
{
48106
'query': 'option<t>, option<u> -> option<t, u>',
49107
'others': [
50-
{ 'path': 'std::option::Option', 'name': 'zip' },
108+
{
109+
'path': 'std::option::Option',
110+
'name': 'zip',
111+
'displayType': '`Option`<`T`>, `Option`<`U`> -> `Option`<(`T`, `U`)>',
112+
},
51113
],
52114
},
53115
{
54116
'query': 'option<t>, e -> result<t, e>',
55117
'others': [
56-
{ 'path': 'std::option::Option', 'name': 'ok_or' },
57-
{ 'path': 'std::result::Result', 'name': 'transpose' },
118+
{
119+
'path': 'std::option::Option',
120+
'name': 'ok_or',
121+
'displayType': '`Option`<`T`>, `E` -> `Result`<`T`, `E`>',
122+
},
123+
{
124+
'path': 'std::result::Result',
125+
'name': 'transpose',
126+
'displayType': 'Result<`Option`<`T`>, `E`> -> Option<`Result`<`T`, `E`>>',
127+
},
58128
],
59129
},
60130
{
61131
'query': 'result<option<t>, e> -> option<result<t, e>>',
62132
'others': [
63-
{ 'path': 'std::result::Result', 'name': 'transpose' },
133+
{
134+
'path': 'std::result::Result',
135+
'name': 'transpose',
136+
'displayType': '`Result`<`Option`<`T`>, `E`> -> `Option`<`Result`<`T`, `E`>>',
137+
},
64138
],
65139
},
66140
{
67141
'query': 'option<t>, option<t> -> bool',
68142
'others': [
69-
{ 'path': 'std::option::Option', 'name': 'eq' },
143+
{
144+
'path': 'std::option::Option',
145+
'name': 'eq',
146+
'displayType': '&`Option`<`T`>, &`Option`<`T`> -> `bool`',
147+
},
70148
],
71149
},
72150
{
73151
'query': 'option<option<t>> -> option<t>',
74152
'others': [
75-
{ 'path': 'std::option::Option', 'name': 'flatten' },
153+
{
154+
'path': 'std::option::Option',
155+
'name': 'flatten',
156+
'displayType': '`Option`<`Option`<`T`>> -> `Option`<`T`>',
157+
},
76158
],
77159
},
78160
{
79161
'query': 'option<t>',
80162
'returned': [
81-
{ 'path': 'std::result::Result', 'name': 'ok' },
163+
{
164+
'path': 'std::result::Result',
165+
'name': 'ok',
166+
'displayType': 'Result<T, E> -> `Option`<`T`>',
167+
},
168+
],
169+
},
170+
{
171+
'query': 'option<t>, (fnonce () -> u) -> option',
172+
'others': [
173+
{
174+
'path': 'std::option::Option',
175+
'name': 'map',
176+
'displayType': '`Option`<`T`>, F -> `Option`<U>',
177+
'displayMappedNames': `T = t, U = u`,
178+
'displayWhereClause': "F: `FnOnce` (T) -> `U`",
179+
},
180+
{
181+
'path': 'std::option::Option',
182+
'name': 'and_then',
183+
'displayType': '`Option`<`T`>, F -> `Option`<U>',
184+
'displayMappedNames': `T = t, U = u`,
185+
'displayWhereClause': "F: `FnOnce` (T) -> Option<`U`>",
186+
},
187+
{
188+
'path': 'std::option::Option',
189+
'name': 'zip_with',
190+
'displayType': 'Option<T>, `Option`<`U`>, F -> `Option`<R>',
191+
'displayMappedNames': `U = t, R = u`,
192+
'displayWhereClause': "F: `FnOnce` (T, U) -> `R`",
193+
},
194+
{
195+
'path': 'std::task::Poll',
196+
'name': 'map_ok',
197+
'displayType': 'Poll<`Option`<Result<`T`, E>>>, F -> Poll<`Option`<Result<U, E>>>',
198+
'displayMappedNames': `T = t, U = u`,
199+
'displayWhereClause': "F: `FnOnce` (T) -> `U`",
200+
},
201+
{
202+
'path': 'std::task::Poll',
203+
'name': 'map_err',
204+
'displayType': 'Poll<`Option`<Result<`T`, E>>>, F -> Poll<`Option`<Result<T, U>>>',
205+
'displayMappedNames': `T = t, U = u`,
206+
'displayWhereClause': "F: `FnOnce` (E) -> `U`",
207+
},
208+
],
209+
},
210+
{
211+
'query': 'option<t>, (fnonce () -> option<u>) -> option',
212+
'others': [
213+
{
214+
'path': 'std::option::Option',
215+
'name': 'and_then',
216+
'displayType': '`Option`<`T`>, F -> `Option`<U>',
217+
'displayMappedNames': `T = t, U = u`,
218+
'displayWhereClause': "F: `FnOnce` (T) -> `Option`<`U`>",
219+
},
82220
],
83221
},
84222
];
Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,39 @@
1+
// exact-check
2+
3+
const EXPECTED = [
4+
// Trait-associated types (that is, associated types with no constraints)
5+
// are treated like type parameters, so that you can "pattern match"
6+
// them. We should avoid redundant output (no `Item=MyIter::Item` stuff)
7+
// and should give reasonable results
8+
{
9+
'query': 'MyIter<T> -> Option<T>',
10+
'correction': null,
11+
'others': [
12+
{
13+
'path': 'assoc_type_unbound::MyIter',
14+
'name': 'next',
15+
'displayType': '&mut `MyIter` -> `Option`<`MyIter::Item`>',
16+
'displayMappedNames': 'MyIter::Item = T',
17+
'displayWhereClause': '',
18+
},
19+
],
20+
},
21+
{
22+
'query': 'MyIter<Item=T> -> Option<T>',
23+
'correction': null,
24+
'others': [
25+
{
26+
'path': 'assoc_type_unbound::MyIter',
27+
'name': 'next',
28+
'displayType': '&mut `MyIter` -> `Option`<`MyIter::Item`>',
29+
'displayMappedNames': 'MyIter::Item = T',
30+
'displayWhereClause': '',
31+
},
32+
],
33+
},
34+
{
35+
'query': 'MyIter<T> -> Option<Item=T>',
36+
'correction': null,
37+
'others': [],
38+
},
39+
];
Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
pub trait MyIter {
2+
type Item;
3+
fn next(&mut self) -> Option<Self::Item>;
4+
}

‎tests/rustdoc-js/assoc-type.js

Lines changed: 42 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -7,16 +7,40 @@ const EXPECTED = [
77
'query': 'iterator<something> -> u32',
88
'correction': null,
99
'others': [
10-
{ 'path': 'assoc_type::my', 'name': 'other_fn' },
11-
{ 'path': 'assoc_type', 'name': 'my_fn' },
10+
{
11+
'path': 'assoc_type::my',
12+
'name': 'other_fn',
13+
'displayType': 'X -> `u32`',
14+
'displayMappedNames': '',
15+
'displayWhereClause': 'X: `Iterator`<`Something`>',
16+
},
17+
{
18+
'path': 'assoc_type',
19+
'name': 'my_fn',
20+
'displayType': 'X -> `u32`',
21+
'displayMappedNames': '',
22+
'displayWhereClause': 'X: `Iterator`<Item=`Something`>',
23+
},
1224
],
1325
},
1426
{
1527
'query': 'iterator<something>',
1628
'correction': null,
1729
'in_args': [
18-
{ 'path': 'assoc_type::my', 'name': 'other_fn' },
19-
{ 'path': 'assoc_type', 'name': 'my_fn' },
30+
{
31+
'path': 'assoc_type::my',
32+
'name': 'other_fn',
33+
'displayType': 'X -> u32',
34+
'displayMappedNames': '',
35+
'displayWhereClause': 'X: `Iterator`<`Something`>',
36+
},
37+
{
38+
'path': 'assoc_type',
39+
'name': 'my_fn',
40+
'displayType': 'X -> u32',
41+
'displayMappedNames': '',
42+
'displayWhereClause': 'X: `Iterator`<Item=`Something`>',
43+
},
2044
],
2145
},
2246
{
@@ -26,8 +50,20 @@ const EXPECTED = [
2650
{ 'path': 'assoc_type', 'name': 'Something' },
2751
],
2852
'in_args': [
29-
{ 'path': 'assoc_type::my', 'name': 'other_fn' },
30-
{ 'path': 'assoc_type', 'name': 'my_fn' },
53+
{
54+
'path': 'assoc_type::my',
55+
'name': 'other_fn',
56+
'displayType': '`X` -> u32',
57+
'displayMappedNames': '',
58+
'displayWhereClause': 'X: Iterator<`Something`>',
59+
},
60+
{
61+
'path': 'assoc_type',
62+
'name': 'my_fn',
63+
'displayType': '`X` -> u32',
64+
'displayMappedNames': '',
65+
'displayWhereClause': 'X: Iterator<Item=`Something`>',
66+
},
3167
],
3268
},
3369
// if I write an explicit binding, only it shows up

‎tests/rustdoc-js/generics-trait.js

Lines changed: 42 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -5,10 +5,22 @@ const EXPECTED = [
55
'query': 'Result<SomeTrait>',
66
'correction': null,
77
'in_args': [
8-
{ 'path': 'generics_trait', 'name': 'beta' },
8+
{
9+
'path': 'generics_trait',
10+
'name': 'beta',
11+
'displayType': '`Result`<`T`, ()> -> ()',
12+
'displayMappedNames': '',
13+
'displayWhereClause': 'T: `SomeTrait`',
14+
},
915
],
1016
'returned': [
11-
{ 'path': 'generics_trait', 'name': 'bet' },
17+
{
18+
'path': 'generics_trait',
19+
'name': 'bet',
20+
'displayType': ' -> `Result`<`T`, ()>',
21+
'displayMappedNames': '',
22+
'displayWhereClause': 'T: `SomeTrait`',
23+
},
1224
],
1325
},
1426
{
@@ -25,20 +37,44 @@ const EXPECTED = [
2537
'query': 'OtherThingxxxxxxxx',
2638
'correction': null,
2739
'in_args': [
28-
{ 'path': 'generics_trait', 'name': 'alpha' },
40+
{
41+
'path': 'generics_trait',
42+
'name': 'alpha',
43+
'displayType': 'Result<`T`, ()> -> ()',
44+
'displayMappedNames': '',
45+
'displayWhereClause': 'T: `OtherThingxxxxxxxx`',
46+
},
2947
],
3048
'returned': [
31-
{ 'path': 'generics_trait', 'name': 'alef' },
49+
{
50+
'path': 'generics_trait',
51+
'name': 'alef',
52+
'displayType': ' -> Result<`T`, ()>',
53+
'displayMappedNames': '',
54+
'displayWhereClause': 'T: `OtherThingxxxxxxxx`',
55+
},
3256
],
3357
},
3458
{
3559
'query': 'OtherThingxxxxxxxy',
3660
'correction': 'OtherThingxxxxxxxx',
3761
'in_args': [
38-
{ 'path': 'generics_trait', 'name': 'alpha' },
62+
{
63+
'path': 'generics_trait',
64+
'name': 'alpha',
65+
'displayType': 'Result<`T`, ()> -> ()',
66+
'displayMappedNames': '',
67+
'displayWhereClause': 'T: `OtherThingxxxxxxxx`',
68+
},
3969
],
4070
'returned': [
41-
{ 'path': 'generics_trait', 'name': 'alef' },
71+
{
72+
'path': 'generics_trait',
73+
'name': 'alef',
74+
'displayType': ' -> Result<`T`, ()>',
75+
'displayMappedNames': '',
76+
'displayWhereClause': 'T: `OtherThingxxxxxxxx`',
77+
},
4278
],
4379
},
4480
];

0 commit comments

Comments
 (0)
Please sign in to comment.