// Copyright (c) 2015, the Dart project authors.  Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.
//
// This file has been automatically generated.  Please do not edit it manually.
// To regenerate the file, use the script "pkg/analyzer/tool/generate_files".


/**
 * Kind of a source in the cache.
 */
enum CacheSourceKind : byte {
  library,

  part
}

/**
 * Enum used to indicate the kind of a name in index.
 */
enum IndexNameKind : byte {
  /**
   * A top-level element.
   */
  topLevel,

  /**
   * A class member.
   */
  classMember
}

/**
 * Enum used to indicate the kind of an index relation.
 */
enum IndexRelationKind : byte {
  /**
   * Left: class.
   *   Is ancestor of (is extended or implemented, directly or indirectly).
   * Right: other class declaration.
   */
  IS_ANCESTOR_OF,

  /**
   * Left: class.
   *   Is extended by.
   * Right: other class declaration.
   */
  IS_EXTENDED_BY,

  /**
   * Left: class.
   *   Is implemented by.
   * Right: other class declaration.
   */
  IS_IMPLEMENTED_BY,

  /**
   * Left: class.
   *   Is mixed into.
   * Right: other class declaration.
   */
  IS_MIXED_IN_BY,

  /**
   * Left: method, property accessor, function, variable.
   *   Is invoked at.
   * Right: location.
   */
  IS_INVOKED_BY,

  /**
   * Left: any element.
   *   Is referenced (and not invoked, read/written) at.
   * Right: location.
   */
  IS_REFERENCED_BY,

  /**
   * Left: unresolved member name.
   *   Is read at.
   * Right: location.
   */
  IS_READ_BY,

  /**
   * Left: unresolved member name.
   *   Is both read and written at.
   * Right: location.
   */
  IS_READ_WRITTEN_BY,

  /**
   * Left: unresolved member name.
   *   Is written at.
   * Right: location.
   */
  IS_WRITTEN_BY
}

/**
 * When we need to reference a synthetic element in [PackageIndex] we use a
 * value of this enum to specify which kind of the synthetic element we
 * actually reference.
 */
enum IndexSyntheticElementKind : byte {
  /**
   * Not a synthetic element.
   */
  notSynthetic,

  /**
   * The unnamed synthetic constructor a class element.
   */
  constructor,

  /**
   * The synthetic field element.
   */
  field,

  /**
   * The synthetic getter of a property introducing element.
   */
  getter,

  /**
   * The synthetic setter of a property introducing element.
   */
  setter,

  /**
   * The synthetic top-level variable element.
   */
  topLevelVariable,

  /**
   * The synthetic `loadLibrary` element.
   */
  loadLibrary,

  /**
   * The synthetic `index` getter of an enum.
   */
  enumIndex,

  /**
   * The synthetic `values` getter of an enum.
   */
  enumValues
}

/**
 * Enum used to indicate the kind of entity referred to by a
 * [LinkedReference].
 */
enum ReferenceKind : byte {
  /**
   * The entity is a class or enum.
   */
  classOrEnum,

  /**
   * The entity is a constructor.
   */
  constructor,

  /**
   * The entity is a getter or setter inside a class.  Note: this is used in
   * the case where a constant refers to a static const declared inside a
   * class.
   */
  propertyAccessor,

  /**
   * The entity is a method.
   */
  method,

  /**
   * The entity is a typedef.
   */
  typedef,

  /**
   * The entity is a local function.
   */
  function,

  /**
   * The entity is a local variable.
   */
  variable,

  /**
   * The entity is a top level function.
   */
  topLevelFunction,

  /**
   * The entity is a top level getter or setter.
   */
  topLevelPropertyAccessor,

  /**
   * The entity is a prefix.
   */
  prefix,

  /**
   * The entity being referred to does not exist.
   */
  unresolved
}

/**
 * Enum representing the various kinds of operations which may be performed to
 * produce a constant value.  These options are assumed to execute in the
 * context of a stack which is initially empty.
 */
enum UnlinkedConstOperation : byte {
  /**
   * Push the next value from [UnlinkedConst.ints] (a 32-bit unsigned integer)
   * onto the stack.
   *
   * Note that Dart supports integers larger than 32 bits; these are
   * represented by composing 32-bit values using the [pushLongInt] operation.
   */
  pushInt,

  /**
   * Get the number of components from [UnlinkedConst.ints], then do this number
   * of times the following operations: multiple the current value by 2^32, "or"
   * it with the next value in [UnlinkedConst.ints]. The initial value is zero.
   * Push the result into the stack.
   */
  pushLongInt,

  /**
   * Push the next value from [UnlinkedConst.doubles] (a double precision
   * floating point value) onto the stack.
   */
  pushDouble,

  /**
   * Push the constant `true` onto the stack.
   */
  pushTrue,

  /**
   * Push the constant `false` onto the stack.
   */
  pushFalse,

  /**
   * Push the next value from [UnlinkedConst.strings] onto the stack.
   */
  pushString,

  /**
   * Pop the top n values from the stack (where n is obtained from
   * [UnlinkedConst.ints]), convert them to strings (if they aren't already),
   * concatenate them into a single string, and push it back onto the stack.
   *
   * This operation is used to represent constants whose value is a literal
   * string containing string interpolations.
   */
  concatenate,

  /**
   * Get the next value from [UnlinkedConst.strings], convert it to a symbol,
   * and push it onto the stack.
   */
  makeSymbol,

  /**
   * Push the constant `null` onto the stack.
   */
  pushNull,

  /**
   * Push the value of the constant constructor parameter with
   * the name obtained from [UnlinkedConst.strings].
   */
  pushConstructorParameter,

  /**
   * Evaluate a (potentially qualified) identifier expression and push the
   * resulting value onto the stack.  The identifier to be evaluated is
   * obtained from [UnlinkedConst.references].
   *
   * This operation is used to represent the following kinds of constants
   * (which are indistinguishable from an unresolved AST alone):
   *
   * - A qualified reference to a static constant variable (e.g. `C.v`, where
   *   C is a class and `v` is a constant static variable in `C`).
   * - An identifier expression referring to a constant variable.
   * - A simple or qualified identifier denoting a class or type alias.
   * - A simple or qualified identifier denoting a top-level function or a
   *   static method.
   */
  pushReference,

  /**
   * Pop the top value from the stack, extract the value of the property with
   * the name obtained from [UnlinkedConst.strings], and push the result back
   * onto the stack.
   */
  extractProperty,

  /**
   * Pop the top `n` values from the stack (where `n` is obtained from
   * [UnlinkedConst.ints]) into a list (filled from the end) and take the next
   * `n` values from [UnlinkedConst.strings] and use the lists of names and
   * values to create named arguments.  Then pop the top `m` values from the
   * stack (where `m` is obtained from [UnlinkedConst.ints]) into a list (filled
   * from the end) and use them as positional arguments.  Use the lists of
   * positional and names arguments to invoke a constant constructor obtained
   * from [UnlinkedConst.references], and push the resulting value back onto the
   * stack.
   *
   * Note that for an invocation of the form `const a.b(...)` (where no type
   * arguments are specified), it is impossible to tell from the unresolved AST
   * alone whether `a` is a class name and `b` is a constructor name, or `a` is
   * a prefix name and `b` is a class name.  For consistency between AST based
   * and elements based summaries, references to default constructors are always
   * recorded as references to corresponding classes.
   */
  invokeConstructor,

  /**
   * Pop the top n values from the stack (where n is obtained from
   * [UnlinkedConst.ints]), place them in a [List], and push the result back
   * onto the stack.  The type parameter for the [List] is implicitly `dynamic`.
   */
  makeUntypedList,

