diff --git a/src/librustdoc/html/static/js/search.js b/src/librustdoc/html/static/js/search.js index 984358396ab..50d5d95909f 100644 --- a/src/librustdoc/html/static/js/search.js +++ b/src/librustdoc/html/static/js/search.js @@ -1179,7 +1179,7 @@ function initSearch(rawSearchIndex) { /** * This function checks if the object (`row`) generics match the given type (`elem`) - * generics. If there are no generics on `row`, `defaultDistance` is returned. + * generics. * * @param {Row} row - The object to check. * @param {QueryElement} elem - The element from the parsed query. @@ -1196,82 +1196,82 @@ function initSearch(rawSearchIndex) { // This search engine implements order-agnostic unification. There // should be no missing duplicates (generics have "bag semantics"), // and the row is allowed to have extras. - if (elem.generics.length > 0 && row.generics.length >= elem.generics.length) { - const elems = new Map(); - const addEntryToElems = function addEntryToElems(entry) { - if (entry.id === -1) { - // Pure generic, needs to check into it. - for (const inner_entry of entry.generics) { - addEntryToElems(inner_entry); - } - return; + if (elem.generics.length <= 0 || row.generics.length < elem.generics.length) { + return false; + } + const elems = new Map(); + const addEntryToElems = function addEntryToElems(entry) { + if (entry.id === -1) { + // Pure generic, needs to check into it. + for (const inner_entry of entry.generics) { + addEntryToElems(inner_entry); } - let currentEntryElems; - if (elems.has(entry.id)) { - currentEntryElems = elems.get(entry.id); - } else { - currentEntryElems = []; - elems.set(entry.id, currentEntryElems); - } - currentEntryElems.push(entry); - }; - for (const entry of row.generics) { - addEntryToElems(entry); + return; } - // We need to find the type that matches the most to remove it in order - // to move forward. - const handleGeneric = generic => { - if (!elems.has(generic.id)) { - return false; - } - const matchElems = elems.get(generic.id); - const matchIdx = matchElems.findIndex(tmp_elem => { - if (generic.generics.length > 0 && !checkGenerics(tmp_elem, generic)) { - return false; - } - return typePassesFilter(generic.typeFilter, tmp_elem.ty); - }); - if (matchIdx === -1) { - return false; - } - matchElems.splice(matchIdx, 1); - if (matchElems.length === 0) { - elems.delete(generic.id); - } - return true; - }; - // To do the right thing with type filters, we first process generics - // that have them, removing matching ones from the "bag," then do the - // ones with no type filter, which can match any entry regardless of its - // own type. - for (const generic of elem.generics) { - if (generic.typeFilter === TY_PRIMITIVE && - generic.id === typeNameIdOfArrayOrSlice) { - const genericArray = { - id: typeNameIdOfArray, - typeFilter: TY_PRIMITIVE, - generics: generic.generics, - }; - const genericSlice = { - id: typeNameIdOfSlice, - typeFilter: TY_PRIMITIVE, - generics: generic.generics, - }; - if (!handleGeneric(genericArray) && !handleGeneric(genericSlice)) { - return false; - } - } else if (generic.typeFilter !== -1 && !handleGeneric(generic)) { - return false; - } + let currentEntryElems; + if (elems.has(entry.id)) { + currentEntryElems = elems.get(entry.id); + } else { + currentEntryElems = []; + elems.set(entry.id, currentEntryElems); } - for (const generic of elem.generics) { - if (generic.typeFilter === -1 && !handleGeneric(generic)) { + currentEntryElems.push(entry); + }; + for (const entry of row.generics) { + addEntryToElems(entry); + } + // We need to find the type that matches the most to remove it in order + // to move forward. + const handleGeneric = generic => { + if (!elems.has(generic.id)) { + return false; + } + const matchElems = elems.get(generic.id); + const matchIdx = matchElems.findIndex(tmp_elem => { + if (generic.generics.length > 0 && !checkGenerics(tmp_elem, generic)) { return false; } + return typePassesFilter(generic.typeFilter, tmp_elem.ty); + }); + if (matchIdx === -1) { + return false; + } + matchElems.splice(matchIdx, 1); + if (matchElems.length === 0) { + elems.delete(generic.id); } return true; + }; + // To do the right thing with type filters, we first process generics + // that have them, removing matching ones from the "bag," then do the + // ones with no type filter, which can match any entry regardless of its + // own type. + for (const generic of elem.generics) { + if (generic.typeFilter === TY_PRIMITIVE && + generic.id === typeNameIdOfArrayOrSlice) { + const genericArray = { + id: typeNameIdOfArray, + typeFilter: TY_PRIMITIVE, + generics: generic.generics, + }; + const genericSlice = { + id: typeNameIdOfSlice, + typeFilter: TY_PRIMITIVE, + generics: generic.generics, + }; + if (!handleGeneric(genericArray) && !handleGeneric(genericSlice)) { + return false; + } + } else if (generic.typeFilter !== -1 && !handleGeneric(generic)) { + return false; + } } - return false; + for (const generic of elem.generics) { + if (generic.typeFilter === -1 && !handleGeneric(generic)) { + return false; + } + } + return true; } /**