Rollup merge of #118109 - notriddle:notriddle/search-cleanup-2, r=GuillaumeGomez

rustdoc-search: simplify `checkPath` and `sortResults`

These two commits reduce the amount of code in search.js with no noticeable change in performance.

https://notriddle.com/rustdoc-html-demo-5/profile-5/index.html
This commit is contained in:
Matthias Krüger 2023-11-21 23:46:19 +01:00 committed by GitHub
commit bdb929e788
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
9 changed files with 77 additions and 92 deletions

View File

@ -16,6 +16,13 @@ use crate::clean;
/// Consequently, every change to this type should be synchronized to
/// the `itemTypes` mapping table in `html/static/js/search.js`.
///
/// The search engine in search.js also uses item type numbers as a tie breaker when
/// sorting results. Keywords and primitives are given first because we want them to be easily
/// found by new users who don't know about advanced features like type filters. The rest are
/// mostly in an arbitrary order, but it's easier to test the search engine when
/// it's deterministic, and these are strictly finer-grained than language namespaces, so
/// using the path and the item type together to sort ensures that search sorting is stable.
///
/// In addition, code in `html::render` uses this enum to generate CSS classes, page prefixes, and
/// module headings. If you are adding to this enum and want to ensure that the sidebar also prints
/// a heading, edit the listing in `html/render.rs`, function `sidebar_module`. This uses an
@ -23,28 +30,28 @@ use crate::clean;
#[derive(Copy, PartialEq, Eq, Hash, Clone, Debug, PartialOrd, Ord)]
#[repr(u8)]
pub(crate) enum ItemType {
Module = 0,
ExternCrate = 1,
Import = 2,
Struct = 3,
Enum = 4,
Function = 5,
TypeAlias = 6,
Static = 7,
Trait = 8,
Impl = 9,
TyMethod = 10,
Method = 11,
StructField = 12,
Variant = 13,
Macro = 14,
Primitive = 15,
AssocType = 16,
Constant = 17,
AssocConst = 18,
Union = 19,
ForeignType = 20,
Keyword = 21,
Keyword = 0,
Primitive = 1,
Module = 2,
ExternCrate = 3,
Import = 4,
Struct = 5,
Enum = 6,
Function = 7,
TypeAlias = 8,
Static = 9,
Trait = 10,
Impl = 11,
TyMethod = 12,
Method = 13,
StructField = 14,
Variant = 15,
Macro = 16,
AssocType = 17,
Constant = 18,
AssocConst = 19,
Union = 20,
ForeignType = 21,
OpaqueTy = 22,
ProcAttribute = 23,
ProcDerive = 24,

View File

@ -18,28 +18,28 @@ if (!Array.prototype.toSpliced) {
// This mapping table should match the discriminants of
// `rustdoc::formats::item_type::ItemType` type in Rust.
const itemTypes = [
"keyword",
"primitive",
"mod",
"externcrate",
"import",
"struct",
"struct", // 5
"enum",
"fn", // 5
"fn",
"type",
"static",
"trait",
"trait", // 10
"impl",
"tymethod", // 10
"tymethod",
"method",
"structfield",
"variant",
"variant", // 15
"macro",
"primitive", // 15
"associatedtype",
"constant",
"associatedconstant",
"union",
"foreigntype", // 20
"keyword",
"union", // 20
"foreigntype",
"existential",
"attr",
"derive",
@ -48,6 +48,8 @@ const itemTypes = [
];
const longItemTypes = [
"keyword",
"primitive type",
"module",
"extern crate",
"re-export",
@ -63,13 +65,11 @@ const longItemTypes = [
"struct field",
"enum variant",
"macro",
"primitive type",
"assoc type",
"constant",
"assoc const",
"union",
"foreign type",
"keyword",
"existential type",
"attribute macro",
"derive macro",
@ -77,8 +77,6 @@ const longItemTypes = [
];
// used for special search precedence
const TY_PRIMITIVE = itemTypes.indexOf("primitive");
const TY_KEYWORD = itemTypes.indexOf("keyword");
const TY_GENERIC = itemTypes.indexOf("generic");
const ROOT_PATH = typeof window !== "undefined" ? window.rootPath : "../";
@ -1317,16 +1315,6 @@ function initSearch(rawSearchIndex) {
return (a > b ? +1 : -1);
}
// special precedence for primitive and keyword pages
if ((aaa.item.ty === TY_PRIMITIVE && bbb.item.ty !== TY_KEYWORD) ||
(aaa.item.ty === TY_KEYWORD && bbb.item.ty !== TY_PRIMITIVE)) {
return -1;
}
if ((bbb.item.ty === TY_PRIMITIVE && aaa.item.ty !== TY_PRIMITIVE) ||
(bbb.item.ty === TY_KEYWORD && aaa.item.ty !== TY_KEYWORD)) {
return 1;
}
// sort by description (no description goes later)
a = (aaa.item.desc === "");
b = (bbb.item.desc === "");
@ -1840,26 +1828,16 @@ function initSearch(rawSearchIndex) {
const length = path.length;
const clength = contains.length;
if (clength > length) {
return maxEditDistance + 1;
}
for (let i = 0; i < length; ++i) {
if (i + clength > length) {
break;
}
pathiter: for (let i = length - clength; i >= 0; i -= 1) {
let dist_total = 0;
let aborted = false;
for (let x = 0; x < clength; ++x) {
const dist = editDistance(path[i + x], contains[x], maxEditDistance);
if (dist > maxEditDistance) {
aborted = true;
break;
continue pathiter;
}
dist_total += dist;
}
if (!aborted) {
ret_dist = Math.min(ret_dist, Math.round(dist_total / clength));
}
ret_dist = Math.min(ret_dist, Math.round(dist_total / clength));
}
return ret_dist;
}
@ -2953,7 +2931,7 @@ ${item.displayPath}<span class="${type}">${name}</span>\
// https://mathiasbynens.be/notes/shapes-ics
const crateRow = {
crate: crate,
ty: 1, // == ExternCrate
ty: 3, // == ExternCrate
name: crate,
path: "",
desc: crateCorpus.doc,

View File

@ -3,7 +3,7 @@
const EXPECTED = {
'query': 'fn',
'others': [
{ 'path': 'std', 'name': 'fn', ty: 15 }, // 15 is for primitive types
{ 'path': 'std', 'name': 'fn', ty: 21 }, // 21 is for keywords
{ 'path': 'std', 'name': 'fn', ty: 1 }, // 1 is for primitive types
{ 'path': 'std', 'name': 'fn', ty: 0 }, // 0 is for keywords
],
};

View File

@ -3,7 +3,7 @@
const EXPECTED = {
'query': 'panic',
'others': [
{ 'path': 'std', 'name': 'panic', ty: 14 }, // 15 is for macros
{ 'path': 'std', 'name': 'panic', ty: 0 }, // 0 is for modules
{ 'path': 'std', 'name': 'panic', ty: 16 }, // 16 is for macros
{ 'path': 'std', 'name': 'panic', ty: 2 }, // 2 is for modules
],
};

View File

@ -81,7 +81,7 @@ const PARSED = [
pathWithoutLast: [],
pathLast: "never",
generics: [],
typeFilter: 15,
typeFilter: 1,
}]
],
],
@ -112,7 +112,7 @@ const PARSED = [
pathWithoutLast: [],
pathLast: "[]",
generics: [],
typeFilter: 15,
typeFilter: 1,
}]
],
],
@ -149,10 +149,10 @@ const PARSED = [
pathWithoutLast: [],
pathLast: "never",
generics: [],
typeFilter: 15,
typeFilter: 1,
},
],
typeFilter: 15,
typeFilter: 1,
}]
],
],