  /**
   * Pop the top 2*n values from the stack (where n is obtained from
   * [UnlinkedConst.ints]), interpret them as key/value pairs, place them in a
   * [Map], and push the result back onto the stack.  The two type parameters
   * for the [Map] are implicitly `dynamic`.
   */
  makeUntypedMap,

  /**
   * Pop the top n values from the stack (where n is obtained from
   * [UnlinkedConst.ints]), place them in a [List], and push the result back
   * onto the stack.  The type parameter for the [List] is obtained from
   * [UnlinkedConst.references].
   */
  makeTypedList,

  /**
   * Pop the top 2*n values from the stack (where n is obtained from
   * [UnlinkedConst.ints]), interpret them as key/value pairs, place them in a
   * [Map], and push the result back onto the stack.  The two type parameters for
   * the [Map] are obtained from [UnlinkedConst.references].
   */
  makeTypedMap,

  /**
   * Pop the top 2 values from the stack, evaluate `v1 == v2`, and push the
   * result back onto the stack.
   */
  equal,

  /**
   * Pop the top 2 values from the stack, evaluate `v1 != v2`, and push the
   * result back onto the stack.
   */
  notEqual,

  /**
   * Pop the top value from the stack, compute its boolean negation, and push
   * the result back onto the stack.
   */
  not,

  /**
   * Pop the top 2 values from the stack, compute `v1 && v2`, and push the
   * result back onto the stack.
   */
  and,

  /**
   * Pop the top 2 values from the stack, compute `v1 || v2`, and push the
   * result back onto the stack.
   */
  or,

  /**
   * Pop the top value from the stack, compute its integer complement, and push
   * the result back onto the stack.
   */
  complement,

  /**
   * Pop the top 2 values from the stack, compute `v1 ^ v2`, and push the
   * result back onto the stack.
   */
  bitXor,

  /**
   * Pop the top 2 values from the stack, compute `v1 & v2`, and push the
   * result back onto the stack.
   */
  bitAnd,

  /**
   * Pop the top 2 values from the stack, compute `v1 | v2`, and push the
   * result back onto the stack.
   */
  bitOr,

  /**
   * Pop the top 2 values from the stack, compute `v1 >> v2`, and push the
   * result back onto the stack.
   */
  bitShiftRight,

  /**
   * Pop the top 2 values from the stack, compute `v1 << v2`, and push the
   * result back onto the stack.
   */
  bitShiftLeft,

  /**
   * Pop the top 2 values from the stack, compute `v1 + v2`, and push the
   * result back onto the stack.
   */
  add,

  /**
   * Pop the top value from the stack, compute its integer negation, and push
   * the result back onto the stack.
   */
  negate,

  /**
   * Pop the top 2 values from the stack, compute `v1 - v2`, and push the
   * result back onto the stack.
   */
  subtract,

  /**
   * Pop the top 2 values from the stack, compute `v1 * v2`, and push the
   * result back onto the stack.
   */
  multiply,

  /**
   * Pop the top 2 values from the stack, compute `v1 / v2`, and push the
   * result back onto the stack.
   */
  divide,

  /**
   * Pop the top 2 values from the stack, compute `v1 ~/ v2`, and push the
   * result back onto the stack.
   */
  floorDivide,

  /**
   * Pop the top 2 values from the stack, compute `v1 > v2`, and push the
   * result back onto the stack.
   */
  greater,

  /**
   * Pop the top 2 values from the stack, compute `v1 < v2`, and push the
   * result back onto the stack.
   */
  less,

  /**
   * Pop the top 2 values from the stack, compute `v1 >= v2`, and push the
   * result back onto the stack.
   */
  greaterEqual,

  /**
   * Pop the top 2 values from the stack, compute `v1 <= v2`, and push the
   * result back onto the stack.
   */
  lessEqual,

  /**
   * Pop the top 2 values from the stack, compute `v1 % v2`, and push the
   * result back onto the stack.
   */
  modulo,

  /**
   * Pop the top 3 values from the stack, compute `v1 ? v2 : v3`, and push the
   * result back onto the stack.
   */
  conditional,

  /**
   * Pop from the stack `value` and get the next `target` reference from
   * [UnlinkedConst.references] - a top-level variable (prefixed or not), an
   * assignable field of a class (prefixed or not), or a sequence of getters
   * ending with an assignable property `a.b.b.c.d.e`.  In general `a.b` cannot
   * not be distinguished between: `a` is a prefix and `b` is a top-level
   * variable; or `a` is an object and `b` is the name of a property.  Perform
   * `reference op= value` where `op` is the next assignment operator from
   * [UnlinkedConst.assignmentOperators].  Push `value` back into the stack.
   *
   * If the assignment operator is a prefix/postfix increment/decrement, then
   * `value` is not present in the stack, so it should not be popped and the
   * corresponding value of the `target` after/before update is pushed into the
   * stack instead.
   */
  assignToRef,

  /**
   * Pop from the stack `value` and `target`.  Get the name of the property from
   * `UnlinkedConst.strings` and assign the `value` to the named property of the
   * `target`.  This operation is used when we know that the `target` is an
   * object reference expression, e.g. `new Foo().a.b.c` or `a.b[0].c.d`.
   * Perform `target.property op= value` where `op` is the next assignment
   * operator from [UnlinkedConst.assignmentOperators].  Push `value` back into
   * the stack.
   *
   * If the assignment operator is a prefix/postfix increment/decrement, then
   * `value` is not present in the stack, so it should not be popped and the
   * corresponding value of the `target` after/before update is pushed into the
   * stack instead.
   */
  assignToProperty,

  /**
   * Pop from the stack `value`, `index` and `target`.  Perform
   * `target[index] op= value`  where `op` is the next assignment operator from
   * [UnlinkedConst.assignmentOperators].  Push `value` back into the stack.
   *
   * If the assignment operator is a prefix/postfix increment/decrement, then
   * `value` is not present in the stack, so it should not be popped and the
   * corresponding value of the `target` after/before update is pushed into the
   * stack instead.
   */
  assignToIndex,

  /**
   * Pop from the stack `index` and `target`.  Push into the stack the result
   * of evaluation of `target[index]`.
   */
  extractIndex,

  /**
   * Pop the top `n` values from the stack (where `n` is obtained from
   * [UnlinkedConst.ints]) into a list (filled from the end) and take the next
   * `n` values from [UnlinkedConst.strings] and use the lists of names and
   * values to create named arguments.  Then pop the top `m` values from the
   * stack (where `m` is obtained from [UnlinkedConst.ints]) into a list (filled
   * from the end) and use them as positional arguments.  Use the lists of
   * positional and names arguments to invoke a method (or a function) with
   * the reference from [UnlinkedConst.references].  Push the result of
   * invocation value into the stack.
   *
   * In general `a.b` cannot not be distinguished between: `a` is a prefix and
   * `b` is a top-level function; or `a` is an object and `b` is the name of a
   * method.  This operation should be used for a sequence of identifiers
   * `a.b.b.c.d.e` ending with an invokable result.
   */
  invokeMethodRef,

  /**
   * Pop the top `n` values from the stack (where `n` is obtained from
   * [UnlinkedConst.ints]) into a list (filled from the end) and take the next
   * `n` values from [UnlinkedConst.strings] and use the lists of names and
   * values to create named arguments.  Then pop the top `m` values from the
   * stack (where `m` is obtained from [UnlinkedConst.ints]) into a list (filled
   * from the end) and use them as positional arguments.  Use the lists of
   * positional and names arguments to invoke the method with the name from
   * [UnlinkedConst.strings] of the target popped from the stack, and push the
   * resulting value into the stack.
   *
   * This operation should be used for invocation of a method invocation
   * where `target` is know to be an object instance.
   */
  invokeMethod
}

