Skip to content

Commit ca8ef26

Browse files
committed
Auto merge of #46081 - GuillaumeGomez:fix-path-search, r=QuietMisdreavus
Fix path search Fixes #46015. r? @QuietMisdreavus
2 parents db16292 + c00eaa9 commit ca8ef26

File tree

1 file changed

+141
-82
lines changed

1 file changed

+141
-82
lines changed

src/librustdoc/html/static/main.js

+141-82
Original file line numberDiff line numberDiff line change
@@ -377,11 +377,10 @@
377377
results = {},
378378
split = valLower.split("::");
379379

380-
// remove empty keywords
381-
for (var j = 0; j < split.length; ++j) {
382-
split[j].toLowerCase();
383-
if (split[j] === "") {
384-
split.splice(j, 1);
380+
for (var z = 0; z < split.length; ++z) {
381+
if (split[z] === "") {
382+
split.splice(z, 1);
383+
z -= 1;
385384
}
386385
}
387386

@@ -408,9 +407,7 @@
408407
if (obj.generics &&
409408
obj.generics.length >= val.generics.length) {
410409
var elems = obj.generics.slice(0);
411-
for (var y = 0;
412-
y < val.generics.length;
413-
++y) {
410+
for (var y = 0; y < val.generics.length; ++y) {
414411
// The point here is to find the type that matches the most.
415412
var lev = { pos: -1, lev: MAX_LEV_DISTANCE + 1};
416413
for (var x = 0; x < elems.length; ++x) {
@@ -532,6 +529,49 @@
532529
return literalSearch === true ? false : lev_distance;
533530
}
534531

532+
function checkPath(startsWith, lastElem, ty) {
533+
var ret_lev = MAX_LEV_DISTANCE + 1;
534+
var path = ty.path.split("::");
535+
536+
if (ty.parent && ty.parent.name) {
537+
path.push(ty.parent.name.toLowerCase());
538+
}
539+
540+
if (startsWith.length > path.length) {
541+
return MAX_LEV_DISTANCE + 1;
542+
}
543+
for (var i = 0; i < path.length; ++i) {
544+
if (i + startsWith.length > path.length) {
545+
break;
546+
}
547+
var lev_total = 0;
548+
var aborted = false;
549+
for (var x = 0; x < startsWith.length; ++x) {
550+
var lev = levenshtein(path[i + x], startsWith[x]);
551+
if (lev > MAX_LEV_DISTANCE) {
552+
aborted = true;
553+
break;
554+
}
555+
lev_total += lev;
556+
}
557+
if (aborted === false) {
558+
var extra = MAX_LEV_DISTANCE + 1;
559+
if (i + startsWith.length < path.length) {
560+
extra = levenshtein(path[i + startsWith.length], lastElem);
561+
}
562+
if (extra > MAX_LEV_DISTANCE) {
563+
extra = levenshtein(ty.name, lastElem);
564+
}
565+
if (extra < MAX_LEV_DISTANCE + 1) {
566+
lev_total += extra;
567+
ret_lev = Math.min(ret_lev,
568+
Math.round(lev_total / (startsWith.length + 1)));
569+
}
570+
}
571+
}
572+
return ret_lev;
573+
}
574+
535575
function typePassesFilter(filter, type) {
536576
// No filter
537577
if (filter < 0) return true;
@@ -668,85 +708,106 @@
668708
query.search = val;
669709
// gather matching search results up to a certain maximum
670710
val = val.replace(/\_/g, "");
671-
var valGenerics = extractGenerics(val);
711+
672712
var results_length = 0;
673-
for (var i = 0; i < split.length; ++i) {
674-
for (var j = 0; j < nSearchWords; ++j) {
675-
var lev_distance;
676-
var ty = searchIndex[j];
677-
if (!ty) {
713+
var valGenerics = extractGenerics(val);
714+
715+
var paths = valLower.split("::");
716+
var j;
717+
for (j = 0; j < paths.length; ++j) {
718+
if (paths[j] === "") {
719+
paths.splice(j, 1);
720+
j -= 1;
721+
}
722+
}
723+
val = paths[paths.length - 1];
724+
var startsWith = paths.slice(0, paths.length > 1 ? paths.length - 1 : 1);
725+
726+
for (j = 0; j < nSearchWords; ++j) {
727+
var lev_distance;
728+
var ty = searchIndex[j];
729+
if (!ty) {
730+
continue;
731+
}
732+
var lev_add = 0;
733+
if (paths.length > 1) {
734+
var lev = checkPath(startsWith, paths[paths.length - 1], ty);
735+
if (lev > MAX_LEV_DISTANCE) {
678736
continue;
737+
} else if (lev > 0) {
738+
lev_add = 1;
679739
}
680-
var returned = false;
681-
var in_args = false;
682-
var index = -1;
683-
// we want lev results to go lower than others
684-
var lev = MAX_LEV_DISTANCE;
685-
var fullId = itemTypes[ty.ty] + ty.path + ty.name;
686-
687-
if (searchWords[j].indexOf(split[i]) > -1 ||
688-
searchWords[j].indexOf(val) > -1 ||
689-
searchWords[j].replace(/_/g, "").indexOf(val) > -1)
690-
{
691-
// filter type: ... queries
692-
if (typePassesFilter(typeFilter, ty) &&
693-
results[fullId] === undefined) {
694-
index = searchWords[j].replace(/_/g, "").indexOf(val);
695-
}
740+
}
741+
742+
var returned = false;
743+
var in_args = false;
744+
var index = -1;
745+
// we want lev results to go lower than others
746+
var lev = MAX_LEV_DISTANCE + 1;
747+
var fullId = itemTypes[ty.ty] + ty.path + ty.name;
748+
749+
if (searchWords[j].indexOf(val) > -1 ||
750+
searchWords[j].replace(/_/g, "").indexOf(val) > -1)
751+
{
752+
// filter type: ... queries
753+
if (typePassesFilter(typeFilter, ty) &&
754+
results[fullId] === undefined) {
755+
index = searchWords[j].replace(/_/g, "").indexOf(val);
696756
}
697-
if ((lev_distance = levenshtein(searchWords[j], val)) <= MAX_LEV_DISTANCE) {
698-
if (typePassesFilter(typeFilter, ty) &&
699-
(results[fullId] === undefined ||
700-
results[fullId].lev > lev_distance)) {
701-
lev = Math.min(lev, lev_distance);
702-
index = Math.max(0, index);
703-
}
757+
}
758+
if ((lev_distance = levenshtein(searchWords[j], val)) <= MAX_LEV_DISTANCE) {
759+
if (typePassesFilter(typeFilter, ty) &&
760+
(results[fullId] === undefined ||
761+
results[fullId].lev > lev_distance)) {
762+
lev = Math.min(lev, lev_distance);
763+
index = Math.max(0, index);
704764
}
705-
if ((lev_distance = findArg(searchIndex[j], valGenerics))
706-
<= MAX_LEV_DISTANCE) {
707-
if (typePassesFilter(typeFilter, ty) &&
708-
(results[fullId] === undefined ||
709-
results[fullId].lev > lev_distance)) {
710-
in_args = true;
711-
lev = Math.min(lev_distance, lev);
712-
index = Math.max(0, index);
713-
}
765+
}
766+
if ((lev_distance = findArg(searchIndex[j], valGenerics))
767+
<= MAX_LEV_DISTANCE) {
768+
if (typePassesFilter(typeFilter, ty) &&
769+
(results[fullId] === undefined ||
770+
results[fullId].lev > lev_distance)) {
771+
in_args = true;
772+
lev = Math.min(lev_distance, lev);
773+
index = Math.max(0, index);
714774
}
715-
if ((lev_distance = checkReturned(searchIndex[j], valGenerics)) <=
716-
MAX_LEV_DISTANCE) {
717-
if (typePassesFilter(typeFilter, ty) &&
718-
(results[fullId] === undefined ||
719-
results[fullId].lev > lev_distance)) {
720-
returned = true;
721-
lev = Math.min(lev_distance, lev);
722-
index = Math.max(0, index);
723-
}
775+
}
776+
if ((lev_distance = checkReturned(searchIndex[j], valGenerics)) <=
777+
MAX_LEV_DISTANCE) {
778+
if (typePassesFilter(typeFilter, ty) &&
779+
(results[fullId] === undefined ||
780+
results[fullId].lev > lev_distance)) {
781+
returned = true;
782+
lev = Math.min(lev_distance, lev);
783+
index = Math.max(0, index);
724784
}
725-
if (index !== -1) {
726-
if (results[fullId] === undefined) {
727-
results[fullId] = {
728-
id: j,
729-
index: index,
730-
lev: lev,
731-
in_args: in_args,
732-
returned: returned,
733-
};
734-
results_length += 1;
735-
} else {
736-
if (results[fullId].lev > lev) {
737-
results[fullId].lev = lev;
738-
}
739-
if (in_args === true) {
740-
results[fullId].in_args = true;
741-
}
742-
if (returned === true) {
743-
results[fullId].returned = true;
744-
}
785+
}
786+
lev += lev_add;
787+
if (index !== -1) {
788+
if (results[fullId] === undefined) {
789+
results[fullId] = {
790+
id: j,
791+
index: index,
792+
lev: lev,
793+
in_args: in_args,
794+
returned: returned,
795+
};
796+
results_length += 1;
797+
} else {
798+
if (results[fullId].lev > lev) {
799+
results[fullId].lev = lev;
800+
}
801+
if (in_args === true) {
802+
results[fullId].in_args = true;
803+
}
804+
if (returned === true) {
805+
results[fullId].returned = true;
745806
}
746807
}
747-
if (results_length === max) {
748-
break;
749-
}
808+
}
809+
if (results_length === max) {
810+
break;
750811
}
751812
}
752813
}
@@ -837,16 +898,14 @@
837898
var result = results[i];
838899

839900
// this validation does not make sense when searching by types
840-
if (result.dontValidate) {
901+
if (result.dontValidate || result.returned === true && result.param === true) {
841902
continue;
842903
}
843904
var name = result.item.name.toLowerCase(),
844905
path = result.item.path.toLowerCase(),
845906
parent = result.item.parent;
846907

847-
if (result.returned === false && result.param === false &&
848-
validateResult(name, path, split, parent) === false)
849-
{
908+
if (validateResult(name, path, split, parent) === false) {
850909
result.id = -1;
851910
}
852911
}

0 commit comments

Comments
 (0)