Rollup merge of #118452 - notriddle:coloncolonspace, r=GuillaumeGomez,jsha

rustdoc-search: allow spaces around `::` in path query

This restriction made sense back when spaces separated function parameters, but now that they separate path components, there's no real ambiguity any more.

Additionally, the Rust language allows it.

The other two commits are misc code cleanup.
This commit is contained in:
Matthias Krüger 2023-11-30 09:28:25 +01:00 committed by GitHub
commit e9a870d5eb
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
5 changed files with 98 additions and 50 deletions

View File

@ -287,10 +287,6 @@ function initSearch(rawSearchIndex) {
}
}
function isWhitespace(c) {
return " \t\n\r".indexOf(c) !== -1;
}
function isSpecialStartCharacter(c) {
return "<\"".indexOf(c) !== -1;
}
@ -408,7 +404,7 @@ function initSearch(rawSearchIndex) {
* @return {boolean}
*/
function isPathSeparator(c) {
return c === ":" || isWhitespace(c);
return c === ":" || c === " ";
}
/**
@ -425,7 +421,7 @@ function initSearch(rawSearchIndex) {
const c = parserState.userQuery[pos - 1];
if (c === lookingFor) {
return true;
} else if (!isWhitespace(c)) {
} else if (c !== " ") {
break;
}
pos -= 1;
@ -454,7 +450,7 @@ function initSearch(rawSearchIndex) {
function skipWhitespace(parserState) {
while (parserState.pos < parserState.userQuery.length) {
const c = parserState.userQuery[parserState.pos];
if (!isWhitespace(c)) {
if (c !== " ") {
break;
}
parserState.pos += 1;
@ -473,8 +469,6 @@ function initSearch(rawSearchIndex) {
const path = name.trim();
if (path.length === 0 && generics.length === 0) {
throw ["Unexpected ", parserState.userQuery[parserState.pos]];
} else if (path === "*") {
throw ["Unexpected ", "*"];
}
if (query.literalSearch && parserState.totalElems - parserState.genericsElems > 0) {
throw ["Cannot have more than one element if you use quotes"];
@ -512,18 +506,15 @@ function initSearch(rawSearchIndex) {
bindingName,
};
}
const quadcolon = /::\s*::/.exec(path);
if (path.startsWith("::")) {
throw ["Paths cannot start with ", "::"];
} else if (path.endsWith("::")) {
throw ["Paths cannot end with ", "::"];
} else if (path.includes("::::")) {
throw ["Unexpected ", "::::"];
} else if (path.includes(" ::")) {
throw ["Unexpected ", " ::"];
} else if (path.includes(":: ")) {
throw ["Unexpected ", ":: "];
} else if (quadcolon !== null) {
throw ["Unexpected ", quadcolon[0]];
}
const pathSegments = path.split(/::|\s+/);
const pathSegments = path.split(/(?:::\s*)|(?:\s+(?:::\s*)?)/);
// In case we only have something like `<p>`, there is no name.
if (pathSegments.length === 0 || (pathSegments.length === 1 && pathSegments[0] === "")) {
if (generics.length > 0 || prevIs(parserState, ">")) {
@ -604,7 +595,7 @@ function initSearch(rawSearchIndex) {
} else {
while (parserState.pos + 1 < parserState.length) {
const next_c = parserState.userQuery[parserState.pos + 1];
if (!isWhitespace(next_c)) {
if (next_c !== " ") {
break;
}
parserState.pos += 1;
@ -958,7 +949,7 @@ function initSearch(rawSearchIndex) {
query.literalSearch = false;
foundStopChar = true;
continue;
} else if (isWhitespace(c)) {
} else if (c === " ") {
skipWhitespace(parserState);
continue;
}
@ -1118,7 +1109,7 @@ function initSearch(rawSearchIndex) {
}
}
}
userQuery = userQuery.trim();
userQuery = userQuery.trim().replace(/\r|\n|\t/g, " ");
const parserState = {
length: userQuery.length,
pos: 0,

View File

@ -17,6 +17,15 @@ const PARSED = [
userQuery: "-> <p>",
error: "Found generics without a path",
},
{
query: '-> *',
elems: [],
foundElems: 0,
original: "-> *",
returned: [],
userQuery: "-> *",
error: "Unexpected `*`",
},
{
query: 'a<"P">',
elems: [],
@ -143,6 +152,24 @@ const PARSED = [
userQuery: "a::::b",
error: "Unexpected `::::`",
},
{
query: "a:: ::b",
elems: [],
foundElems: 0,
original: "a:: ::b",
returned: [],
userQuery: "a:: ::b",
error: "Unexpected `:: ::`",
},
{
query: "a::\t::b",
elems: [],
foundElems: 0,
original: "a:: ::b",
returned: [],
userQuery: "a:: ::b",
error: "Unexpected `:: ::`",
},
{
query: "a::b::",
elems: [],
@ -314,24 +341,6 @@ const PARSED = [
userQuery: 'a<->',
error: 'Unexpected `-` after `<`',
},
{
query: "a:: a",
elems: [],
foundElems: 0,
original: 'a:: a',
returned: [],
userQuery: 'a:: a',
error: 'Unexpected `:: `',
},
{
query: "a ::a",
elems: [],
foundElems: 0,
original: 'a ::a',
returned: [],
userQuery: 'a ::a',
error: 'Unexpected ` ::`',
},
{
query: "a<a>:",
elems: [],

View File

@ -15,6 +15,54 @@ const PARSED = [
userQuery: "a::b",
error: null,
},
{
query: "a:: a",
elems: [{
name: "a:: a",
fullPath: ["a", "a"],
pathWithoutLast: ["a"],
pathLast: "a",
generics: [],
typeFilter: -1,
}],
foundElems: 1,
original: 'a:: a',
returned: [],
userQuery: 'a:: a',
error: null,
},
{
query: "a ::a",
elems: [{
name: "a ::a",
fullPath: ["a", "a"],
pathWithoutLast: ["a"],
pathLast: "a",
generics: [],
typeFilter: -1,
}],
foundElems: 1,
original: 'a ::a',
returned: [],
userQuery: 'a ::a',
error: null,
},
{
query: "a :: a",
elems: [{
name: "a :: a",
fullPath: ["a", "a"],
pathWithoutLast: ["a"],
pathLast: "a",
generics: [],
typeFilter: -1,
}],
foundElems: 1,
original: 'a :: a',
returned: [],
userQuery: 'a :: a',
error: null,
},
{
query: 'A::B,C',
elems: [

View File

@ -5,7 +5,7 @@ const PARSED = [
query: 'aaaaaa b',
elems: [
{
name: 'aaaaaa\tb',
name: 'aaaaaa b',
fullPath: ['aaaaaa', 'b'],
pathWithoutLast: ['aaaaaa'],
pathLast: 'b',
@ -14,9 +14,9 @@ const PARSED = [
},
],
foundElems: 1,
original: "aaaaaa b",
original: "aaaaaa b",
returned: [],
userQuery: "aaaaaa b",
userQuery: "aaaaaa b",
error: null,
},
{
@ -40,9 +40,9 @@ const PARSED = [
},
],
foundElems: 2,
original: "aaaaaa, b",
original: "aaaaaa, b",
returned: [],
userQuery: "aaaaaa, b",
userQuery: "aaaaaa, b",
error: null,
},
{
@ -93,7 +93,7 @@ const PARSED = [
query: 'a\tb',
elems: [
{
name: 'a\tb',
name: 'a b',
fullPath: ['a', 'b'],
pathWithoutLast: ['a'],
pathLast: 'b',
@ -102,9 +102,9 @@ const PARSED = [
},
],
foundElems: 1,
original: "a\tb",
original: "a b",
returned: [],
userQuery: "a\tb",
userQuery: "a b",
error: null,
},
{
@ -176,7 +176,7 @@ const PARSED = [
pathLast: 'a',
generics: [
{
name: 'b\tc',
name: 'b c',
fullPath: ['b', 'c'],
pathWithoutLast: ['b'],
pathLast: 'c',
@ -187,9 +187,9 @@ const PARSED = [
},
],
foundElems: 1,
original: "a<b\tc>",
original: "a<b c>",
returned: [],
userQuery: "a<b\tc>",
userQuery: "a<b c>",
error: null,
},
];

View File

@ -92,9 +92,9 @@ const PARSED = [
query: 'mod\t:',
elems: [],
foundElems: 0,
original: 'mod\t:',
original: 'mod :',
returned: [],
userQuery: 'mod\t:',
userQuery: 'mod :',
error: "Unexpected `:` (expected path after type filter `mod:`)",
},
];