/**
 * Enum used to indicate the kind of an constructor initializer.
 */
enum UnlinkedConstructorInitializerKind : byte {
  /**
   * Initialization of a field.
   */
  field,

  /**
   * Invocation of a constructor in the same class.
   */
  thisInvocation,

  /**
   * Invocation of a superclass' constructor.
   */
  superInvocation
}

/**
 * Enum used to indicate the kind of an executable.
 */
enum UnlinkedExecutableKind : byte {
  /**
   * Executable is a function or method.
   */
  functionOrMethod,

  /**
   * Executable is a getter.
   */
  getter,

  /**
   * Executable is a setter.
   */
  setter,

  /**
   * Executable is a constructor.
   */
  constructor
}

/**
 * Enum representing the various kinds of assignment operations combined
 * with:
 *    [UnlinkedConstOperation.assignToRef],
 *    [UnlinkedConstOperation.assignToProperty],
 *    [UnlinkedConstOperation.assignToIndex].
 */
enum UnlinkedExprAssignOperator : byte {
  /**
   * Perform simple assignment `target = operand`.
   */
  assign,

  /**
   * Perform `target ??= operand`.
   */
  ifNull,

  /**
   * Perform `target *= operand`.
   */
  multiply,

  /**
   * Perform `target /= operand`.
   */
  divide,

  /**
   * Perform `target ~/= operand`.
   */
  floorDivide,

  /**
   * Perform `target %= operand`.
   */
  modulo,

  /**
   * Perform `target += operand`.
   */
  plus,

  /**
   * Perform `target -= operand`.
   */
  minus,

  /**
   * Perform `target <<= operand`.
   */
  shiftLeft,

  /**
   * Perform `target >>= operand`.
   */
  shiftRight,

  /**
   * Perform `target &= operand`.
   */
  bitAnd,

  /**
   * Perform `target ^= operand`.
   */
  bitXor,

  /**
   * Perform `target |= operand`.
   */
  bitOr,

  /**
   * Perform `++target`.
   */
  prefixIncrement,

  /**
   * Perform `--target`.
   */
  prefixDecrement,

  /**
   * Perform `target++`.
   */
  postfixIncrement,

  /**
   * Perform `target++`.
   */
  postfixDecrement
}

/**
 * Enum used to indicate the kind of a parameter.
 */
enum UnlinkedParamKind : byte {
  /**
   * Parameter is required.
   */
  required,

  /**
   * Parameter is positional optional (enclosed in `[]`)
   */
  positional,

  /**
   * Parameter is named optional (enclosed in `{}`)
   */
  named
}

/**
 * Information about a source that depends only on its content.
 */
table CacheSourceContent {
  /**
   * The list of exported URIs, e.g. `dart:core`, or `foo/bar.dart`,
   * or `package:foo/bar.dart`.  Empty if [kind] is [CacheSourceKind.part].
   */
  exportedUris:[string] (id: 2);

  /**
   * The list of explicitly imported URIs, e.g. `dart:core`, or `foo/bar.dart`,
   * or `package:foo/bar.dart`.  Empty if [kind] is [CacheSourceKind.part].
   */
  importedUris:[string] (id: 1);

  /**
   * The kind of the source.
   */
  kind:CacheSourceKind (id: 0);

  /**
   * The list of part URIs, e.g. `foo/bar.dart`.  Empty if [kind] is
   * [CacheSourceKind.part].
   */
  partUris:[string] (id: 3);
}

/**
 * Information about an element code range.
 */
table CodeRange {
  /**
   * Length of the element code.
   */
  length:uint (id: 1);

  /**
   * Offset of the element code relative to the beginning of the file.
   */
  offset:uint (id: 0);
}

/**
 * Summary information about a reference to a an entity such as a type, top
 * level executable, or executable within a class.
 */
table EntityRef {
  /**
   * If this is a reference to a function type implicitly defined by a
   * function-typed parameter, a list of zero-based indices indicating the path
   * from the entity referred to by [reference] to the appropriate type
   * parameter.  Otherwise the empty list.
   *
   * If there are N indices in this list, then the entity being referred to is
   * the function type implicitly defined by a function-typed parameter of a
   * function-typed parameter, to N levels of nesting.  The first index in the
   * list refers to the outermost level of nesting; for example if [reference]
   * refers to the entity defined by:
   *
   *     void f(x, void g(y, z, int h(String w))) { ... }
   *
   * Then to refer to the function type implicitly defined by parameter `h`
   * (which is parameter 2 of parameter 1 of `f`), then
   * [implicitFunctionTypeIndices] should be [1, 2].
   *
   * Note that if the entity being referred to is a generic method inside a
   * generic class, then the type arguments in [typeArguments] are applied
   * first to the class and then to the method.
   */
  implicitFunctionTypeIndices:[uint] (id: 4);

  /**
   * If this is a reference to a type parameter, one-based index into the list
   * of [UnlinkedTypeParam]s currently in effect.  Indexing is done using De
   * Bruijn index conventions; that is, innermost parameters come first, and
   * if a class or method has multiple parameters, they are indexed from right
   * to left.  So for instance, if the enclosing declaration is
   *
   *     class C<T,U> {
   *       m<V,W> {
   *         ...
   *       }
   *     }
   *
   * Then [paramReference] values of 1, 2, 3, and 4 represent W, V, U, and T,
   * respectively.
   *
   * If the type being referred to is not a type parameter, [paramReference] is
   * zero.
   */
  paramReference:uint (id: 3);

  /**
   * Index into [UnlinkedUnit.references] for the entity being referred to, or
   * zero if this is a reference to a type parameter.
   */
  reference:uint (id: 0);

  /**
   * If this [EntityRef] is contained within [LinkedUnit.types], slot id (which
   * is unique within the compilation unit) identifying the target of type
   * propagation or type inference with which this [EntityRef] is associated.
   *
   * Otherwise zero.
   */
  slot:uint (id: 2);

  /**
   * If this [EntityRef] is a reference to a function type whose
   * [FunctionElement] is not in any library (e.g. a function type that was
   * synthesized by a LUB computation), the function parameters.  Otherwise
   * empty.
   */
  syntheticParams:[UnlinkedParam] (id: 6);

  /**
   * If this [EntityRef] is a reference to a function type whose
   * [FunctionElement] is not in any library (e.g. a function type that was
   * synthesized by a LUB computation), the return type of the function.
   * Otherwise `null`.
   */
  syntheticReturnType:EntityRef (id: 5);

  /**
   * If this is an instantiation of a generic type or generic executable, the
   * type arguments used to instantiate it.  Trailing type arguments of type
   * `dynamic` are omitted.
   */
  typeArguments:[EntityRef] (id: 1);
}

/**
 * Information about a dependency that exists between one library and another
 * due to an "import" declaration.
 */
table LinkedDependency {
  /**
   * URI for the compilation units listed in the library's `part` declarations.
   * These URIs are relative to the importing library.
   */
  parts:[string] (id: 1);

  /**
   * The relative URI of the dependent library.  This URI is relative to the
   * importing library, even if there are intervening `export` declarations.
   * So, for example, if `a.dart` imports `b/c.dart` and `b/c.dart` exports
   * `d/e.dart`, the URI listed for `a.dart`'s dependency on `e.dart` will be
   * `b/d/e.dart`.
   */
  uri:string (id: 0);
}

/**
 * Information about a single name in the export namespace of the library that
 * is not in the public namespace.
 */
