// This file contains type definitions that are processed by the Closure Compiler but are
// not put into the JavaScript we include as part of the documentation. It is used for
// type checking. See README.md in this directory for more info.

/* eslint-disable */
let searchState;
function initSearch(searchIndex){}

/**
 * @typedef {{
 *     name: string,
 *     id: integer|null,
 *     fullPath: Array<string>,
 *     pathWithoutLast: Array<string>,
 *     pathLast: string,
 *     generics: Array<QueryElement>,
 *     bindings: Map<integer, Array<QueryElement>>,
 * }}
 */
let QueryElement;

/**
 * @typedef {{
 *      pos: number,
 *      totalElems: number,
 *      typeFilter: (null|string),
 *      userQuery: string,
 *      isInBinding: (null|string),
 * }}
 */
let ParserState;

/**
 * @typedef {{
 *     original: string,
 *     userQuery: string,
 *     typeFilter: number,
 *     elems: Array<QueryElement>,
 *     args: Array<QueryElement>,
 *     returned: Array<QueryElement>,
 *     foundElems: number,
 *     totalElems: number,
 *     literalSearch: boolean,
 *     corrections: Array<{from: string, to: integer}>,
 *     typeFingerprint: Uint32Array,
 * }}
 */
let ParsedQuery;

/**
 * @typedef {{
 *    crate: string,
 *    desc: string,
 *    id: number,
 *    name: string,
 *    normalizedName: string,
 *    parent: (Object|null|undefined),
 *    path: string,
 *    ty: (Number|null|number),
 *    type: FunctionSearchType?
 * }}
 */
let Row;

/**
 * @typedef {{
 *    in_args: Array<Object>,
 *    returned: Array<Object>,
 *    others: Array<Object>,
 *    query: ParsedQuery,
 * }}
 */
let ResultsTable;

/**
 * @typedef {Map<String, ResultObject>}
 */
let Results;

/**
 * @typedef {{
 *     desc: string,
 *     displayPath: string,
 *     fullPath: string,
 *     href: string,
 *     id: number,
 *     lev: number,
 *     name: string,
 *     normalizedName: string,
 *     parent: (Object|undefined),
 *     path: string,
 *     ty: number,
 * }}
 */
let ResultObject;

/**
 * A pair of [inputs, outputs], or 0 for null. This is stored in the search index.
 * The JavaScript deserializes this into FunctionSearchType.
 *
 * Numeric IDs are *ONE-indexed* into the paths array (`p`). Zero is used as a sentinel for `null`
 * because `null` is four bytes while `0` is one byte.
 *
 * An input or output can be encoded as just a number if there is only one of them, AND
 * it has no generics. The no generics rule exists to avoid ambiguity: imagine if you had
 * a function with a single output, and that output had a single generic:
 *
 *     fn something() -> Result<usize, usize>
 *
 * If output was allowed to be any RawFunctionType, it would look like thi
 *
 *     [[], [50, [3, 3]]]
 *
 * The problem is that the above output could be interpreted as either a type with ID 50 and two
 * generics, or it could be interpreted as a pair of types, the first one with ID 50 and the second
 * with ID 3 and a single generic parameter that is also ID 3. We avoid this ambiguity by choosing
 * in favor of the pair of types interpretation. This is why the `(number|Array<RawFunctionType>)`
 * is used instead of `(RawFunctionType|Array<RawFunctionType>)`.
 *
 * The output can be skipped if it's actually unit and there's no type constraints. If thi
 * function accepts constrained generics, then the output will be unconditionally emitted, and
 * after it will come a list of trait constraints. The position of the item in the list will
 * determine which type parameter it is. For example:
 *
 *     [1, 2, 3, 4, 5]
 *      ^  ^  ^  ^  ^
 *      |  |  |  |  - generic parameter (-3) of trait 5
 *      |  |  |  - generic parameter (-2) of trait 4
 *      |  |  - generic parameter (-1) of trait 3
 *      |  - this function returns a single value (type 2)
 *      - this function takes a single input parameter (type 1)
 *
 * Or, for a less contrived version:
 *
 *     [[[4, -1], 3], [[5, -1]], 11]
 *      -^^^^^^^----   ^^^^^^^   ^^
 *       |        |    |          - generic parameter, roughly `where -1: 11`
 *       |        |    |            since -1 is the type parameter and 11 the trait
 *       |        |    - function output 5<-1>
 *       |        - the overall function signature is something like
 *       |          `fn(4<-1>, 3) -> 5<-1> where -1: 11`
 *       - function input, corresponds roughly to 4<-1>
 *         4 is an index into the `p` array for a type
 *         -1 is the generic parameter, given by 11
 *
 * If a generic parameter has multiple trait constraints, it gets wrapped in an array, just like
 * function inputs and outputs:
 *
 *     [-1, -1, [4, 3]]
 *              ^^^^^^ where -1: 4 + 3
 *
 * If a generic parameter's trait constraint has generic parameters, it gets wrapped in the array
 * even if only one exists. In other words, the ambiguity of `4<3>` and `4 + 3` is resolved in
 * favor of `4 + 3`:
 *
 *     [-1, -1, [[4, 3]]]
 *              ^^^^^^^^ where -1: 4 + 3
 *
 *     [-1, -1, [5, [4, 3]]]
 *              ^^^^^^^^^^^ where -1: 5, -2: 4 + 3
 *
 * If a generic parameter has no trait constraints (like in Rust, the `Sized` constraint i
 * implied and a fake `?Sized` constraint used to note its absence), it will be filled in with 0.
 *
 * @typedef {(
 *     0 |
 *     [(number|Array<RawFunctionType>)] |
 *     [(number|Array<RawFunctionType>), (number|Array<RawFunctionType>)] |
 *     Array<(number|Array<RawFunctionType>)>
 * )}
 */
