rustdoc-search: fix accidental shared, mutable map
This commit is contained in:
parent
c76c2e71f0
commit
a66972d551
@ -1349,24 +1349,16 @@ function initSearch(rawSearchIndex) {
|
||||
continue;
|
||||
}
|
||||
if (fnType.id < 0 && queryElem.id < 0) {
|
||||
if (mgens === null) {
|
||||
mgens = new Map();
|
||||
}
|
||||
const alreadyAssigned = mgens.has(fnType.id);
|
||||
if (alreadyAssigned) {
|
||||
if (mgens.get(fnType.id) !== queryElem.id) {
|
||||
if (mgens && mgens.has(fnType.id) &&
|
||||
mgens.get(fnType.id) !== queryElem.id) {
|
||||
continue;
|
||||
}
|
||||
} else {
|
||||
mgens.set(fnType.id, queryElem.id);
|
||||
}
|
||||
if (!solutionCb || solutionCb(mgens)) {
|
||||
const mgensScratch = new Map(mgens);
|
||||
mgensScratch.set(fnType.id, queryElem.id);
|
||||
if (!solutionCb || solutionCb(mgensScratch)) {
|
||||
return true;
|
||||
}
|
||||
if (!alreadyAssigned) {
|
||||
mgens.delete(fnType.id);
|
||||
}
|
||||
} else if (!solutionCb || solutionCb(mgens)) {
|
||||
} else if (!solutionCb || solutionCb(mgens ? new Map(mgens) : null)) {
|
||||
// unifyFunctionTypeIsMatchCandidate already checks that ids match
|
||||
return true;
|
||||
}
|
||||
@ -1376,34 +1368,26 @@ function initSearch(rawSearchIndex) {
|
||||
continue;
|
||||
}
|
||||
if (fnType.id < 0) {
|
||||
if (mgens === null) {
|
||||
mgens = new Map();
|
||||
}
|
||||
const alreadyAssigned = mgens.has(fnType.id);
|
||||
if (alreadyAssigned) {
|
||||
if (mgens.get(fnType.id) !== 0) {
|
||||
if (mgens && mgens.has(fnType.id) &&
|
||||
mgens.get(fnType.id) !== 0) {
|
||||
continue;
|
||||
}
|
||||
} else {
|
||||
mgens.set(fnType.id, 0);
|
||||
}
|
||||
const mgensScratch = new Map(mgens);
|
||||
mgensScratch.set(fnType.id, 0);
|
||||
if (unifyFunctionTypes(
|
||||
whereClause[(-fnType.id) - 1],
|
||||
queryElems,
|
||||
whereClause,
|
||||
mgens,
|
||||
mgensScratch,
|
||||
solutionCb
|
||||
)) {
|
||||
return true;
|
||||
}
|
||||
if (!alreadyAssigned) {
|
||||
mgens.delete(fnType.id);
|
||||
}
|
||||
} else if (unifyFunctionTypes(
|
||||
fnType.generics,
|
||||
queryElems,
|
||||
whereClause,
|
||||
mgens,
|
||||
mgens ? new Map(mgens) : null,
|
||||
solutionCb
|
||||
)) {
|
||||
return true;
|
||||
|
22
tests/rustdoc-js/generics2.js
Normal file
22
tests/rustdoc-js/generics2.js
Normal file
@ -0,0 +1,22 @@
|
||||
// exact-check
|
||||
|
||||
const EXPECTED = [
|
||||
{
|
||||
'query': 'outside<U>, outside<V> -> outside<W>',
|
||||
'others': [],
|
||||
},
|
||||
{
|
||||
'query': 'outside<V>, outside<U> -> outside<W>',
|
||||
'others': [],
|
||||
},
|
||||
{
|
||||
'query': 'outside<U>, outside<U> -> outside<W>',
|
||||
'others': [],
|
||||
},
|
||||
{
|
||||
'query': 'outside<U>, outside<U> -> outside<U>',
|
||||
'others': [
|
||||
{"path": "generics2", "name": "should_match_3"}
|
||||
],
|
||||
},
|
||||
];
|
13
tests/rustdoc-js/generics2.rs
Normal file
13
tests/rustdoc-js/generics2.rs
Normal file
@ -0,0 +1,13 @@
|
||||
pub struct Outside<T>(T);
|
||||
|
||||
pub fn no_match<U, V>(a: Outside<U>, b: Outside<V>) -> (Outside<U>, Outside<V>) {
|
||||
unimplemented!();
|
||||
}
|
||||
|
||||
pub fn no_match_2<U, V>(a: Outside<V>, b: Outside<U>) -> (Outside<U>, Outside<V>) {
|
||||
unimplemented!();
|
||||
}
|
||||
|
||||
pub fn should_match_3<U>(a: Outside<U>, b: Outside<U>) -> (Outside<U>, Outside<U>) {
|
||||
unimplemented!();
|
||||
}
|
Loading…
Reference in New Issue
Block a user