table LinkedExportName {
  /**
   * Index into [LinkedLibrary.dependencies] for the library in which the
   * entity is defined.
   */
  dependency:uint (id: 0);

  /**
   * The kind of the entity being referred to.
   */
  kind:ReferenceKind (id: 3);

  /**
   * Name of the exported entity.  For an exported setter, this name includes
   * the trailing '='.
   */
  name:string (id: 1);

  /**
   * Integer index indicating which unit in the exported library contains the
   * definition of the entity.  As with indices into [LinkedLibrary.units],
   * zero represents the defining compilation unit, and nonzero values
   * represent parts in the order of the corresponding `part` declarations.
   */
  unit:uint (id: 2);
}

/**
 * Linked summary of a library.
 */
table LinkedLibrary {
  /**
   * The libraries that this library depends on (either via an explicit import
   * statement or via the implicit dependencies on `dart:core` and
   * `dart:async`).  The first element of this array is a pseudo-dependency
   * representing the library itself (it is also used for `dynamic` and
   * `void`).  This is followed by elements representing "prelinked"
   * dependencies (direct imports and the transitive closure of exports).
   * After the prelinked dependencies are elements representing "linked"
   * dependencies.
   *
   * A library is only included as a "linked" dependency if it is a true
   * dependency (e.g. a propagated or inferred type or constant value
   * implicitly refers to an element declared in the library) or
   * anti-dependency (e.g. the result of type propagation or type inference
   * depends on the lack of a certain declaration in the library).
   */
  dependencies:[LinkedDependency] (id: 0);

  /**
   * Information about entities in the export namespace of the library that are
   * not in the public namespace of the library (that is, entities that are
   * brought into the namespace via `export` directives).
   *
   * Sorted by name.
   */
  exportNames:[LinkedExportName] (id: 4);

  /**
   * Indicates whether this library was summarized in "fallback mode".  If
   * true, all other fields in the data structure have their default values.
   */
  fallbackMode:bool (id: 5);

  /**
   * For each import in [UnlinkedUnit.imports], an index into [dependencies]
   * of the library being imported.
   */
  importDependencies:[uint] (id: 1);

  /**
   * The number of elements in [dependencies] which are not "linked"
   * dependencies (that is, the number of libraries in the direct imports plus
   * the transitive closure of exports, plus the library itself).
   */
  numPrelinkedDependencies:uint (id: 2);

  /**
   * The linked summary of all the compilation units constituting the
   * library.  The summary of the defining compilation unit is listed first,
   * followed by the summary of each part, in the order of the `part`
   * declarations in the defining compilation unit.
   */
  units:[LinkedUnit] (id: 3);
}

/**
 * Information about the resolution of an [UnlinkedReference].
 */
table LinkedReference {
  /**
   * If this [LinkedReference] doesn't have an associated [UnlinkedReference],
   * and the entity being referred to is contained within another entity, index
   * of the containing entity.  This behaves similarly to
   * [UnlinkedReference.prefixReference], however it is only used for class
   * members, not for prefixed imports.
   *
   * Containing references must always point backward; that is, for all i, if
   * LinkedUnit.references[i].containingReference != 0, then
   * LinkedUnit.references[i].containingReference < i.
   */
  containingReference:uint (id: 5);

  /**
   * Index into [LinkedLibrary.dependencies] indicating which imported library
   * declares the entity being referred to.
   *
   * Zero if this entity is contained within another entity (e.g. a class
   * member), or if [kind] is [ReferenceKind.prefix].
   */
  dependency:uint (id: 1);

  /**
   * The kind of the entity being referred to.  For the pseudo-types `dynamic`
   * and `void`, the kind is [ReferenceKind.classOrEnum].
   */
  kind:ReferenceKind (id: 2);

  /**
   * If [kind] is [ReferenceKind.function] (that is, the entity being referred
   * to is a local function), the index of the function within
   * [UnlinkedExecutable.localFunctions].  If [kind] is
   * [ReferenceKind.variable], the index of the variable within
   * [UnlinkedExecutable.localVariables].  Otherwise zero.
   */
  localIndex:uint (id: 6);

  /**
   * If this [LinkedReference] doesn't have an associated [UnlinkedReference],
   * name of the entity being referred to.  For the pseudo-type `dynamic`, the
   * string is "dynamic".  For the pseudo-type `void`, the string is "void".
   */
  name:string (id: 3);

  /**
   * If the entity being referred to is generic, the number of type parameters
   * it declares (does not include type parameters of enclosing entities).
   * Otherwise zero.
   */
  numTypeParameters:uint (id: 4);

  /**
   * Integer index indicating which unit in the imported library contains the
   * definition of the entity.  As with indices into [LinkedLibrary.units],
   * zero represents the defining compilation unit, and nonzero values
   * represent parts in the order of the corresponding `part` declarations.
   *
   * Zero if this entity is contained within another entity (e.g. a class
   * member).
   */
  unit:uint (id: 0);
}

/**
 * Linked summary of a compilation unit.
 */
table LinkedUnit {
  /**
   * List of slot ids (referring to [UnlinkedExecutable.constCycleSlot])
   * corresponding to const constructors that are part of cycles.
   */
  constCycles:[uint] (id: 2);

  /**
   * Information about the resolution of references within the compilation
   * unit.  Each element of [UnlinkedUnit.references] has a corresponding
   * element in this list (at the same index).  If this list has additional
   * elements beyond the number of elements in [UnlinkedUnit.references], those
   * additional elements are references that are only referred to implicitly
   * (e.g. elements involved in inferred or propagated types).
   */
  references:[LinkedReference] (id: 0);

  /**
   * List associating slot ids found inside the unlinked summary for the
   * compilation unit with propagated and inferred types.
   */
  types:[EntityRef] (id: 1);
}

/**
 * Summary information about a package.
 */
table PackageBundle {
  /**
   * Linked libraries.
   */
  linkedLibraries:[LinkedLibrary] (id: 0);

  /**
   * The list of URIs of items in [linkedLibraries], e.g. `dart:core` or
   * `package:foo/bar.dart`.
   */
  linkedLibraryUris:[string] (id: 1);

  /**
   * Major version of the summary format.  See
   * [PackageBundleAssembler.currentMajorVersion].
   */
  majorVersion:uint (id: 5);

  /**
   * Minor version of the summary format.  See
   * [PackageBundleAssembler.currentMinorVersion].
   */
  minorVersion:uint (id: 6);

  /**
   * List of MD5 hashes of the files listed in [unlinkedUnitUris].  Each hash
   * is encoded as a hexadecimal string using lower case letters.
   */
  unlinkedUnitHashes:[string] (id: 4);

  /**
   * Unlinked information for the compilation units constituting the package.
   */
  unlinkedUnits:[UnlinkedUnit] (id: 2);

  /**
   * The list of URIs of items in [unlinkedUnits], e.g. `dart:core/bool.dart`.
   */
  unlinkedUnitUris:[string] (id: 3);
}

/**
 * Index information about a package.
 */