let RawFunctionSearchType;

/**
 * A single function input or output type. This is either a single path ID, or a pair of
 * [path ID, generics].
 *
 * Numeric IDs are *ONE-indexed* into the paths array (`p`). Zero is used as a sentinel for `null`
 * because `null` is four bytes while `0` is one byte.
 *
 * @typedef {number | [number, Array<RawFunctionType>]}
 */
let RawFunctionType;

/**
 * @typedef {{
 *     inputs: Array<FunctionType>,
 *     output: Array<FunctionType>,
 *     where_clause: Array<Array<FunctionType>>,
 * }}
 */
let FunctionSearchType;

/**
 * @typedef {{
 *     id: (null|number),
 *     ty: number,
 *     generics: Array<FunctionType>,
 *     bindings: Map<integer, Array<FunctionType>>,
 * }}
 */
let FunctionType;

/**
 * The raw search data for a given crate. `n`, `t`, `d`, `i`, and `f`
 * are arrays with the same length. `q`, `a`, and `c` use a sparse
 * representation for compactness.
 *
 * `n[i]` contains the name of an item.
 *
 * `t[i]` contains the type of that item
 * (as a string of characters that represent an offset in `itemTypes`).
 *
 * `d[i]` contains the description of that item.
 *
 * `q` contains the full paths of the items. For compactness, it is a set of
 * (index, path) pairs used to create a map. If a given index `i` is
 * not present, this indicates "same as the last index present".
 *
 * `i[i]` contains an item's parent, usually a module. For compactness,
 * it is a set of indexes into the `p` array.
 *
 * `f` contains function signatures, or `0` if the item isn't a function.
 * More information on how they're encoded can be found in rustc-dev-guide
 *
 * Functions are themselves encoded as arrays. The first item is a list of
 * types representing the function's inputs, and the second list item is a list
 * of types representing the function's output. Tuples are flattened.
 * Types are also represented as arrays; the first item is an index into the `p`
 * array, while the second is a list of types representing any generic parameters.
 *
 * b[i] contains an item's impl disambiguator. This is only present if an item
 * is defined in an impl block and, the impl block's type has more than one associated
 * item with the same name.
 *
 * `a` defines aliases with an Array of pairs: [name, offset], where `offset`
 * points into the n/t/d/q/i/f arrays.
 *
 * `doc` contains the description of the crate.
 *
 * `p` is a list of path/type pairs. It is used for parents and function parameters.
 * The first item is the type, the second is the name, the third is the visible path (if any) and
 * the fourth is the canonical path used for deduplication (if any).
 *
 * `r` is the canonical path used for deduplication of re-exported items.
 * It is not used for associated items like methods (that's the fourth element
 * of `p`) but is used for modules items like free functions.
 *
 * `c` is an array of item indices that are deprecated.
 * @typedef {{
 *   doc: string,
 *   a: Object,
 *   n: Array<string>,
 *   t: string,
 *   d: Array<string>,
 *   q: Array<[number, string]>,
 *   i: Array<number>,
 *   f: string,
 *   p: Array<[number, string] | [number, string, number] | [number, string, number, number]>,
 *   b: Array<[number, String]>,
 *   c: Array<number>,
 *   r: Array<[number, number]>,
 * }}
 */
let RawSearchIndexCrate;
