}
function initSearch(rawSearchIndex) {
- var currentResults, index, searchIndex;
var MAX_LEV_DISTANCE = 3;
var MAX_RESULTS = 200;
var GENERICS_DATA = 1;
var NAME = 0;
var INPUTS_DATA = 0;
var OUTPUT_DATA = 1;
+ var NO_TYPE_FILTER = -1;
+ var currentResults, index, searchIndex;
var params = getQueryStringParams();
// Populate search bar with query string search term when provided,
return i;
}
}
- return -1;
+ return NO_TYPE_FILTER;
}
var valLower = query.query.toLowerCase(),
};
}
+ function getObjectFromId(id) {
+ if (typeof id === "number") {
+ return searchIndex[id];
+ }
+ return {'name': id};
+ }
+
function checkGenerics(obj, val) {
// The names match, but we need to be sure that all generics kinda
// match as well.
for (var y = 0; y < vlength; ++y) {
var lev = { pos: -1, lev: MAX_LEV_DISTANCE + 1};
var elength = elems.length;
+ var firstGeneric = getObjectFromId(val.generics[y]).name;
for (var x = 0; x < elength; ++x) {
- var tmp_lev = levenshtein(elems[x], val.generics[y]);
+ var tmp_lev = levenshtein(getObjectFromId(elems[x]).name,
+ firstGeneric);
if (tmp_lev < lev.lev) {
lev.lev = tmp_lev;
lev.pos = x;
for (var y = 0; allFound === true && y < val.generics.length; ++y) {
allFound = false;
+ var firstGeneric = getObjectFromId(val.generics[y]).name;
for (x = 0; allFound === false && x < elems.length; ++x) {
- allFound = elems[x] === val.generics[y];
+ allFound = getObjectFromId(elems[x]).name === firstGeneric;
}
if (allFound === true) {
elems.splice(x - 1, 1);
return lev_distance + 1;
}
- function findArg(obj, val, literalSearch) {
+ function findArg(obj, val, literalSearch, typeFilter) {
var lev_distance = MAX_LEV_DISTANCE + 1;
- if (obj && obj.type && obj.type[INPUTS_DATA] &&
- obj.type[INPUTS_DATA].length > 0) {
+ if (obj && obj.type && obj.type[INPUTS_DATA] && obj.type[INPUTS_DATA].length > 0) {
var length = obj.type[INPUTS_DATA].length;
for (var i = 0; i < length; i++) {
- var tmp = checkType(obj.type[INPUTS_DATA][i], val, literalSearch);
- if (literalSearch === true && tmp === true) {
- return true;
+ var tmp = obj.type[INPUTS_DATA][i];
+ if (typePassesFilter(typeFilter, tmp[1]) === false) {
+ continue;
+ }
+ tmp = checkType(tmp, val, literalSearch);
+ if (literalSearch === true) {
+ if (tmp === true) {
+ return true;
+ }
+ continue;
}
lev_distance = Math.min(tmp, lev_distance);
if (lev_distance === 0) {
return literalSearch === true ? false : lev_distance;
}
- function checkReturned(obj, val, literalSearch) {
+ function checkReturned(obj, val, literalSearch, typeFilter) {
var lev_distance = MAX_LEV_DISTANCE + 1;
if (obj && obj.type && obj.type.length > OUTPUT_DATA) {
var ret = obj.type[OUTPUT_DATA];
- if (!obj.type[OUTPUT_DATA].length) {
+ if (typeof ret[0] === "string") {
ret = [ret];
}
for (var x = 0; x < ret.length; ++x) {
- var r = ret[x];
- if (typeof r === "string") {
- r = [r];
+ var tmp = ret[x];
+ if (typePassesFilter(typeFilter, tmp[1]) === false) {
+ continue;
}
- var tmp = checkType(r, val, literalSearch);
+ tmp = checkType(tmp, val, literalSearch);
if (literalSearch === true) {
if (tmp === true) {
return true;
function typePassesFilter(filter, type) {
// No filter
- if (filter < 0) return true;
+ if (filter <= NO_TYPE_FILTER) return true;
// Exact match
if (filter === type) return true;
var name = itemTypes[type];
switch (itemTypes[filter]) {
case "constant":
- return (name == "associatedconstant");
+ return name === "associatedconstant";
case "fn":
- return (name == "method" || name == "tymethod");
+ return name === "method" || name === "tymethod";
case "type":
- return (name == "primitive" || name == "keyword");
+ return name === "primitive" || name === "associatedtype";
+ case "trait":
+ return name === "traitalias";
}
// No match
if (filterCrates !== undefined && searchIndex[i].crate !== filterCrates) {
continue;
}
- in_args = findArg(searchIndex[i], val, true);
- returned = checkReturned(searchIndex[i], val, true);
+ in_args = findArg(searchIndex[i], val, true, typeFilter);
+ returned = checkReturned(searchIndex[i], val, true, typeFilter);
ty = searchIndex[i];
fullId = generateId(ty);
- if (searchWords[i] === val.name) {
- // filter type: ... queries
- if (typePassesFilter(typeFilter, searchIndex[i].ty) &&
- results[fullId] === undefined)
- {
- results[fullId] = {id: i, index: -1};
- }
- } else if ((in_args === true || returned === true) &&
- typePassesFilter(typeFilter, searchIndex[i].ty)) {
- if (in_args === true || returned === true) {
- if (in_args === true) {
- results_in_args[fullId] = {
- id: i,
- index: -1,
- dontValidate: true,
- };
- }
- if (returned === true) {
- results_returned[fullId] = {
- id: i,
- index: -1,
- dontValidate: true,
- };
- }
- } else {
- results[fullId] = {
- id: i,
- index: -1,
- dontValidate: true,
- };
- }
+ if (searchWords[i] === val.name
+ && typePassesFilter(typeFilter, searchIndex[i].ty)
+ && results[fullId] === undefined) {
+ results[fullId] = {
+ id: i,
+ index: -1,
+ dontValidate: true,
+ };
+ }
+ if (in_args === true && results_in_args[fullId] === undefined) {
+ results_in_args[fullId] = {
+ id: i,
+ index: -1,
+ dontValidate: true,
+ };
+ }
+ if (returned === true && results_returned[fullId] === undefined) {
+ results_returned[fullId] = {
+ id: i,
+ index: -1,
+ dontValidate: true,
+ };
}
}
query.inputs = [val];
// allow searching for void (no output) functions as well
var typeOutput = type.length > OUTPUT_DATA ? type[OUTPUT_DATA].name : "";
- returned = checkReturned(ty, output, true);
+ returned = checkReturned(ty, output, true, NO_TYPE_FILTER);
if (output.name === "*" || returned === true) {
in_args = false;
var is_module = false;
lev += 1;
}
}
- if ((in_args = findArg(ty, valGenerics)) <= MAX_LEV_DISTANCE) {
- if (typePassesFilter(typeFilter, ty.ty) === false) {
- in_args = MAX_LEV_DISTANCE + 1;
- }
- }
- if ((returned = checkReturned(ty, valGenerics)) <= MAX_LEV_DISTANCE) {
- if (typePassesFilter(typeFilter, ty.ty) === false) {
- returned = MAX_LEV_DISTANCE + 1;
- }
- }
+ in_args = findArg(ty, valGenerics, false, typeFilter);
+ returned = checkReturned(ty, valGenerics, false, typeFilter);
lev += lev_add;
if (lev > 0 && val.length > 3 && searchWords[j].indexOf(val) > -1) {