table PackageIndex {
  /**
   * Each item of this list corresponds to a unique referenced element.  It is
   * the kind of the synthetic element.
   */
  elementKinds:[IndexSyntheticElementKind] (id: 5);

  /**
   * Each item of this list corresponds to a unique referenced element.  It is
   * the offset of the element name relative to the beginning of the file.  The
   * list is sorted in ascending order, so that the client can quickly check
   * whether an element is referenced in this [PackageIndex].
   */
  elementOffsets:[uint] (id: 1);

  /**
   * Each item of this list corresponds to a unique referenced element.  It is
   * the index into [unitLibraryUris] and [unitUnitUris] for the library
   * specific unit where the element is declared.
   */
  elementUnits:[uint] (id: 0);

  /**
   * List of unique element strings used in this [PackageIndex].  The list is
   * sorted in ascending order, so that the client can quickly check the
   * presence of a string in this [PackageIndex].
   */
  strings:[string] (id: 6);

  /**
   * Each item of this list corresponds to the library URI of a unique library
   * specific unit referenced in the [PackageIndex].  It is an index into
   * [strings] list.
   */
  unitLibraryUris:[uint] (id: 2);

  /**
   * List of indexes of each unit in this [PackageIndex].
   */
  units:[UnitIndex] (id: 4);

  /**
   * Each item of this list corresponds to the unit URI of a unique library
   * specific unit referenced in the [PackageIndex].  It is an index into
   * [strings] list.
   */
  unitUnitUris:[uint] (id: 3);
}

/**
 * Index information about a unit in a [PackageIndex].
 */
table UnitIndex {
  /**
   * Each item of this list is the kind of an element defined in this unit.
   */
  definedNameKinds:[IndexNameKind] (id: 6);

  /**
   * Each item of this list is the name offset of an element defined in this
   * unit relative to the beginning of the file.
   */
  definedNameOffsets:[uint] (id: 7);

  /**
   * Each item of this list corresponds to an element defined in this unit.  It
   * is an index into [PackageIndex.strings] list.  The list is sorted in
   * ascending order, so that the client can quickly find name definitions in
   * this [UnitIndex].
   */
  definedNames:[uint] (id: 5);

  /**
   * Index into [PackageIndex.unitLibraryUris] and [PackageIndex.unitUnitUris]
   * for the library specific unit that corresponds to this [UnitIndex].
   */
  unit:uint (id: 0);

  /**
   * Each item of this list is the `true` if the corresponding element usage
   * is qualified with some prefix.
   */
  usedElementIsQualifiedFlags:[ubyte] (id: 11);

  /**
   * Each item of this list is the kind of the element usage.
   */
  usedElementKinds:[IndexRelationKind] (id: 4);

  /**
   * Each item of this list is the length of the element usage.
   */
  usedElementLengths:[uint] (id: 1);

  /**
   * Each item of this list is the offset of the element usage relative to the
   * beginning of the file.
   */
  usedElementOffsets:[uint] (id: 2);

  /**
   * Each item of this list is the index into [PackageIndex.elementUnits] and
   * [PackageIndex.elementOffsets].  The list is sorted in ascending order, so
   * that the client can quickly find element references in this [UnitIndex].
   */
  usedElements:[uint] (id: 3);

  /**
   * Each item of this list is the `true` if the corresponding name usage
   * is qualified with some prefix.
   */
  usedNameIsQualifiedFlags:[ubyte] (id: 12);

  /**
   * Each item of this list is the kind of the name usage.
   */
  usedNameKinds:[IndexRelationKind] (id: 10);

  /**
   * Each item of this list is the offset of the name usage relative to the
   * beginning of the file.
   */
  usedNameOffsets:[uint] (id: 9);

  /**
   * Each item of this list is the index into [PackageIndex.strings] for a
   * used name.  The list is sorted in ascending order, so that the client can
   * quickly find name uses in this [UnitIndex].
   */
  usedNames:[uint] (id: 8);
}

/**
 * Unlinked summary information about a class declaration.
 */
table UnlinkedClass {
  /**
   * Annotations for this class.
   */
  annotations:[UnlinkedConst] (id: 5);

  /**
   * Code range of the class.
   */
  codeRange:CodeRange (id: 13);

  /**
   * Documentation comment for the class, or `null` if there is no
   * documentation comment.
   */
  documentationComment:UnlinkedDocumentationComment (id: 6);

  /**
   * Executable objects (methods, getters, and setters) contained in the class.
   */
  executables:[UnlinkedExecutable] (id: 2);

  /**
   * Field declarations contained in the class.
   */
  fields:[UnlinkedVariable] (id: 4);

  /**
   * Indicates whether this class is the core "Object" class (and hence has no
   * supertype)
   */
  hasNoSupertype:bool (id: 12);

  /**
   * Interfaces appearing in an `implements` clause, if any.
   */
  interfaces:[EntityRef] (id: 7);

  /**
   * Indicates whether the class is declared with the `abstract` keyword.
   */
  isAbstract:bool (id: 8);

  /**
   * Indicates whether the class is declared using mixin application syntax.
   */
  isMixinApplication:bool (id: 11);

  /**
   * Mixins appearing in a `with` clause, if any.
   */
  mixins:[EntityRef] (id: 10);

  /**
   * Name of the class.
   */
  name:string (id: 0);

  /**
   * Offset of the class name relative to the beginning of the file.
   */
  nameOffset:uint (id: 1);

  /**
   * Supertype of the class, or `null` if either (a) the class doesn't
   * explicitly declare a supertype (and hence has supertype `Object`), or (b)
   * the class *is* `Object` (and hence has no supertype).
   */
  supertype:EntityRef (id: 3);

  /**
   * Type parameters of the class, if any.
   */
  typeParameters:[UnlinkedTypeParam] (id: 9);
}

/**
 * Unlinked summary information about a `show` or `hide` combinator in an
 * import or export declaration.
 */
table UnlinkedCombinator {
  /**
   * If this is a `show` combinator, offset of the end of the list of shown
   * names.  Otherwise zero.
   */
  end:uint (id: 3);

  /**
   * List of names which are hidden.  Empty if this is a `show` combinator.
   */
  hides:[string] (id: 1);

  /**
   * If this is a `show` combinator, offset of the `show` keyword.  Otherwise
   * zero.
   */
  offset:uint (id: 2);

  /**
   * List of names which are shown.  Empty if this is a `hide` combinator.
   */
  shows:[string] (id: 0);
}

/**
 * Unlinked summary information about a compile-time constant expression, or a
 * potentially constant expression.
 *
 * Constant expressions are represented using a simple stack-based language
 * where [operations] is a sequence of operations to execute starting with an
 * empty stack.  Once all operations have been executed, the stack should
 * contain a single value which is the value of the constant.  Note that some
 * operations consume additional data from the other fields of this class.
 */
table UnlinkedConst {
  /**
   * Sequence of operators used by assignment operations.
   */
  assignmentOperators:[UnlinkedExprAssignOperator] (id: 6);

  /**
   * Sequence of 64-bit doubles consumed by the operation `pushDouble`.
   */
  doubles:[double] (id: 4);

  /**
   * Sequence of unsigned 32-bit integers consumed by the operations
   * `pushArgument`, `pushInt`, `shiftOr`, `concatenate`, `invokeConstructor`,
   * `makeList`, and `makeMap`.
   */
  ints:[uint] (id: 1);

  /**
   * Indicates whether the expression is not a valid potentially constant
   * expression.
   */
  isInvalid:bool (id: 5);

  /**
   * Sequence of operations to execute (starting with an empty stack) to form
   * the constant value.
   */
  operations:[UnlinkedConstOperation] (id: 0);

  /**
   * Sequence of language constructs consumed by the operations
   * `pushReference`, `invokeConstructor`, `makeList`, and `makeMap`.  Note
   * that in the case of `pushReference` (and sometimes `invokeConstructor` the
   * actual entity being referred to may be something other than a type.
   */
  references:[EntityRef] (id: 2);

  /**
   * Sequence of strings consumed by the operations `pushString` and
   * `invokeConstructor`.
   */
  strings:[string] (id: 3);
}

/**
 * Unlinked summary information about a constructor initializer.
 */