View File

@ -7,7 +7,7 @@ const PARSED = [
pathWithoutLast: [],
pathLast: "foo",
generics: [],
typeFilter: 5,
typeFilter: 7,
}],
foundElems: 1,
original: "fn:foo",
@ -23,7 +23,7 @@ const PARSED = [
pathWithoutLast: [],
pathLast: "foo",
generics: [],
typeFilter: 4,
typeFilter: 6,
}],
foundElems: 1,
original: "enum : foo",
@ -48,7 +48,7 @@ const PARSED = [
pathWithoutLast: [],
pathLast: "macro",
generics: [],
typeFilter: 14,
typeFilter: 16,
}],
foundElems: 1,
original: "macro!",
@ -64,7 +64,7 @@ const PARSED = [
pathWithoutLast: [],
pathLast: "mac",
generics: [],
typeFilter: 14,
typeFilter: 16,
}],
foundElems: 1,
original: "macro:mac!",
@ -80,7 +80,7 @@ const PARSED = [
pathWithoutLast: ["a"],
pathLast: "mac",
generics: [],
typeFilter: 14,
typeFilter: 16,
}],
foundElems: 1,
original: "a::mac!",
@ -99,7 +99,7 @@ const PARSED = [
pathWithoutLast: [],
pathLast: "foo",
generics: [],
typeFilter: 5,
typeFilter: 7,
}],
userQuery: "-> fn:foo",
error: null,
@ -121,10 +121,10 @@ const PARSED = [
pathWithoutLast: [],
pathLast: "bar",
generics: [],
typeFilter: 5,
typeFilter: 7,
}
],
typeFilter: 5,
typeFilter: 7,
}],
userQuery: "-> fn:foo<fn:bar>",
error: null,
@ -146,7 +146,7 @@ const PARSED = [
pathWithoutLast: [],
pathLast: "bar",
generics: [],
typeFilter: 5,
typeFilter: 7,
},
{
name: "baz::fuzz",
@ -154,10 +154,10 @@ const PARSED = [
pathWithoutLast: ["baz"],
pathLast: "fuzz",
generics: [],
typeFilter: 4,
typeFilter: 6,
},
],
typeFilter: 5,
typeFilter: 7,
}],
userQuery: "-> fn:foo<fn:bar, enum : baz::fuzz>",
error: null,

