Skip to content

Commit c00eaa9

Browse files
Strongly improve search path
1 parent ad6324f commit c00eaa9

File tree

1 file changed

+37
-10
lines changed

1 file changed

+37
-10
lines changed

src/librustdoc/html/static/main.js

+37-10
Original file line numberDiff line numberDiff line change
@@ -376,7 +376,7 @@
376376

377377
for (var z = 0; z < split.length; ++z) {
378378
if (split[z] === "") {
379-
split.slice(z, 1);
379+
split.splice(z, 1);
380380
z -= 1;
381381
}
382382
}
@@ -526,20 +526,47 @@
526526
return literalSearch === true ? false : lev_distance;
527527
}
528528

529-
function checkPath(startsWith, ty) {
530-
var lev_total = 0;
529+
function checkPath(startsWith, lastElem, ty) {
530+
var ret_lev = MAX_LEV_DISTANCE + 1;
531531
var path = ty.path.split("::");
532+
533+
if (ty.parent && ty.parent.name) {
534+
path.push(ty.parent.name.toLowerCase());
535+
}
536+
532537
if (startsWith.length > path.length) {
533538
return MAX_LEV_DISTANCE + 1;
534539
}
535-
for (var i = path.length - 1; i < startsWith.length; ++i) {
536-
var lev = levenshtein(startsWith[i], path[i]);
537-
if (lev > MAX_LEV_DISTANCE) {
538-
return MAX_LEV_DISTANCE + 1;
540+
for (var i = 0; i < path.length; ++i) {
541+
if (i + startsWith.length > path.length) {
542+
break;
543+
}
544+
var lev_total = 0;
545+
var aborted = false;
546+
for (var x = 0; x < startsWith.length; ++x) {
547+
var lev = levenshtein(path[i + x], startsWith[x]);
548+
if (lev > MAX_LEV_DISTANCE) {
549+
aborted = true;
550+
break;
551+
}
552+
lev_total += lev;
553+
}
554+
if (aborted === false) {
555+
var extra = MAX_LEV_DISTANCE + 1;
556+
if (i + startsWith.length < path.length) {
557+
extra = levenshtein(path[i + startsWith.length], lastElem);
558+
}
559+
if (extra > MAX_LEV_DISTANCE) {
560+
extra = levenshtein(ty.name, lastElem);
561+
}
562+
if (extra < MAX_LEV_DISTANCE + 1) {
563+
lev_total += extra;
564+
ret_lev = Math.min(ret_lev,
565+
Math.round(lev_total / (startsWith.length + 1)));
566+
}
539567
}
540-
lev_total += lev;
541568
}
542-
return Math.round(lev_total / startsWith.length);
569+
return ret_lev;
543570
}
544571

545572
function typePassesFilter(filter, type) {
@@ -701,7 +728,7 @@
701728
}
702729
var lev_add = 0;
703730
if (paths.length > 1) {
704-
var lev = checkPath(startsWith, ty);
731+
var lev = checkPath(startsWith, paths[paths.length - 1], ty);
705732
if (lev > MAX_LEV_DISTANCE) {
706733
continue;
707734
} else if (lev > 0) {

0 commit comments

Comments
 (0)