table UnlinkedConstructorInitializer {
  /**
   * If [kind] is `thisInvocation` or `superInvocation`, the arguments of the
   * invocation.  Otherwise empty.
   */
  arguments:[UnlinkedConst] (id: 3);

  /**
   * If [kind] is `field`, the expression of the field initializer.
   * Otherwise `null`.
   */
  expression:UnlinkedConst (id: 1);

  /**
   * The kind of the constructor initializer (field, redirect, super).
   */
  kind:UnlinkedConstructorInitializerKind (id: 2);

  /**
   * If [kind] is `field`, the name of the field declared in the class.  If
   * [kind] is `thisInvocation`, the name of the constructor, declared in this
   * class, to redirect to.  If [kind] is `superInvocation`, the name of the
   * constructor, declared in the superclass, to invoke.
   */
  name:string (id: 0);
}

/**
 * Unlinked summary information about a documentation comment.
 */
table UnlinkedDocumentationComment {
  /**
   * Length of the documentation comment (prior to replacing '\r\n' with '\n').
   */
  length:uint (id: 0);

  /**
   * Offset of the beginning of the documentation comment relative to the
   * beginning of the file.
   */
  offset:uint (id: 2);

  /**
   * Text of the documentation comment, with '\r\n' replaced by '\n'.
   *
   * References appearing within the doc comment in square brackets are not
   * specially encoded.
   */
  text:string (id: 1);
}

/**
 * Unlinked summary information about an enum declaration.
 */
table UnlinkedEnum {
  /**
   * Annotations for this enum.
   */
  annotations:[UnlinkedConst] (id: 4);

  /**
   * Code range of the enum.
   */
  codeRange:CodeRange (id: 5);

  /**
   * Documentation comment for the enum, or `null` if there is no documentation
   * comment.
   */
  documentationComment:UnlinkedDocumentationComment (id: 3);

  /**
   * Name of the enum type.
   */
  name:string (id: 0);

  /**
   * Offset of the enum name relative to the beginning of the file.
   */
  nameOffset:uint (id: 1);

  /**
   * Values listed in the enum declaration, in declaration order.
   */
  values:[UnlinkedEnumValue] (id: 2);
}

/**
 * Unlinked summary information about a single enumerated value in an enum
 * declaration.
 */
table UnlinkedEnumValue {
  /**
   * Documentation comment for the enum value, or `null` if there is no
   * documentation comment.
   */
  documentationComment:UnlinkedDocumentationComment (id: 2);

  /**
   * Name of the enumerated value.
   */
  name:string (id: 0);

  /**
   * Offset of the enum value name relative to the beginning of the file.
   */
  nameOffset:uint (id: 1);
}

/**
 * Unlinked summary information about a function, method, getter, or setter
 * declaration.
 */
table UnlinkedExecutable {
  /**
   * Annotations for this executable.
   */
  annotations:[UnlinkedConst] (id: 6);

  /**
   * Code range of the executable.
   */
  codeRange:CodeRange (id: 26);

  /**
   * If a constant [UnlinkedExecutableKind.constructor], the constructor
   * initializers.  Otherwise empty.
   */
  constantInitializers:[UnlinkedConstructorInitializer] (id: 14);

  /**
   * If [kind] is [UnlinkedExecutableKind.constructor] and [isConst] is `true`,
   * a nonzero slot id which is unique within this compilation unit.  If this id
   * is found in [LinkedUnit.constCycles], then this constructor is part of a
   * cycle.
   *
   * Otherwise, zero.
   */
  constCycleSlot:uint (id: 25);

  /**
   * Documentation comment for the executable, or `null` if there is no
   * documentation comment.
   */
  documentationComment:UnlinkedDocumentationComment (id: 7);

  /**
   * If this executable's return type is inferable, nonzero slot id
   * identifying which entry in [LinkedUnit.types] contains the inferred
   * return type.  If there is no matching entry in [LinkedUnit.types], then
   * no return type was inferred for this variable, so its static type is
   * `dynamic`.
   */
  inferredReturnTypeSlot:uint (id: 5);

  /**
   * Indicates whether the executable is declared using the `abstract` keyword.
   */
  isAbstract:bool (id: 10);

  /**
   * Indicates whether the executable is declared using the `const` keyword.
   */
  isConst:bool (id: 12);

  /**
   * Indicates whether the executable is declared using the `external` keyword.
   */
  isExternal:bool (id: 11);

  /**
   * Indicates whether the executable is declared using the `factory` keyword.
   */
  isFactory:bool (id: 8);

  /**
   * Indicates whether the executable is a redirected constructor.
   */
  isRedirectedConstructor:bool (id: 13);

  /**
   * Indicates whether the executable is declared using the `static` keyword.
   *
   * Note that for top level executables, this flag is false, since they are
   * not declared using the `static` keyword (even though they are considered
   * static for semantic purposes).
   */
  isStatic:bool (id: 9);

  /**
   * The kind of the executable (function/method, getter, setter, or
   * constructor).
   */
  kind:UnlinkedExecutableKind (id: 4);

  /**
   * The list of local functions.
   */
  localFunctions:[UnlinkedExecutable] (id: 18);

  /**
   * The list of local labels.
   */
  localLabels:[UnlinkedLabel] (id: 22);

  /**
   * The list of local variables.
   */
  localVariables:[UnlinkedVariable] (id: 19);

  /**
   * Name of the executable.  For setters, this includes the trailing "=".  For
   * named constructors, this excludes the class name and excludes the ".".
   * For unnamed constructors, this is the empty string.
   */
  name:string (id: 1);

  /**
   * If [kind] is [UnlinkedExecutableKind.constructor] and [name] is not empty,
   * the offset of the end of the constructor name.  Otherwise zero.
   */
  nameEnd:uint (id: 23);

  /**
   * Offset of the executable name relative to the beginning of the file.  For
   * named constructors, this excludes the class name and excludes the ".".
   * For unnamed constructors, this is the offset of the class name (i.e. the
   * offset of the second "C" in "class C { C(); }").
   */
  nameOffset:uint (id: 0);

  /**
   * Parameters of the executable, if any.  Note that getters have no
   * parameters (hence this will be the empty list), and setters have a single
   * parameter.
   */
  parameters:[UnlinkedParam] (id: 2);

  /**
   * If [kind] is [UnlinkedExecutableKind.constructor] and [name] is not empty,
   * the offset of the period before the constructor name.  Otherwise zero.
   */
  periodOffset:uint (id: 24);

  /**
   * If [isRedirectedConstructor] and [isFactory] are both `true`, the
   * constructor to which this constructor redirects; otherwise empty.
   */
  redirectedConstructor:EntityRef (id: 15);

  /**
   * If [isRedirectedConstructor] is `true` and [isFactory] is `false`, the
   * name of the constructor that this constructor redirects to; otherwise
   * empty.
   */
  redirectedConstructorName:string (id: 17);

  /**
   * Declared return type of the executable.  Absent if the executable is a
   * constructor or the return type is implicit.  Absent for executables
   * associated with variable initializers and closures, since these
   * executables may have return types that are not accessible via direct
   * imports.
   */
  returnType:EntityRef (id: 3);

  /**
   * Type parameters of the executable, if any.  Empty if support for generic
   * method syntax is disabled.
   */
  typeParameters:[UnlinkedTypeParam] (id: 16);

  /**
   * If a local function, the length of the visible range; zero otherwise.
   */
  visibleLength:uint (id: 20);

  /**
   * If a local function, the beginning of the visible range; zero otherwise.
   */
  visibleOffset:uint (id: 21);
}

/**
 * Unlinked summary information about an export declaration (stored outside
 * [UnlinkedPublicNamespace]).
 */
