Skip to content

Commit

Permalink
Rollup merge of #118109 - notriddle:notriddle/search-cleanup-2, r=Gui…
Browse files Browse the repository at this point in the history
…llaumeGomez

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
  • Loading branch information
matthiaskrgr committed Nov 21, 2023
2 parents a98698e + 28f17d9 commit bdb929e
Show file tree
Hide file tree
Showing 9 changed files with 77 additions and 92 deletions.
51 changes: 29 additions & 22 deletions src/librustdoc/formats/item_type.rs
Original file line number Diff line number Diff line change
Expand Up @@ -16,35 +16,42 @@ 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
/// ordering based on a helper function inside `item_module`, in the same file.
#[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,
Expand Down
52 changes: 15 additions & 37 deletions src/librustdoc/html/static/js/search.js
Original file line number Diff line number Diff line change
Expand Up @@ -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",
Expand All @@ -48,6 +48,8 @@ const itemTypes = [
];

const longItemTypes = [
"keyword",
"primitive type",
"module",
"extern crate",
"re-export",
Expand All @@ -63,22 +65,18 @@ const longItemTypes = [
"struct field",
"enum variant",
"macro",
"primitive type",
"assoc type",
"constant",
"assoc const",
"union",
"foreign type",
"keyword",
"existential type",
"attribute macro",
"derive macro",
"trait alias",
];

// 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 : "../";

Expand Down Expand Up @@ -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 === "");
Expand Down Expand Up @@ -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;
}
Expand Down Expand Up @@ -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,
Expand Down
4 changes: 2 additions & 2 deletions tests/rustdoc-js-std/keyword.js
Original file line number Diff line number Diff line change
Expand Up @@ -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
],
};
4 changes: 2 additions & 2 deletions tests/rustdoc-js-std/macro-check.js
Original file line number Diff line number Diff line change
Expand Up @@ -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
],
};
8 changes: 4 additions & 4 deletions tests/rustdoc-js-std/parser-bindings.js
Original file line number Diff line number Diff line change
Expand Up @@ -81,7 +81,7 @@ const PARSED = [
pathWithoutLast: [],
pathLast: "never",
generics: [],
typeFilter: 15,
typeFilter: 1,
}]
],
],
Expand Down Expand Up @@ -112,7 +112,7 @@ const PARSED = [
pathWithoutLast: [],
pathLast: "[]",
generics: [],
typeFilter: 15,
typeFilter: 1,
}]
],
],
Expand Down Expand Up @@ -149,10 +149,10 @@ const PARSED = [
pathWithoutLast: [],
pathLast: "never",
generics: [],
typeFilter: 15,
typeFilter: 1,
},
],
typeFilter: 15,
typeFilter: 1,
}]
],
],
Expand Down
22 changes: 11 additions & 11 deletions tests/rustdoc-js-std/parser-filter.js
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@ const PARSED = [
pathWithoutLast: [],
pathLast: "foo",
generics: [],
typeFilter: 5,
typeFilter: 7,
}],
foundElems: 1,
original: "fn:foo",
Expand All @@ -23,7 +23,7 @@ const PARSED = [
pathWithoutLast: [],
pathLast: "foo",
generics: [],
typeFilter: 4,
typeFilter: 6,
}],
foundElems: 1,
original: "enum : foo",
Expand All @@ -48,7 +48,7 @@ const PARSED = [
pathWithoutLast: [],
pathLast: "macro",
generics: [],
typeFilter: 14,
typeFilter: 16,
}],
foundElems: 1,
original: "macro!",
Expand All @@ -64,7 +64,7 @@ const PARSED = [
pathWithoutLast: [],
pathLast: "mac",
generics: [],
typeFilter: 14,
typeFilter: 16,
}],
foundElems: 1,
original: "macro:mac!",
Expand All @@ -80,7 +80,7 @@ const PARSED = [
pathWithoutLast: ["a"],
pathLast: "mac",
generics: [],
typeFilter: 14,
typeFilter: 16,
}],
foundElems: 1,
original: "a::mac!",
Expand All @@ -99,7 +99,7 @@ const PARSED = [
pathWithoutLast: [],
pathLast: "foo",
generics: [],
typeFilter: 5,
typeFilter: 7,
}],
userQuery: "-> fn:foo",
error: null,
Expand All @@ -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,
Expand All @@ -146,18 +146,18 @@ const PARSED = [
pathWithoutLast: [],
pathLast: "bar",
generics: [],
typeFilter: 5,
typeFilter: 7,
},
{
name: "baz::fuzz",
fullPath: ["baz", "fuzz"],
pathWithoutLast: ["baz"],
pathLast: "fuzz",
generics: [],
typeFilter: 4,
typeFilter: 6,
},
],
typeFilter: 5,
typeFilter: 7,
}],
userQuery: "-> fn:foo<fn:bar, enum : baz::fuzz>",
error: null,
Expand Down
6 changes: 3 additions & 3 deletions tests/rustdoc-js-std/parser-ident.js
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,7 @@ const PARSED = [
pathWithoutLast: [],
pathLast: "never",
generics: [],
typeFilter: 15,
typeFilter: 1,
},
],
typeFilter: -1,
Expand All @@ -32,7 +32,7 @@ const PARSED = [
pathWithoutLast: [],
pathLast: "never",
generics: [],
typeFilter: 15,
typeFilter: 1,
}],
foundElems: 1,
original: "!",
Expand All @@ -48,7 +48,7 @@ const PARSED = [
pathWithoutLast: [],
pathLast: "a",
generics: [],
typeFilter: 14,
typeFilter: 16,
}],
foundElems: 1,
original: "a!",
Expand Down
2 changes: 1 addition & 1 deletion tests/rustdoc-js-std/parser-returned.js
Original file line number Diff line number Diff line change
Expand Up @@ -89,7 +89,7 @@ const PARSED = [
pathWithoutLast: [],
pathLast: "never",
generics: [],
typeFilter: 15,
typeFilter: 1,
}],
userQuery: "-> !",
error: null,
Expand Down

0 comments on commit bdb929e

Please sign in to comment.