View File

@ -13,7 +13,7 @@ const PARSED = [
pathWithoutLast: [],
pathLast: "never",
generics: [],
typeFilter: 15,
typeFilter: 1,
},
],
typeFilter: -1,
@ -32,7 +32,7 @@ const PARSED = [
pathWithoutLast: [],
pathLast: "never",
generics: [],
typeFilter: 15,
typeFilter: 1,
}],
foundElems: 1,
original: "!",
@ -48,7 +48,7 @@ const PARSED = [
pathWithoutLast: [],
pathLast: "a",
generics: [],
typeFilter: 14,
typeFilter: 16,
}],
foundElems: 1,
original: "a!",

View File

@ -89,7 +89,7 @@ const PARSED = [
pathWithoutLast: [],
pathLast: "never",
generics: [],
typeFilter: 15,
typeFilter: 1,
}],
userQuery: "-> !",
error: null,

View File

@ -43,16 +43,16 @@ const PARSED = [
pathWithoutLast: [],
pathLast: "[]",
generics: [],
typeFilter: 15,
typeFilter: 1,
},
],
typeFilter: 15,
typeFilter: 1,
},
],
typeFilter: 15,
typeFilter: 1,
},
],
typeFilter: 15,
typeFilter: 1,
},
],
foundElems: 1,
@ -70,7 +70,7 @@ const PARSED = [
pathWithoutLast: [],
pathLast: "[]",
generics: [],
typeFilter: 15,
typeFilter: 1,
},
{
name: "u8",
@ -105,7 +105,7 @@ const PARSED = [
typeFilter: -1,
},
],
typeFilter: 15,
typeFilter: 1,
},
],
foundElems: 1,
@ -140,7 +140,7 @@ const PARSED = [
typeFilter: -1,
},
],
typeFilter: 15,
typeFilter: 1,
},
],
foundElems: 1,
@ -176,7 +176,7 @@ const PARSED = [
typeFilter: -1,
},
],
typeFilter: 15,
typeFilter: 1,
},
],
foundElems: 1,
@ -194,7 +194,7 @@ const PARSED = [
pathWithoutLast: [],
pathLast: "[]",
generics: [],
typeFilter: 15,
typeFilter: 1,
},
],
foundElems: 1,
@ -284,7 +284,7 @@ const PARSED = [
typeFilter: -1,
},
],
typeFilter: 15,
typeFilter: 1,
},
],
foundElems: 1,