table UnlinkedExportNonPublic {
  /**
   * Annotations for this export directive.
   */
  annotations:[UnlinkedConst] (id: 3);

  /**
   * Offset of the "export" keyword.
   */
  offset:uint (id: 0);

  /**
   * End of the URI string (including quotes) relative to the beginning of the
   * file.
   */
  uriEnd:uint (id: 1);

  /**
   * Offset of the URI string (including quotes) relative to the beginning of
   * the file.
   */
  uriOffset:uint (id: 2);
}

/**
 * Unlinked summary information about an export declaration (stored inside
 * [UnlinkedPublicNamespace]).
 */
table UnlinkedExportPublic {
  /**
   * Combinators contained in this import declaration.
   */
  combinators:[UnlinkedCombinator] (id: 1);

  /**
   * URI used in the source code to reference the exported library.
   */
  uri:string (id: 0);
}

/**
 * Unlinked summary information about an import declaration.
 */
table UnlinkedImport {
  /**
   * Annotations for this import declaration.
   */
  annotations:[UnlinkedConst] (id: 8);

  /**
   * Combinators contained in this import declaration.
   */
  combinators:[UnlinkedCombinator] (id: 4);

  /**
   * Indicates whether the import declaration uses the `deferred` keyword.
   */
  isDeferred:bool (id: 9);

  /**
   * Indicates whether the import declaration is implicit.
   */
  isImplicit:bool (id: 5);

  /**
   * If [isImplicit] is false, offset of the "import" keyword.  If [isImplicit]
   * is true, zero.
   */
  offset:uint (id: 0);

  /**
   * Offset of the prefix name relative to the beginning of the file, or zero
   * if there is no prefix.
   */
  prefixOffset:uint (id: 6);

  /**
   * Index into [UnlinkedUnit.references] of the prefix declared by this
   * import declaration, or zero if this import declaration declares no prefix.
   *
   * Note that multiple imports can declare the same prefix.
   */
  prefixReference:uint (id: 7);

  /**
   * URI used in the source code to reference the imported library.
   */
  uri:string (id: 1);

  /**
   * End of the URI string (including quotes) relative to the beginning of the
   * file.  If [isImplicit] is true, zero.
   */
  uriEnd:uint (id: 2);

  /**
   * Offset of the URI string (including quotes) relative to the beginning of
   * the file.  If [isImplicit] is true, zero.
   */
  uriOffset:uint (id: 3);
}

/**
 * Unlinked summary information about a label.
 */
table UnlinkedLabel {
  /**
   * Return `true` if this label is associated with a `switch` member (`case` or
   * `default`).
   */
  isOnSwitchMember:bool (id: 2);

  /**
   * Return `true` if this label is associated with a `switch` statement.
   */
  isOnSwitchStatement:bool (id: 3);

  /**
   * Name of the label.
   */
  name:string (id: 0);

  /**
   * Offset of the label relative to the beginning of the file.
   */
  nameOffset:uint (id: 1);
}

/**
 * Unlinked summary information about a function parameter.
 */
table UnlinkedParam {
  /**
   * Annotations for this parameter.
   */
  annotations:[UnlinkedConst] (id: 9);

  /**
   * Code range of the parameter.
   */
  codeRange:CodeRange (id: 14);

  /**
   * If the parameter has a default value, the constant expression in the
   * default value.  Note that the presence of this expression does not mean
   * that it is a valid, check [UnlinkedConst.isInvalid].
   */
  defaultValue:UnlinkedConst (id: 7);

  /**
   * If the parameter has a default value, the source text of the constant
   * expression in the default value.  Otherwise the empty string.
   */
  defaultValueCode:string (id: 13);

  /**
   * If this parameter's type is inferable, nonzero slot id identifying which
   * entry in [LinkedLibrary.types] contains the inferred type.  If there is no
   * matching entry in [LinkedLibrary.types], then no type was inferred for
   * this variable, so its static type is `dynamic`.
   *
   * Note that although strong mode considers initializing formals to be
   * inferable, they are not marked as such in the summary; if their type is
   * not specified, they always inherit the static type of the corresponding
   * field.
   */
  inferredTypeSlot:uint (id: 2);

  /**
   * The synthetic initializer function of the parameter.  Absent if the variable
   * does not have an initializer.
   */
  initializer:UnlinkedExecutable (id: 12);

  /**
   * Indicates whether this is a function-typed parameter.
   */
  isFunctionTyped:bool (id: 5);

  /**
   * Indicates whether this is an initializing formal parameter (i.e. it is
   * declared using `this.` syntax).
   */
  isInitializingFormal:bool (id: 6);

  /**
   * Kind of the parameter.
   */
  kind:UnlinkedParamKind (id: 4);

  /**
   * Name of the parameter.
   */
  name:string (id: 0);

  /**
   * Offset of the parameter name relative to the beginning of the file.
   */
  nameOffset:uint (id: 1);

  /**
   * If [isFunctionTyped] is `true`, the parameters of the function type.
   */
  parameters:[UnlinkedParam] (id: 8);

  /**
   * If [isFunctionTyped] is `true`, the declared return type.  If
   * [isFunctionTyped] is `false`, the declared type.  Absent if the type is
   * implicit.
   */
  type:EntityRef (id: 3);

  /**
   * The length of the visible range.
   */
  visibleLength:uint (id: 10);

  /**
   * The beginning of the visible range.
   */
  visibleOffset:uint (id: 11);
}

/**
 * Unlinked summary information about a part declaration.
 */
table UnlinkedPart {
  /**
   * Annotations for this part declaration.
   */
  annotations:[UnlinkedConst] (id: 2);

  /**
   * End of the URI string (including quotes) relative to the beginning of the
   * file.
   */
  uriEnd:uint (id: 0);

  /**
   * Offset of the URI string (including quotes) relative to the beginning of
   * the file.
   */
  uriOffset:uint (id: 1);
}

/**
 * Unlinked summary information about a specific name contributed by a
 * compilation unit to a library's public namespace.
 *
 * TODO(paulberry): some of this information is redundant with information
 * elsewhere in the summary.  Consider reducing the redundancy to reduce
 * summary size.
 */
table UnlinkedPublicName {
  /**
   * The kind of object referred to by the name.
   */
  kind:ReferenceKind (id: 1);

  /**
   * If this [UnlinkedPublicName] is a class, the list of members which can be
   * referenced from constants or factory redirects - static constant fields,
   * static methods, and constructors.  Otherwise empty.
   *
   * Unnamed constructors are not included since they do not constitute a
   * separate name added to any namespace.
   */
  members:[UnlinkedPublicName] (id: 2);

  /**
   * The name itself.
   */
  name:string (id: 0);

  /**
   * If the entity being referred to is generic, the number of type parameters
   * it accepts.  Otherwise zero.
   */
  numTypeParameters:uint (id: 3);
}

/**
 * Unlinked summary information about what a compilation unit contributes to a
 * library's public namespace.  This is the subset of [UnlinkedUnit] that is
 * required from dependent libraries in order to perform prelinking.
 */
table UnlinkedPublicNamespace {
  /**
   * Export declarations in the compilation unit.
   */
  exports:[UnlinkedExportPublic] (id: 2);

  /**
   * Public names defined in the compilation unit.
   *
   * TODO(paulberry): consider sorting these names to reduce unnecessary
   * relinking.
   */
  names:[UnlinkedPublicName] (id: 0);

  /**
   * URIs referenced by part declarations in the compilation unit.
   */
  parts:[string] (id: 1);
}

/**
 * Unlinked summary information about a name referred to in one library that
 * might be defined in another.
 */
table UnlinkedReference {
  /**
   * Name of the entity being referred to.  For the pseudo-type `dynamic`, the
   * string is "dynamic".  For the pseudo-type `void`, the string is "void".
   * For the pseudo-type `bottom`, the string is "*bottom*".
   */
  name:string (id: 0);

  /**
   * Prefix used to refer to the entity, or zero if no prefix is used.  This is
   * an index into [UnlinkedUnit.references].
   *
   * Prefix references must always point backward; that is, for all i, if
   * UnlinkedUnit.references[i].prefixReference != 0, then
   * UnlinkedUnit.references[i].prefixReference < i.
   */
  prefixReference:uint (id: 1);
}

/**
 * Unlinked summary information about a typedef declaration.
 */
table UnlinkedTypedef {
  /**
   * Annotations for this typedef.
   */
  annotations:[UnlinkedConst] (id: 4);

  /**
   * Code range of the typedef.
   */
  codeRange:CodeRange (id: 7);

  /**
   * Documentation comment for the typedef, or `null` if there is no
   * documentation comment.
   */
  documentationComment:UnlinkedDocumentationComment (id: 6);

  /**
   * Name of the typedef.
   */
  name:string (id: 0);

  /**
   * Offset of the typedef name relative to the beginning of the file.
   */
  nameOffset:uint (id: 1);

  /**
   * Parameters of the executable, if any.
   */
  parameters:[UnlinkedParam] (id: 3);

  /**
   * Return type of the typedef.
   */
  returnType:EntityRef (id: 2);

  /**
   * Type parameters of the typedef, if any.
   */
  typeParameters:[UnlinkedTypeParam] (id: 5);
}

/**
 * Unlinked summary information about a type parameter declaration.
 */
table UnlinkedTypeParam {
  /**
   * Annotations for this type parameter.
   */
  annotations:[UnlinkedConst] (id: 3);

  /**
   * Bound of the type parameter, if a bound is explicitly declared.  Otherwise
   * null.
   */
  bound:EntityRef (id: 2);

  /**
   * Code range of the type parameter.
   */
  codeRange:CodeRange (id: 4);

  /**
   * Name of the type parameter.
   */
  name:string (id: 0);

  /**
   * Offset of the type parameter name relative to the beginning of the file.
   */
  nameOffset:uint (id: 1);
}

/**
 * Unlinked summary information about a compilation unit ("part file").
 */
table UnlinkedUnit {
  /**
   * Classes declared in the compilation unit.
   */
  classes:[UnlinkedClass] (id: 2);

  /**
   * Code range of the unit.
   */
  codeRange:CodeRange (id: 15);

  /**
   * Enums declared in the compilation unit.
   */
  enums:[UnlinkedEnum] (id: 12);

  /**
   * Top level executable objects (functions, getters, and setters) declared in
   * the compilation unit.
   */
  executables:[UnlinkedExecutable] (id: 4);

  /**
   * Export declarations in the compilation unit.
   */
  exports:[UnlinkedExportNonPublic] (id: 13);

  /**
   * If this compilation unit was summarized in fallback mode, the path where
   * the compilation unit may be found on disk.  Otherwise empty.
   *
   * When this field is non-empty, all other fields in the data structure have
   * their default values.
   */
  fallbackModePath:string (id: 16);

  /**
   * Import declarations in the compilation unit.
   */
  imports:[UnlinkedImport] (id: 5);

  /**
   * Annotations for the library declaration, or the empty list if there is no
   * library declaration.
   */
  libraryAnnotations:[UnlinkedConst] (id: 14);

  /**
   * Documentation comment for the library, or `null` if there is no
   * documentation comment.
   */
  libraryDocumentationComment:UnlinkedDocumentationComment (id: 9);

  /**
   * Name of the library (from a "library" declaration, if present).
   */
  libraryName:string (id: 6);

  /**
   * Length of the library name as it appears in the source code (or 0 if the
   * library has no name).
   */
  libraryNameLength:uint (id: 7);

  /**
   * Offset of the library name relative to the beginning of the file (or 0 if
   * the library has no name).
   */
  libraryNameOffset:uint (id: 8);

  /**
   * Part declarations in the compilation unit.
   */
  parts:[UnlinkedPart] (id: 11);

  /**
   * Unlinked public namespace of this compilation unit.
   */
  publicNamespace:UnlinkedPublicNamespace (id: 0);

  /**
   * Top level and prefixed names referred to by this compilation unit.  The
   * zeroth element of this array is always populated and is used to represent
   * the absence of a reference in places where a reference is optional (for
   * example [UnlinkedReference.prefixReference or
   * UnlinkedImport.prefixReference]).
   */
  references:[UnlinkedReference] (id: 1);

  /**
   * Typedefs declared in the compilation unit.
   */
  typedefs:[UnlinkedTypedef] (id: 10);

  /**
   * Top level variables declared in the compilation unit.
   */
  variables:[UnlinkedVariable] (id: 3);
}

/**
 * Unlinked summary information about a top level variable, local variable, or
 * a field.
 */
table UnlinkedVariable {
  /**
   * Annotations for this variable.
   */
  annotations:[UnlinkedConst] (id: 8);

  /**
   * Code range of the variable.
   */
  codeRange:CodeRange (id: 14);

  /**
   * If [isConst] is true, and the variable has an initializer, the constant
   * expression in the initializer.  Note that the presence of this expression
   * does not mean that it is a valid, check [UnlinkedConst.isInvalid].
   */
  constExpr:UnlinkedConst (id: 5);

  /**
   * Documentation comment for the variable, or `null` if there is no
   * documentation comment.
   */
  documentationComment:UnlinkedDocumentationComment (id: 10);

  /**
   * If this variable is inferable, nonzero slot id identifying which entry in
   * [LinkedLibrary.types] contains the inferred type for this variable.  If
   * there is no matching entry in [LinkedLibrary.types], then no type was
   * inferred for this variable, so its static type is `dynamic`.
   */
  inferredTypeSlot:uint (id: 9);

  /**
   * The synthetic initializer function of the variable.  Absent if the variable
   * does not have an initializer.
   */
  initializer:UnlinkedExecutable (id: 13);

  /**
   * Indicates whether the variable is declared using the `const` keyword.
   */
  isConst:bool (id: 6);

  /**
   * Indicates whether the variable is declared using the `final` keyword.
   */
  isFinal:bool (id: 7);

  /**
   * Indicates whether the variable is declared using the `static` keyword.
   *
   * Note that for top level variables, this flag is false, since they are not
   * declared using the `static` keyword (even though they are considered
   * static for semantic purposes).
   */
  isStatic:bool (id: 4);

  /**
   * Name of the variable.
   */
  name:string (id: 0);

  /**
   * Offset of the variable name relative to the beginning of the file.
   */
  nameOffset:uint (id: 1);

  /**
   * If this variable is propagable, nonzero slot id identifying which entry in
   * [LinkedLibrary.types] contains the propagated type for this variable.  If
   * there is no matching entry in [LinkedLibrary.types], then this variable's
   * propagated type is the same as its declared type.
   *
   * Non-propagable variables have a [propagatedTypeSlot] of zero.
   */
  propagatedTypeSlot:uint (id: 2);

  /**
   * Declared type of the variable.  Absent if the type is implicit.
   */
  type:EntityRef (id: 3);

  /**
   * If a local variable, the length of the visible range; zero otherwise.
   */
  visibleLength:uint (id: 11);

  /**
   * If a local variable, the beginning of the visible range; zero otherwise.
   */
  visibleOffset:uint (id: 12);
}

root_type PackageBundle;

file_identifier "PBdl";
