Auto merge of #46081 - GuillaumeGomez:fix-path-search, r=QuietMisdreavus
Fix path search Fixes #46015. r? @QuietMisdreavus
This commit is contained in:
@@ -377,11 +377,10 @@
|
|||||||
results = {},
|
results = {},
|
||||||
split = valLower.split("::");
|
split = valLower.split("::");
|
||||||
|
|
||||||
// remove empty keywords
|
for (var z = 0; z < split.length; ++z) {
|
||||||
for (var j = 0; j < split.length; ++j) {
|
if (split[z] === "") {
|
||||||
split[j].toLowerCase();
|
split.splice(z, 1);
|
||||||
if (split[j] === "") {
|
z -= 1;
|
||||||
split.splice(j, 1);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -408,9 +407,7 @@
|
|||||||
if (obj.generics &&
|
if (obj.generics &&
|
||||||
obj.generics.length >= val.generics.length) {
|
obj.generics.length >= val.generics.length) {
|
||||||
var elems = obj.generics.slice(0);
|
var elems = obj.generics.slice(0);
|
||||||
for (var y = 0;
|
for (var y = 0; y < val.generics.length; ++y) {
|
||||||
y < val.generics.length;
|
|
||||||
++y) {
|
|
||||||
// The point here is to find the type that matches the most.
|
// The point here is to find the type that matches the most.
|
||||||
var lev = { pos: -1, lev: MAX_LEV_DISTANCE + 1};
|
var lev = { pos: -1, lev: MAX_LEV_DISTANCE + 1};
|
||||||
for (var x = 0; x < elems.length; ++x) {
|
for (var x = 0; x < elems.length; ++x) {
|
||||||
@@ -532,6 +529,49 @@
|
|||||||
return literalSearch === true ? false : lev_distance;
|
return literalSearch === true ? false : lev_distance;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
function checkPath(startsWith, lastElem, ty) {
|
||||||
|
var ret_lev = MAX_LEV_DISTANCE + 1;
|
||||||
|
var path = ty.path.split("::");
|
||||||
|
|
||||||
|
if (ty.parent && ty.parent.name) {
|
||||||
|
path.push(ty.parent.name.toLowerCase());
|
||||||
|
}
|
||||||
|
|
||||||
|
if (startsWith.length > path.length) {
|
||||||
|
return MAX_LEV_DISTANCE + 1;
|
||||||
|
}
|
||||||
|
for (var i = 0; i < path.length; ++i) {
|
||||||
|
if (i + startsWith.length > path.length) {
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
var lev_total = 0;
|
||||||
|
var aborted = false;
|
||||||
|
for (var x = 0; x < startsWith.length; ++x) {
|
||||||
|
var lev = levenshtein(path[i + x], startsWith[x]);
|
||||||
|
if (lev > MAX_LEV_DISTANCE) {
|
||||||
|
aborted = true;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
lev_total += lev;
|
||||||
|
}
|
||||||
|
if (aborted === false) {
|
||||||
|
var extra = MAX_LEV_DISTANCE + 1;
|
||||||
|
if (i + startsWith.length < path.length) {
|
||||||
|
extra = levenshtein(path[i + startsWith.length], lastElem);
|
||||||
|
}
|
||||||
|
if (extra > MAX_LEV_DISTANCE) {
|
||||||
|
extra = levenshtein(ty.name, lastElem);
|
||||||
|
}
|
||||||
|
if (extra < MAX_LEV_DISTANCE + 1) {
|
||||||
|
lev_total += extra;
|
||||||
|
ret_lev = Math.min(ret_lev,
|
||||||
|
Math.round(lev_total / (startsWith.length + 1)));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return ret_lev;
|
||||||
|
}
|
||||||
|
|
||||||
function typePassesFilter(filter, type) {
|
function typePassesFilter(filter, type) {
|
||||||
// No filter
|
// No filter
|
||||||
if (filter < 0) return true;
|
if (filter < 0) return true;
|
||||||
@@ -668,24 +708,45 @@
|
|||||||
query.search = val;
|
query.search = val;
|
||||||
// gather matching search results up to a certain maximum
|
// gather matching search results up to a certain maximum
|
||||||
val = val.replace(/\_/g, "");
|
val = val.replace(/\_/g, "");
|
||||||
var valGenerics = extractGenerics(val);
|
|
||||||
var results_length = 0;
|
var results_length = 0;
|
||||||
for (var i = 0; i < split.length; ++i) {
|
var valGenerics = extractGenerics(val);
|
||||||
for (var j = 0; j < nSearchWords; ++j) {
|
|
||||||
|
var paths = valLower.split("::");
|
||||||
|
var j;
|
||||||
|
for (j = 0; j < paths.length; ++j) {
|
||||||
|
if (paths[j] === "") {
|
||||||
|
paths.splice(j, 1);
|
||||||
|
j -= 1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
val = paths[paths.length - 1];
|
||||||
|
var startsWith = paths.slice(0, paths.length > 1 ? paths.length - 1 : 1);
|
||||||
|
|
||||||
|
for (j = 0; j < nSearchWords; ++j) {
|
||||||
var lev_distance;
|
var lev_distance;
|
||||||
var ty = searchIndex[j];
|
var ty = searchIndex[j];
|
||||||
if (!ty) {
|
if (!ty) {
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
var lev_add = 0;
|
||||||
|
if (paths.length > 1) {
|
||||||
|
var lev = checkPath(startsWith, paths[paths.length - 1], ty);
|
||||||
|
if (lev > MAX_LEV_DISTANCE) {
|
||||||
|
continue;
|
||||||
|
} else if (lev > 0) {
|
||||||
|
lev_add = 1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
var returned = false;
|
var returned = false;
|
||||||
var in_args = false;
|
var in_args = false;
|
||||||
var index = -1;
|
var index = -1;
|
||||||
// we want lev results to go lower than others
|
// we want lev results to go lower than others
|
||||||
var lev = MAX_LEV_DISTANCE;
|
var lev = MAX_LEV_DISTANCE + 1;
|
||||||
var fullId = itemTypes[ty.ty] + ty.path + ty.name;
|
var fullId = itemTypes[ty.ty] + ty.path + ty.name;
|
||||||
|
|
||||||
if (searchWords[j].indexOf(split[i]) > -1 ||
|
if (searchWords[j].indexOf(val) > -1 ||
|
||||||
searchWords[j].indexOf(val) > -1 ||
|
|
||||||
searchWords[j].replace(/_/g, "").indexOf(val) > -1)
|
searchWords[j].replace(/_/g, "").indexOf(val) > -1)
|
||||||
{
|
{
|
||||||
// filter type: ... queries
|
// filter type: ... queries
|
||||||
@@ -722,6 +783,7 @@
|
|||||||
index = Math.max(0, index);
|
index = Math.max(0, index);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
lev += lev_add;
|
||||||
if (index !== -1) {
|
if (index !== -1) {
|
||||||
if (results[fullId] === undefined) {
|
if (results[fullId] === undefined) {
|
||||||
results[fullId] = {
|
results[fullId] = {
|
||||||
@@ -749,7 +811,6 @@
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
|
||||||
var ar = [];
|
var ar = [];
|
||||||
for (var entry in results) {
|
for (var entry in results) {
|
||||||
@@ -837,16 +898,14 @@
|
|||||||
var result = results[i];
|
var result = results[i];
|
||||||
|
|
||||||
// this validation does not make sense when searching by types
|
// this validation does not make sense when searching by types
|
||||||
if (result.dontValidate) {
|
if (result.dontValidate || result.returned === true && result.param === true) {
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
var name = result.item.name.toLowerCase(),
|
var name = result.item.name.toLowerCase(),
|
||||||
path = result.item.path.toLowerCase(),
|
path = result.item.path.toLowerCase(),
|
||||||
parent = result.item.parent;
|
parent = result.item.parent;
|
||||||
|
|
||||||
if (result.returned === false && result.param === false &&
|
if (validateResult(name, path, split, parent) === false) {
|
||||||
validateResult(name, path, split, parent) === false)
|
|
||||||
{
|
|
||||||
result.id = -1;
|
result.id = -1;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user