rustdoc: restructure type search engine to pick-and-use IDs
This change makes it so, instead of mixing string distance with type unification, function signature search works by mapping names to IDs at the start, reporting to the user any cases where it had to make corrections, and then matches with IDs when going through the items. This only changes function searches. Name searches are left alone, and corrections are only done when there's a single item in the search query.
This commit is contained in:
parent
1a7132d4f8
commit
4c11822aeb
6 changed files with 353 additions and 203 deletions
|
@ -226,6 +226,24 @@ function runSearch(query, expected, doSearch, loadedFile, queryName) {
|
|||
return error_text;
|
||||
}
|
||||
|
||||
function runCorrections(query, corrections, getCorrections, loadedFile) {
|
||||
const qc = getCorrections(query, loadedFile.FILTER_CRATE);
|
||||
const error_text = [];
|
||||
|
||||
if (corrections === null) {
|
||||
if (qc !== null) {
|
||||
error_text.push(`==> expected = null, found = ${qc}`);
|
||||
}
|
||||
return error_text;
|
||||
}
|
||||
|
||||
if (qc !== corrections.toLowerCase()) {
|
||||
error_text.push(`==> expected = ${corrections}, found = ${qc}`);
|
||||
}
|
||||
|
||||
return error_text;
|
||||
}
|
||||
|
||||
function checkResult(error_text, loadedFile, displaySuccess) {
|
||||
if (error_text.length === 0 && loadedFile.should_fail === true) {
|
||||
console.log("FAILED");
|
||||
|
@ -272,9 +290,10 @@ function runCheck(loadedFile, key, callback) {
|
|||
return 0;
|
||||
}
|
||||
|
||||
function runChecks(testFile, doSearch, parseQuery) {
|
||||
function runChecks(testFile, doSearch, parseQuery, getCorrections) {
|
||||
let checkExpected = false;
|
||||
let checkParsed = false;
|
||||
let checkCorrections = false;
|
||||
let testFileContent = readFile(testFile) + "exports.QUERY = QUERY;";
|
||||
|
||||
if (testFileContent.indexOf("FILTER_CRATE") !== -1) {
|
||||
|
@ -291,9 +310,13 @@ function runChecks(testFile, doSearch, parseQuery) {
|
|||
testFileContent += "exports.PARSED = PARSED;";
|
||||
checkParsed = true;
|
||||
}
|
||||
if (!checkParsed && !checkExpected) {
|
||||
if (testFileContent.indexOf("\nconst CORRECTIONS") !== -1) {
|
||||
testFileContent += "exports.CORRECTIONS = CORRECTIONS;";
|
||||
checkCorrections = true;
|
||||
}
|
||||
if (!checkParsed && !checkExpected && !checkCorrections) {
|
||||
console.log("FAILED");
|
||||
console.log("==> At least `PARSED` or `EXPECTED` is needed!");
|
||||
console.log("==> At least `PARSED`, `EXPECTED`, or `CORRECTIONS` is needed!");
|
||||
return 1;
|
||||
}
|
||||
|
||||
|
@ -310,6 +333,11 @@ function runChecks(testFile, doSearch, parseQuery) {
|
|||
return runParser(query, expected, parseQuery, text);
|
||||
});
|
||||
}
|
||||
if (checkCorrections) {
|
||||
res += runCheck(loadedFile, "CORRECTIONS", (query, expected) => {
|
||||
return runCorrections(query, expected, getCorrections, loadedFile);
|
||||
});
|
||||
}
|
||||
return res;
|
||||
}
|
||||
|
||||
|
@ -318,9 +346,10 @@ function runChecks(testFile, doSearch, parseQuery) {
|
|||
*
|
||||
* @param {string} doc_folder - Path to a folder generated by running rustdoc
|
||||
* @param {string} resource_suffix - Version number between filename and .js, e.g. "1.59.0"
|
||||
* @returns {Object} - Object containing two keys: `doSearch`, which runs a search
|
||||
* with the loaded index and returns a table of results; and `parseQuery`, which is the
|
||||
* `parseQuery` function exported from the search module.
|
||||
* @returns {Object} - Object containing keys: `doSearch`, which runs a search
|
||||
* with the loaded index and returns a table of results; `parseQuery`, which is the
|
||||
* `parseQuery` function exported from the search module; and `getCorrections`, which runs
|
||||
* a search but returns type name corrections instead of results.
|
||||
*/
|
||||
function loadSearchJS(doc_folder, resource_suffix) {
|
||||
const searchIndexJs = path.join(doc_folder, "search-index" + resource_suffix + ".js");
|
||||
|
@ -336,6 +365,12 @@ function loadSearchJS(doc_folder, resource_suffix) {
|
|||
return searchModule.execQuery(searchModule.parseQuery(queryStr), searchWords,
|
||||
filterCrate, currentCrate);
|
||||
},
|
||||
getCorrections: function(queryStr, filterCrate, currentCrate) {
|
||||
const parsedQuery = searchModule.parseQuery(queryStr);
|
||||
searchModule.execQuery(parsedQuery, searchWords,
|
||||
filterCrate, currentCrate);
|
||||
return parsedQuery.correction;
|
||||
},
|
||||
parseQuery: searchModule.parseQuery,
|
||||
};
|
||||
}
|
||||
|
@ -417,11 +452,14 @@ function main(argv) {
|
|||
const doSearch = function(queryStr, filterCrate) {
|
||||
return parseAndSearch.doSearch(queryStr, filterCrate, opts["crate_name"]);
|
||||
};
|
||||
const getCorrections = function(queryStr, filterCrate) {
|
||||
return parseAndSearch.getCorrections(queryStr, filterCrate, opts["crate_name"]);
|
||||
};
|
||||
|
||||
if (opts["test_file"].length !== 0) {
|
||||
opts["test_file"].forEach(file => {
|
||||
process.stdout.write(`Testing ${file} ... `);
|
||||
errors += runChecks(file, doSearch, parseAndSearch.parseQuery);
|
||||
errors += runChecks(file, doSearch, parseAndSearch.parseQuery, getCorrections);
|
||||
});
|
||||
} else if (opts["test_folder"].length !== 0) {
|
||||
fs.readdirSync(opts["test_folder"]).forEach(file => {
|
||||
|
@ -430,7 +468,7 @@ function main(argv) {
|
|||
}
|
||||
process.stdout.write(`Testing ${file} ... `);
|
||||
errors += runChecks(path.join(opts["test_folder"], file), doSearch,
|
||||
parseAndSearch.parseQuery);
|
||||
parseAndSearch.parseQuery, getCorrections);
|
||||
});
|
||||
}
|
||||
return errors > 0 ? 1 : 0;
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue