// 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 SDK script
// "pkg/analyzer/tool/summary/generate.dart $IDL_FILE_PATH",
// or "pkg/analyzer/tool/generate_files" for the analyzer package IDL/sources.


/// Enum of declaration kinds in available files.
enum AvailableDeclarationKind : byte {
  CLASS,

  CLASS_TYPE_ALIAS,

  CONSTRUCTOR,

  ENUM,

  ENUM_CONSTANT,

  FUNCTION,

  FUNCTION_TYPE_ALIAS,

  GETTER,

  MIXIN,

  SETTER,

  VARIABLE
}

/// Enum used to indicate the kind of an entity reference.
enum EntityRefKind : byte {
  /// The entity represents a named type.
  named,

  /// The entity represents a generic function type.
  genericFunctionType,

  /// The entity represents a function type that was synthesized by a LUB
  /// computation.
  syntheticFunction
}

/// Enum representing nullability suffixes in summaries.
///
/// This enum is similar to [NullabilitySuffix], but the order is different so
/// that [EntityRefNullabilitySuffix.starOrIrrelevant] can be the default.
enum EntityRefNullabilitySuffix : byte {
  /// An indication that the canonical representation of the type under
  /// consideration ends with `*`.  Types having this nullability suffix are
  /// called "legacy types"; it has not yet been determined whether they should
  /// be unioned with the Null type.
  ///
  /// Also used in circumstances where no nullability suffix information is
  /// needed.
  starOrIrrelevant,

  /// An indication that the canonical representation of the type under
  /// consideration ends with `?`.  Types having this nullability suffix should
  /// be interpreted as being unioned with the Null type.
  question,

  /// An indication that the canonical representation of the type under
  /// consideration does not end with either `?` or `*`.
  none
}

/// 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,

  /// The synthetic `toString` method of an enum.
  enumToString,

  /// The containing unit itself.
  unit
}

/// Types of comments.
enum LinkedNodeCommentType : byte {
  block,

  documentation,

  endOfLine
}

/// Kinds of formal parameters.
enum LinkedNodeFormalParameterKind : byte {
  requiredPositional,

  optionalPositional,

  optionalNamed,

  requiredNamed
}

/// Kinds of [LinkedNode].
enum LinkedNodeKind : byte {
  adjacentStrings,

  annotation,

  argumentList,

  asExpression,

  assertInitializer,

  assertStatement,

  assignmentExpression,

  awaitExpression,

  binaryExpression,

  block,

  blockFunctionBody,

  booleanLiteral,

  breakStatement,

  cascadeExpression,

  catchClause,

  classDeclaration,

  classTypeAlias,

  comment,

  compilationUnit,

  conditionalExpression,

  configuration,

  constructorDeclaration,

  constructorFieldInitializer,

  constructorName,

  continueStatement,

  declaredIdentifier,

  defaultFormalParameter,

  doubleLiteral,

  doStatement,

  dottedName,

  emptyFunctionBody,

  emptyStatement,

  enumConstantDeclaration,

  enumDeclaration,

  exportDirective,

  expressionFunctionBody,

  expressionStatement,

  extendsClause,

  fieldDeclaration,

  fieldFormalParameter,

  formalParameterList,

  forEachPartsWithDeclaration,

  forEachPartsWithIdentifier,

  forElement,

  forPartsWithDeclarations,

  forPartsWithExpression,

  forStatement,

  functionDeclaration,

  functionDeclarationStatement,

  functionExpression,

  functionExpressionInvocation,

  functionTypeAlias,

  functionTypedFormalParameter,

  genericFunctionType,

  genericTypeAlias,

  hideCombinator,

  ifElement,

  ifStatement,

  implementsClause,

  importDirective,

  instanceCreationExpression,

  indexExpression,

  integerLiteral,

  interpolationExpression,

  interpolationString,

  isExpression,

  label,

  labeledStatement,

  libraryDirective,

  libraryIdentifier,

  listLiteral,

  mapLiteralEntry,

  methodDeclaration,

  methodInvocation,

  mixinDeclaration,

  namedExpression,

  nativeClause,

  nativeFunctionBody,

  nullLiteral,

  onClause,

  parenthesizedExpression,

  partDirective,

  partOfDirective,

  postfixExpression,

  prefixExpression,

  prefixedIdentifier,

  propertyAccess,

  redirectingConstructorInvocation,

  rethrowExpression,

  returnStatement,

  scriptTag,

  setOrMapLiteral,

  showCombinator,

  simpleFormalParameter,

  simpleIdentifier,

  simpleStringLiteral,

  spreadElement,

  stringInterpolation,

  superConstructorInvocation,

  superExpression,

  switchCase,

  switchDefault,

  switchStatement,

  symbolLiteral,

  thisExpression,

  throwExpression,

  topLevelVariableDeclaration,

  tryStatement,

  typeArgumentList,

  typeName,

  typeParameter,

  typeParameterList,

  variableDeclaration,

  variableDeclarationList,

  variableDeclarationStatement,

  whileStatement,

  withClause,

  yieldStatement
}

/// Kinds of [LinkedNodeType]s.
enum LinkedNodeTypeKind : byte {
  bottom,

  dynamic_,

  function,

  interface,

  typeParameter,

  void_
}

/// 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,

  /// The entity is a typedef expressed using generic function type syntax.
  genericFunctionTypedef
}

/// Enum used to indicate the kind of the error during top-level inference.
enum TopLevelInferenceErrorKind : byte {
  assignment,

  instanceGetter,

  dependencyCycle,

  overrideConflictFieldType,

  overrideConflictReturnType,

  overrideConflictParameterType
}

/// Enum used to indicate the style of a typedef.
enum TypedefStyle : byte {
  /// A typedef that defines a non-generic function type. The syntax is
  /// ```
  /// 'typedef' returnType? identifier typeParameters? formalParameterList ';'
  /// ```
  /// The typedef can have type parameters associated with it, but the function
  /// type that results from applying type arguments does not.
  functionType,

  /// A typedef expressed using generic function type syntax. The syntax is
  /// ```
  /// typeAlias ::=
  ///     'typedef' identifier typeParameters? '=' genericFunctionType ';'
  /// genericFunctionType ::=
  ///     returnType? 'Function' typeParameters? parameterTypeList
  /// ```
  /// Both the typedef itself and the function type that results from applying
  /// type arguments can have type parameters.
  genericFunctionType
}

/// 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,

  /// Invocation of `assert`.
  assertInvocation
}

/// 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:
///    [UnlinkedExprOperation.assignToRef],
///    [UnlinkedExprOperation.assignToProperty],
///    [UnlinkedExprOperation.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 representing the various kinds of operations which may be performed to
/// in an expression.  These options are assumed to execute in the
/// context of a stack which is initially empty.
enum UnlinkedExprOperation : byte {
  /// Push the next value from [UnlinkedExpr.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 [UnlinkedExpr.ints], then do this number
  /// of times the following operations: multiple the current value by 2^32,
  /// "or" it with the next value in [UnlinkedExpr.ints]. The initial value is
  /// zero. Push the result into the stack.
  pushLongInt,

  /// Push the next value from [UnlinkedExpr.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 [UnlinkedExpr.strings] onto the stack.
  pushString,

  /// Pop the top n values from the stack (where n is obtained from
  /// [UnlinkedExpr.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 [UnlinkedExpr.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 function parameter with the name obtained from
  /// [UnlinkedExpr.strings].
  pushParameter,

  /// Evaluate a (potentially qualified) identifier expression and push the
  /// resulting value onto the stack.  The identifier to be evaluated is
  /// obtained from [UnlinkedExpr.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 [UnlinkedExpr.strings], and push the result back
  /// onto the stack.
  extractProperty,

  /// Pop the top `n` values from the stack (where `n` is obtained from
  /// [UnlinkedExpr.ints]) into a list (filled from the end) and take the next
  /// `n` values from [UnlinkedExpr.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 [UnlinkedExpr.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 [UnlinkedExpr.references], and push the resulting value back onto the
  /// stack.
  ///
  /// Arguments are skipped, and `0` are specified as the numbers of arguments
  /// on the stack, if the expression is not a constant. We store expression of
  /// variable initializers to perform top-level inference, and arguments are
  /// never used to infer types.
  ///
  /// 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
  /// [UnlinkedExpr.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
  /// [UnlinkedExpr.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`.
  ///
  /// To be replaced with [makeUntypedSetOrMap] for unified collections.
  makeUntypedMap,

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

  /// Pop the top 2*n values from the stack (where n is obtained from
  /// [UnlinkedExpr.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 [UnlinkedExpr.references].
  ///
  /// To be replaced with [makeTypedMap2] for unified collections. This is not
  /// forwards compatible with [makeTypedMap2] because it expects
  /// [CollectionElement]s instead of pairs of [Expression]s.
  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
  /// [UnlinkedExpr.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
  /// [UnlinkedExpr.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 `target` and `value`.  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 [UnlinkedExpr.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 `index`, `target` and `value`.  Perform
  /// `target[index] op= value`  where `op` is the next assignment operator from
  /// [UnlinkedExpr.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
  /// [UnlinkedExpr.ints]) into a list (filled from the end) and take the next
  /// `n` values from [UnlinkedExpr.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 [UnlinkedExpr.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 [UnlinkedExpr.references].  If `k` is nonzero (where
  /// `k` is obtained from [UnlinkedExpr.ints]), obtain `k` type arguments from
  /// [UnlinkedExpr.references] and use them as generic type arguments for the
  /// aforementioned method or function.  Push the result of the invocation onto
  /// the stack.
  ///
  /// Arguments are skipped, and `0` are specified as the numbers of arguments
  /// on the stack, if the expression is not a constant. We store expression of
  /// variable initializers to perform top-level inference, and arguments are
  /// never used to infer types.
  ///
  /// 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
  /// [UnlinkedExpr.ints]) into a list (filled from the end) and take the next
  /// `n` values from [UnlinkedExpr.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 [UnlinkedExpr.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
  /// [UnlinkedExpr.strings] of the target popped from the stack.  If `k` is
  /// nonzero (where `k` is obtained from [UnlinkedExpr.ints]), obtain `k` type
  /// arguments from [UnlinkedExpr.references] and use them as generic type
  /// arguments for the aforementioned method.  Push the result of the
  /// invocation onto the stack.
  ///
  /// Arguments are skipped, and `0` are specified as the numbers of arguments
  /// on the stack, if the expression is not a constant. We store expression of
  /// variable initializers to perform top-level inference, and arguments are
  /// never used to infer types.
  ///
  /// This operation should be used for invocation of a method invocation
  /// where `target` is known to be an object instance.
  invokeMethod,

  /// Begin a new cascade section.  Duplicate the top value of the stack.
  cascadeSectionBegin,

  /// End a new cascade section.  Pop the top value from the stack and throw it
  /// away.
  cascadeSectionEnd,

  /// Pop the top value from the stack and cast it to the type with reference
  /// from [UnlinkedExpr.references], push the result into the stack.
  typeCast,

  /// Pop the top value from the stack and check whether it is a subclass of the
  /// type with reference from [UnlinkedExpr.references], push the result into
  /// the stack.
  typeCheck,

  /// Pop the top value from the stack and raise an exception with this value.
  throwException,

  /// Obtain two values `n` and `m` from [UnlinkedExpr.ints].  Then, starting at
  /// the executable element for the expression being evaluated, if n > 0, pop
  /// to the nth enclosing function element.  Then, push the mth local function
  /// of that element onto the stack.
  pushLocalFunctionReference,

  /// Pop the top two values from the stack.  If the first value is non-null,
  /// keep it and discard the second.  Otherwise, keep the second and discard
  /// the first.
  ifNull,

  /// Pop the top value from the stack.  Treat it as a Future and await its
  /// completion.  Then push the awaited value onto the stack.
  await,

  /// Push an abstract value onto the stack. Abstract values mark the presence
  /// of a value, but whose details are not included.
  ///
  /// This is not used by the summary generators today, but it will be used to
  /// experiment with prunning the initializer expression tree, so only
  /// information that is necessary gets included in the output summary file.
  pushUntypedAbstract,

  /// Get the next type reference from [UnlinkedExpr.references] and push an
  /// abstract value onto the stack that has that type.
  ///
  /// Like [pushUntypedAbstract], this is also not used by the summary
  /// generators today. The plan is to experiment with prunning the initializer
  /// expression tree, and include just enough type information to perform
  /// strong-mode type inference, but not all the details of how this type was
  /// obtained.
  pushTypedAbstract,

  /// Push an error onto the stack.
  ///
  /// Like [pushUntypedAbstract], this is not used by summary generators today.
  /// This will be used to experiment with prunning the const expression tree.
  /// If a constant has an error, we can omit the subexpression containing the
  /// error and only include a marker that an error was detected.
  pushError,

  /// Push `this` expression onto the stack.
  pushThis,

  /// Push `super` expression onto the stack.
  pushSuper,

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

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

  /// Pop the top n values from the stack (where n is obtained from
  /// [UnlinkedExpr.ints]), which should be [CollectionElement]s, place them in
  /// a [SetOrMap], and push the result back onto the stack.
  makeUntypedSetOrMap,

  /// Pop the top n values from the stack (where n is obtained from
  /// [UnlinkedExpr.ints]), which should be [CollectionElement]s, place them in
  /// a [Map], and push the result back onto the stack. The two type parameters
  /// for the [Map] are obtained from [UnlinkedExpr.references].
  ///
  /// To replace [makeTypedMap] for unified collections. This is not backwards
  /// compatible with [makeTypedMap] because it expects [CollectionElement]s
  /// instead of pairs of [Expression]s.
  makeTypedMap2,

  /// Pop the top 2 values from the stack, place them in a [MapLiteralEntry],
  /// and push the result back onto the stack.
  makeMapLiteralEntry,

  /// Pop the top value from the stack, convert it to a spread element of type
  /// `...`, and push the result back onto the stack.
  spreadElement,

  /// Pop the top value from the stack, convert it to a spread element of type
  /// `...?`, and push the result back onto the stack.
  nullAwareSpreadElement,

  /// Pop the top two values from the stack.  The first is a condition
  /// and the second is a collection element.  Push an "if" element having the
  /// given condition, with the collection element as its "then" clause.
  ifElement,

  /// Pop the top three values from the stack.  The first is a condition and the
  /// other two are collection elements.  Push an "if" element having the given
  /// condition, with the two collection elements as its "then" and "else"
  /// clauses, respectively.
  ifElseElement,

  /// Pop the top n+2 values from the stack, where n is obtained from
  /// [UnlinkedExpr.ints].  The first two are the initialization and condition
  /// of the for-loop; the remainder are the updaters.
  forParts,

  /// Pop the top 2 values from the stack.  The first is the for loop parts.
  /// The second is the body.
  forElement,

  /// Push the empty expression (used for missing initializers and conditions in
  /// `for` loops)
  pushEmptyExpression,

  /// Add a variable to the current scope whose name is obtained from
  /// [UnlinkedExpr.strings].  This is separate from [variableDeclaration]
  /// because the scope of the variable includes its own initializer.
  variableDeclarationStart,

  /// Pop the top value from the stack, and use it as the initializer for a
  /// variable declaration; the variable being declared is obtained by looking
  /// at the nth variable most recently added to the scope (where n counts from
  /// zero and is obtained from [UnlinkedExpr.ints]).
  variableDeclaration,

  /// Pop the top n values from the stack, which should all be variable
  /// declarations, and use them to create an untyped for-initializer
  /// declaration.  The value of n is obtained from [UnlinkedExpr.ints].
  forInitializerDeclarationsUntyped,

  /// Pop the top n values from the stack, which should all be variable
  /// declarations, and use them to create a typed for-initializer
  /// declaration.  The value of n is obtained from [UnlinkedExpr.ints].  The
  /// type is obtained from [UnlinkedExpr.references].
  forInitializerDeclarationsTyped,

  /// Pop from the stack `value` and get a string from [UnlinkedExpr.strings].
  /// Use this string to look up a parameter.  Perform `parameter op= value`,
  /// where `op` is the next assignment operator from
  /// [UnlinkedExpr.assignmentOperators].  Push `value` back onto 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 parameter after/before update is pushed onto
  /// the stack instead.
  assignToParameter,

  /// Pop from the stack an identifier and an expression, and create for-each
  /// parts of the form `identifier in expression`.
  forEachPartsWithIdentifier,

  /// Pop the top 2 values from the stack.  The first is the for loop parts.
  /// The second is the body.
  forElementWithAwait,

  /// Pop an expression from the stack, and create for-each parts of the form
  /// `var name in expression`, where `name` is obtained from
  /// [UnlinkedExpr.strings].
  forEachPartsWithUntypedDeclaration,

  /// Pop an expression from the stack, and create for-each parts of the form
  /// `Type name in expression`, where `name` is obtained from
  /// [UnlinkedExpr.strings], and `Type` is obtained from
  /// [UnlinkedExpr.references].
  forEachPartsWithTypedDeclaration,

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

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

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

  /// Parameter is optional and named (enclosed in `{}`)
  optionalNamed,

  /// Parameter is required and named (enclosed in `{}`).
  requiredNamed
}

/// TODO(scheglov) document
enum UnlinkedTokenKind : byte {
  nothing,

  comment,

  keyword,

  simple,

  string
}

/// TODO(scheglov) document
enum UnlinkedTokenType : byte {
  NOTHING,

  ABSTRACT,

  AMPERSAND,

  AMPERSAND_AMPERSAND,

  AMPERSAND_EQ,

  AS,

  ASSERT,

  ASYNC,

  AT,

  AWAIT,

  BACKPING,

  BACKSLASH,

  BANG,

  BANG_EQ,

  BAR,

  BAR_BAR,

  BAR_EQ,

  BREAK,

  CARET,

  CARET_EQ,

  CASE,

  CATCH,

  CLASS,

  CLOSE_CURLY_BRACKET,

  CLOSE_PAREN,

  CLOSE_SQUARE_BRACKET,

  COLON,

  COMMA,

  CONST,

  CONTINUE,

  COVARIANT,

  DEFAULT,

  DEFERRED,

  DO,

  DOUBLE,

  DYNAMIC,

  ELSE,

  ENUM,

  EOF,

  EQ,

  EQ_EQ,

  EXPORT,

  EXTENDS,

  EXTERNAL,

  FACTORY,

  FALSE,

  FINAL,

  FINALLY,

  FOR,

  FUNCTION,

  FUNCTION_KEYWORD,

  GET,

  GT,

  GT_EQ,

  GT_GT,

  GT_GT_EQ,

  HASH,

  HEXADECIMAL,

  HIDE,

  IDENTIFIER,

  IF,

  IMPLEMENTS,

  IMPORT,

  IN,

  INDEX,

  INDEX_EQ,

  INT,

  INTERFACE,

  IS,

  LATE,

  LIBRARY,

  LT,

  LT_EQ,

  LT_LT,

  LT_LT_EQ,

  MINUS,

  MINUS_EQ,

  MINUS_MINUS,

  MIXIN,

  MULTI_LINE_COMMENT,

  NATIVE,

  NEW,

  NULL,

  OF,

  ON,

  OPEN_CURLY_BRACKET,

  OPEN_PAREN,

  OPEN_SQUARE_BRACKET,

  OPERATOR,

  PART,

  PATCH,

  PERCENT,

  PERCENT_EQ,

  PERIOD,

  PERIOD_PERIOD,

  PERIOD_PERIOD_PERIOD,

  PERIOD_PERIOD_PERIOD_QUESTION,

  PLUS,

  PLUS_EQ,

  PLUS_PLUS,

  QUESTION,

  QUESTION_PERIOD,

  QUESTION_QUESTION,

  QUESTION_QUESTION_EQ,

  REQUIRED,

  RETHROW,

  RETURN,

  SCRIPT_TAG,

  SEMICOLON,

  SET,

  SHOW,

  SINGLE_LINE_COMMENT,

  SLASH,

  SLASH_EQ,

  SOURCE,

  STAR,

  STAR_EQ,

  STATIC,

  STRING,

  STRING_INTERPOLATION_EXPRESSION,

  STRING_INTERPOLATION_IDENTIFIER,

  SUPER,

  SWITCH,

  SYNC,

  THIS,

  THROW,

  TILDE,

  TILDE_SLASH,

  TILDE_SLASH_EQ,

  TRUE,

  TRY,

  TYPEDEF,

  VAR,

  VOID,

  WHILE,

  WITH,

  YIELD
}

/// Information about the context of an exception in analysis driver.
table AnalysisDriverExceptionContext {
  /// The exception string.
  exception:string (id: 1);

  /// The state of files when the exception happened.
  files:[AnalysisDriverExceptionFile] (id: 3);

  /// The path of the file being analyzed when the exception happened.
  path:string (id: 0);

  /// The exception stack trace string.
  stackTrace:string (id: 2);
}

/// Information about a single file in [AnalysisDriverExceptionContext].
table AnalysisDriverExceptionFile {
  /// The content of the file.
  content:string (id: 1);

  /// The path of the file.
  path:string (id: 0);
}

/// Information about a resolved unit.
table AnalysisDriverResolvedUnit {
  /// The full list of analysis errors, both syntactic and semantic.
  errors:[AnalysisDriverUnitError] (id: 0);

  /// The index of the unit.
  index:AnalysisDriverUnitIndex (id: 1);
}

/// Information about a subtype of one or more classes.
table AnalysisDriverSubtype {
  /// The names of defined instance members.
  /// They are indexes into [AnalysisDriverUnitError.strings] list.
  /// The list is sorted in ascending order.
  members:[uint] (id: 1);

  /// The name of the class.
  /// It is an index into [AnalysisDriverUnitError.strings] list.
  name:uint (id: 0);
}

/// Information about an error in a resolved unit.
table AnalysisDriverUnitError {
  /// The optional correction hint for the error.
  correction:string (id: 4);

  /// The length of the error in the file.
  length:uint (id: 1);

  /// The message of the error.
  message:string (id: 3);

  /// The offset from the beginning of the file.
  offset:uint (id: 0);

  /// The unique name of the error code.
  uniqueName:string (id: 2);
}

/// Information about a resolved unit.
table AnalysisDriverUnitIndex {
  /// Each item of this list corresponds to a unique referenced element.  It is
  /// the kind of the synthetic element.
  elementKinds:[IndexSyntheticElementKind] (id: 4);

  /// Each item of this list corresponds to a unique referenced element.  It is
  /// the identifier of the class member element name, or `null` if the element
  /// is a top-level element.  The list is sorted in ascending order, so that
  /// the client can quickly check whether an element is referenced in this
  /// index.
  elementNameClassMemberIds:[uint] (id: 7);

  /// Each item of this list corresponds to a unique referenced element.  It is
  /// the identifier of the named parameter name, or `null` if the element is
  /// not a named parameter.  The list is sorted in ascending order, so that the
  /// client can quickly check whether an element is referenced in this index.
  elementNameParameterIds:[uint] (id: 8);

  /// Each item of this list corresponds to a unique referenced element.  It is
  /// the identifier of the top-level element name, or `null` if the element is
  /// the unit.  The list is sorted in ascending order, so that the client can
  /// quickly check whether an element is referenced in this index.
  elementNameUnitMemberIds:[uint] (id: 6);

  /// 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: 5);

  /// Identifier of the null string in [strings].
  nullStringId:uint (id: 1);

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

  /// The list of classes declared in the unit.
  subtypes:[AnalysisDriverSubtype] (id: 19);

  /// The identifiers of supertypes of elements at corresponding indexes
  /// in [subtypes].  They are indexes into [strings] list. The list is sorted
  /// in ascending order.  There might be more than one element with the same
  /// value if there is more than one subtype of this supertype.
  supertypes:[uint] (id: 18);

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

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

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

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

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

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

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

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

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

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

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

/// Information about an unlinked unit.
table AnalysisDriverUnlinkedUnit {
  /// List of class member names defined by the unit.
  definedClassMemberNames:[string] (id: 3);

  /// List of top-level names defined by the unit.
  definedTopLevelNames:[string] (id: 2);

  /// List of external names referenced by the unit.
  referencedNames:[string] (id: 0);

  /// List of names which are used in `extends`, `with` or `implements` clauses
  /// in the file. Import prefixes and type arguments are not included.
  subtypedNames:[string] (id: 4);

  /// Unlinked information for the unit.
  unit:UnlinkedUnit (id: 1);

  /// Unlinked information for the unit.
  unit2:UnlinkedUnit2 (id: 5);
}

/// Information about a single declaration.
table AvailableDeclaration {
  children:[AvailableDeclaration] (id: 0);

  defaultArgumentListString:string (id: 1);

  defaultArgumentListTextRanges:[uint] (id: 2);

  docComplete:string (id: 3);

  docSummary:string (id: 4);

  fieldMask:uint (id: 5);

  isAbstract:bool (id: 6);

  isConst:bool (id: 7);

  isDeprecated:bool (id: 8);

  isFinal:bool (id: 9);

  /// The kind of the declaration.
  kind:AvailableDeclarationKind (id: 10);

  locationOffset:uint (id: 11);

  locationStartColumn:uint (id: 12);

  locationStartLine:uint (id: 13);

  /// The first part of the declaration name, usually the only one, for example
  /// the name of a class like `MyClass`, or a function like `myFunction`.
  name:string (id: 14);

  parameterNames:[string] (id: 15);

  parameters:string (id: 16);

  parameterTypes:[string] (id: 17);

  /// The partial list of relevance tags.  Not every declaration has one (for
  /// example, function do not currently), and not every declaration has to
  /// store one (for classes it can be computed when we know the library that
  /// includes this file).
  relevanceTags:[string] (id: 18);

  requiredParameterCount:uint (id: 19);

  returnType:string (id: 20);

  typeParameters:string (id: 21);
}

/// Information about an available, even if not yet imported file.
table AvailableFile {
  /// Declarations of the file.
  declarations:[AvailableDeclaration] (id: 0);

  /// The Dartdoc directives in the file.
  directiveInfo:DirectiveInfo (id: 5);

  /// Exports directives of the file.
  exports:[AvailableFileExport] (id: 1);

  /// Is `true` if this file is a library.
  isLibrary:bool (id: 2);

  /// Is `true` if this file is a library, and it is deprecated.
  isLibraryDeprecated:bool (id: 3);

  /// URIs of `part` directives.
  parts:[string] (id: 4);
}

/// Information about an export directive.
table AvailableFileExport {
  /// Combinators contained in this export directive.
  combinators:[AvailableFileExportCombinator] (id: 1);

  /// URI of the exported library.
  uri:string (id: 0);
}

/// Information about a `show` or `hide` combinator in an export directive.
table AvailableFileExportCombinator {
  /// List of names which are hidden.  Empty if this is a `show` combinator.
  hides:[string] (id: 1);

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

/// 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);
}

/// Information about the Dartdoc directives in an [AvailableFile].
table DirectiveInfo {
  /// The names of the defined templates.
  templateNames:[string] (id: 0);

  /// The values of the defined templates.
  templateValues:[string] (id: 1);
}

/// Summary information about a reference to an entity such as a type, top level
/// executable, or executable within a class.
table EntityRef {
  /// The kind of entity being represented.
  entityKind:EntityRefKind (id: 8);

  /// Notice: This will be deprecated. However, its not deprecated yet, as we're
  /// keeping it for backwards compatibilty, and marking it deprecated makes it
  /// unreadable.
  ///
  /// TODO(mfairhurst) mark this deprecated, and remove its logic.
  ///
  /// 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 the reference represents a type, the nullability of the type.
  nullabilitySuffix:EntityRefNullabilitySuffix (id: 10);

  /// 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] appears in a syntactic context where its type
  /// arguments might need to be inferred by a method other than
  /// instantiate-to-bounds, and [typeArguments] is empty, a slot id (which is
  /// unique within the compilation unit).  If an entry appears in
  /// [LinkedUnit.types] whose [slot] matches this value, that entry will
  /// contain the complete inferred type.
  ///
  /// This is called `refinedSlot` to clarify that if it points to an inferred
  /// type, it points to a type that is a "refinement" of this one (one in which
  /// some type arguments have been inferred).
  refinedSlot:uint (id: 9);

  /// 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 (if any).
  typeArguments:[EntityRef] (id: 1);

  /// If this is a function type, the type parameters defined for the function
  /// type (if any).
  typeParameters:[UnlinkedTypeParam] (id: 7);
}

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

  /// The absolute URI of the dependent library, e.g. `package:foo/bar.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);

  /// For each export in [UnlinkedUnit.exports], an index into [dependencies]
  /// of the library being exported.
  exportDependencies:[uint] (id: 6);

  /// 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, deprecated);

  /// 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 a linked AST node.
table LinkedNode {
  /// The explicit or inferred return type of a function typed node.
  variantField_24:LinkedNodeType (id: 24);

  variantField_2:[LinkedNode] (id: 2);

  variantField_11:LinkedNode (id: 11);

  variantField_4:[LinkedNode] (id: 4);

  variantField_6:LinkedNode (id: 6);

  variantField_15:uint (id: 15);

  variantField_7:LinkedNode (id: 7);

  variantField_17:uint (id: 17);

  variantField_23:LinkedNodeType (id: 23);

  variantField_8:LinkedNode (id: 8);

  variantField_16:uint (id: 16);

  variantField_18:uint (id: 18);

  variantField_19:uint (id: 19);

  variantField_27:bool (id: 27);

  variantField_9:LinkedNode (id: 9);

  variantField_12:LinkedNode (id: 12);

  variantField_5:[LinkedNode] (id: 5);

  variantField_13:LinkedNode (id: 13);

  variantField_34:uint (id: 34);

  variantField_33:uint (id: 33);

  variantField_28:[uint] (id: 28);

  variantField_29:LinkedNodeCommentType (id: 29);

  variantField_3:[LinkedNode] (id: 3);

  variantField_10:LinkedNode (id: 10);

  variantField_21:double (id: 21);

  variantField_25:LinkedNodeType (id: 25);

  variantField_26:LinkedNodeFormalParameterKind (id: 26);

  variantField_30:string (id: 30);

  variantField_14:LinkedNode (id: 14);

  isSynthetic:bool (id: 1);

  kind:LinkedNodeKind (id: 0);

  variantField_20:string (id: 20);

  variantField_31:bool (id: 31);

  variantField_35:TopLevelInferenceError (id: 35);

  variantField_22:string (id: 22);

  variantField_32:LinkedNodeVariablesDeclaration (id: 32);
}

/// Information about a group of libraries linked together, for example because
/// they form a single cycle, or because they represent a single build artifact.
table LinkedNodeBundle {
  libraries:[LinkedNodeLibrary] (id: 1);

  /// The shared list of references used in the [libraries].
  references:LinkedNodeReferences (id: 0);
}

/// Information about a single library in a [LinkedNodeBundle].
table LinkedNodeLibrary {
  exports:[uint] (id: 2);

  name:string (id: 3);

  nameLength:uint (id: 5);

  nameOffset:uint (id: 4);

  units:[LinkedNodeUnit] (id: 1);

  uriStr:string (id: 0);
}

/// Flattened tree of declarations referenced from [LinkedNode]s.
table LinkedNodeReferences {
  name:[string] (id: 1);

  parent:[uint] (id: 0);
}

/// Information about a Dart type.
table LinkedNodeType {
  functionFormalParameters:[LinkedNodeTypeFormalParameter] (id: 0);

  functionReturnType:LinkedNodeType (id: 1);

  functionTypeParameters:[LinkedNodeTypeTypeParameter] (id: 2);

  genericTypeAliasReference:uint (id: 7);

  genericTypeAliasTypeArguments:[LinkedNodeType] (id: 8);

  /// Reference to a [LinkedNodeReferences].
  interfaceClass:uint (id: 3);

  interfaceTypeArguments:[LinkedNodeType] (id: 4);

  kind:LinkedNodeTypeKind (id: 5);

  typeParameterId:uint (id: 6);
}

/// Information about a formal parameter in a function type.
table LinkedNodeTypeFormalParameter {
  kind:LinkedNodeFormalParameterKind (id: 0);

  name:string (id: 1);

  type:LinkedNodeType (id: 2);
}

/// Information about a type parameter in a function type.
table LinkedNodeTypeTypeParameter {
  bound:LinkedNodeType (id: 1);

  name:string (id: 0);
}

/// Information about a single library in a [LinkedNodeLibrary].
table LinkedNodeUnit {
  node:LinkedNode (id: 2);

  tokens:UnlinkedTokens (id: 1);

  uriStr:string (id: 0);
}

/// Information about a top-level declaration, or a field declaration that
/// contributes information to [LinkedNodeKind.variableDeclaration].
table LinkedNodeVariablesDeclaration {
  comment:LinkedNode (id: 0);

  isConst:bool (id: 1);

  isCovariant:bool (id: 2);

  isFinal:bool (id: 3);

  isStatic:bool (id: 4);
}

/// 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].  Otherwise zero.
  localIndex:uint (id: 6, deprecated);

  /// 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);

  /// List of slot ids (referring to [UnlinkedClass.notSimplyBoundedSlot] or
  /// [UnlinkedTypedef.notSimplyBoundedSlot]) corresponding to classes and
  /// typedefs that are not simply bounded.
  notSimplyBounded:[uint] (id: 5);

  /// List of slot ids (referring to [UnlinkedParam.inheritsCovariantSlot] or
  /// [UnlinkedVariable.inheritsCovariantSlot]) corresponding to parameters
  /// that inherit `@covariant` behavior from a base class.
  parametersInheritingCovariant:[uint] (id: 3);

  /// 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);

  /// The list of type inference errors.
  topLevelInferenceErrors:[TopLevelInferenceError] (id: 4);

  /// 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 {
  /// MD5 hash of the non-informative fields of the [PackageBundle] (not
  /// including this one).  This can be used to identify when the API of a
  /// package may have changed.
  apiSignature:string (id: 7, deprecated);

  /// Information about the packages this package depends on, if known.
  dependencies:[PackageDependencyInfo] (id: 8, deprecated);

  /// 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, deprecated);

  /// 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);
}

/// Information about a single dependency of a summary package.
table PackageDependencyInfo {
  /// API signature of this dependency.
  apiSignature:string (id: 0);

  /// If this dependency summarizes any files whose URI takes the form
  /// "package:<package_name>/...", a list of all such package names, sorted
  /// lexicographically.  Otherwise empty.
  includedPackageNames:[string] (id: 2);

  /// Indicates whether this dependency summarizes any files whose URI takes the
  /// form "dart:...".
  includesDartUris:bool (id: 4);

  /// Indicates whether this dependency summarizes any files whose URI takes the
  /// form "file:...".
  includesFileUris:bool (id: 3);

  /// Relative path to the summary file for this dependency.  This is intended
  /// as a hint to help the analysis server locate summaries of dependencies.
  /// We don't specify precisely what this path is relative to, but we expect
  /// it to be relative to a directory the analysis server can find (e.g. for
  /// projects built using Bazel, it would be relative to the "bazel-bin"
  /// directory).
  ///
  /// Absent if the path is not known.
  summaryPath:string (id: 1);
}

/// 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 identifier of the class member element name, or `null` if the element
  /// is a top-level element.  The list is sorted in ascending order, so that
  /// the client can quickly check whether an element is referenced in this
  /// [PackageIndex].
  elementNameClassMemberIds:[uint] (id: 7);

  /// Each item of this list corresponds to a unique referenced element.  It is
  /// the identifier of the named parameter name, or `null` if the element is
  /// not a named parameter.  The list is sorted in ascending order, so that the
  /// client can quickly check whether an element is referenced in this
  /// [PackageIndex].
  elementNameParameterIds:[uint] (id: 8);

  /// Each item of this list corresponds to a unique referenced element.  It is
  /// the identifier of the top-level element name, or `null` if the element is
  /// the unit.  The list is sorted in ascending order, so that the client can
  /// quickly check whether an element is referenced in this [PackageIndex].
  elementNameUnitMemberIds:[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);
}

/// Summary information about a top-level type inference error.
table TopLevelInferenceError {
  /// The [kind] specific arguments.
  arguments:[string] (id: 2);

  /// The kind of the error.
  kind:TopLevelInferenceErrorKind (id: 1);

  /// The slot id (which is unique within the compilation unit) identifying the
  /// target of type inference with which this [TopLevelInferenceError] is
  /// associated.
  slot:uint (id: 0);
}

/// 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:[UnlinkedExpr] (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);

  /// If the class might not be simply bounded, a nonzero slot id which is unique
  /// within this compilation unit.  If this id is found in
  /// [LinkedUnit.notSimplyBounded], then at least one of this class's type
  /// parameters is not simply bounded, hence this class can't be used as a raw
  /// type when specifying the bound of a type parameter.
  ///
  /// Otherwise, zero.
  notSimplyBoundedSlot:uint (id: 16);

  /// Superclass constraints for this mixin declaration. The list will be empty
  /// if this class is not a mixin declaration, or if the declaration does not
  /// have an `on` clause (in which case the type `Object` is implied).
  superclassConstraints:[EntityRef] (id: 14);

  /// Names of methods, getters, setters, and operators that this mixin
  /// declaration super-invokes.  For setters this includes the trailing "=".
  /// The list will be empty if this class is not a mixin declaration.
  superInvokedNames:[string] (id: 15);

  /// 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 single import or export configuration.
table UnlinkedConfiguration {
  /// The name of the declared variable whose value is being used in the
  /// condition.
  name:string (id: 0);

  /// The URI of the implementation library to be used if the condition is true.
  uri:string (id: 2);

  /// The value to which the value of the declared variable will be compared,
  /// or `true` if the condition does not include an equality test.
  value:string (id: 1);
}

/// Unlinked summary information about a constructor initializer.
table UnlinkedConstructorInitializer {
  /// If there are `m` [arguments] and `n` [argumentNames], then each argument
  /// from [arguments] with index `i` such that `n + i - m >= 0`, should be used
  /// with the name at `n + i - m`.
  argumentNames:[string] (id: 4);

  /// If [kind] is `thisInvocation` or `superInvocation`, the arguments of the
  /// invocation.  Otherwise empty.
  arguments:[UnlinkedExpr] (id: 3);

  /// If [kind] is `field`, the expression of the field initializer.
  /// Otherwise `null`.
  expression:UnlinkedExpr (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, deprecated);

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

  /// 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:[UnlinkedExpr] (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 {
  /// Annotations for this value.
  annotations:[UnlinkedExpr] (id: 3);

  /// 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:[UnlinkedExpr] (id: 6);

  /// If this executable's function body is declared using `=>`, the expression
  /// to the right of the `=>`.  May be omitted if neither type inference nor
  /// constant evaluation depends on the function body.
  bodyExpr:UnlinkedExpr (id: 29);

  /// 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 has body marked as being asynchronous.
  isAsynchronous:bool (id: 27);

  /// 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 has body marked as being a generator.
  isGenerator:bool (id: 28);

  /// 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:[string] (id: 22, deprecated);

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

  /// 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:[UnlinkedExpr] (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 export declaration.
  combinators:[UnlinkedCombinator] (id: 1);

  /// Configurations used to control which library will actually be loaded at
  /// run-time.
  configurations:[UnlinkedConfiguration] (id: 2);

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

/// Unlinked summary information about an expression.
///
/// 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 UnlinkedExpr {
  /// 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 a valid potentially constant
  /// expression.
  isValidConst:bool (id: 5);

  /// Sequence of operations to execute (starting with an empty stack) to form
  /// the constant value.
  operations:[UnlinkedExprOperation] (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);

  /// String representation of the expression in a form suitable to be tokenized
  /// and parsed.
  sourceRepresentation:string (id: 7);

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

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

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

  /// Configurations used to control which library will actually be loaded at
  /// run-time.
  configurations:[UnlinkedConfiguration] (id: 10);

  /// 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 function parameter.
table UnlinkedParam {
  /// Annotations for this parameter.
  annotations:[UnlinkedExpr] (id: 9);

  /// Code range of the parameter.
  codeRange:CodeRange (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);

  /// If this is a parameter of an instance method, a nonzero slot id which is
  /// unique within this compilation unit.  If this id is found in
  /// [LinkedUnit.parametersInheritingCovariant], then this parameter inherits
  /// `@covariant` behavior from a base class.
  ///
  /// Otherwise, zero.
  inheritsCovariantSlot:uint (id: 14);

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

  /// Indicates whether this parameter is explicitly marked as being covariant.
  isExplicitlyCovariant:bool (id: 15);

  /// Indicates whether the parameter is declared using the `final` keyword.
  isFinal:bool (id: 16);

  /// Indicates whether this is a function-typed parameter. A parameter is
  /// function-typed if the declaration of the parameter has explicit formal
  /// parameters
  /// ```
  /// int functionTyped(int p)
  /// ```
  /// but is not function-typed if it does not, even if the type of the
  /// parameter is a function type.
  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:[UnlinkedExpr] (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 statically - static 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);
}

/// TODO(scheglov) document
table UnlinkedTokens {
  /// The token that corresponds to this token, or `0` if this token is not
  /// the first of a pair of matching tokens (such as parentheses).
  endGroup:[uint] (id: 0);

  /// Return `true` if this token is a synthetic token. A synthetic token is a
  /// token that was introduced by the parser in order to recover from an error
  /// in the code.
  isSynthetic:[ubyte] (id: 1);

  kind:[UnlinkedTokenKind] (id: 2);

  length:[uint] (id: 3);

  lexeme:[string] (id: 4);

  /// The next token in the token stream, `0` for [UnlinkedTokenType.EOF] or
  /// the last comment token.
  next:[uint] (id: 5);

  offset:[uint] (id: 6);

  /// The first comment token in the list of comments that precede this token,
  /// or `0` if there are no comments preceding this token. Additional comments
  /// can be reached by following the token stream using [next] until `0` is
  /// reached.
  precedingComment:[uint] (id: 7);

  type:[UnlinkedTokenType] (id: 8);
}

/// Unlinked summary information about a typedef declaration.
table UnlinkedTypedef {
  /// Annotations for this typedef.
  annotations:[UnlinkedExpr] (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);

  /// If the typedef might not be simply bounded, a nonzero slot id which is
  /// unique within this compilation unit.  If this id is found in
  /// [LinkedUnit.notSimplyBounded], then at least one of this typedef's type
  /// parameters is not simply bounded, hence this typedef can't be used as a
  /// raw type when specifying the bound of a type parameter.
  ///
  /// Otherwise, zero.
  notSimplyBoundedSlot:uint (id: 9);

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

  /// If [style] is [TypedefStyle.functionType], the return type of the typedef.
  /// If [style] is [TypedefStyle.genericFunctionType], the function type being
  /// defined.
  returnType:EntityRef (id: 2);

  /// The style of the typedef.
  style:TypedefStyle (id: 8);

  /// 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:[UnlinkedExpr] (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 {
  /// MD5 hash of the non-informative fields of the [UnlinkedUnit] (not
  /// including this one) as 16 unsigned 8-bit integer values.  This can be used
  /// to identify when the API of a unit may have changed.
  apiSignature:[uint] (id: 19);

  /// 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, deprecated);

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

  /// Indicates whether the unit contains a "part of" declaration.
  isPartOf:bool (id: 18);

  /// Annotations for the library declaration, or the empty list if there is no
  /// library declaration.
  libraryAnnotations:[UnlinkedExpr] (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);

  /// Offsets of the first character of each line in the source code.
  lineStarts:[uint] (id: 17);

  /// Mixins declared in the compilation unit.
  mixins:[UnlinkedClass] (id: 20);

  /// 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 compilation unit.
table UnlinkedUnit2 {
  /// The MD5 hash signature of the API portion of this unit. It depends on all
  /// tokens that might affect APIs of declarations in the unit.
  apiSignature:[uint] (id: 0);

  /// URIs of `export` directives.
  exports:[string] (id: 1);

  /// URIs of `import` directives.
  imports:[string] (id: 2);

  /// Is `true` if the unit contains a `part of` directive.
  isPartOf:bool (id: 3);

  /// URIs of `part` directives.
  parts:[string] (id: 4);
}

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

  /// Code range of the variable.
  codeRange:CodeRange (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);

  /// If this is an instance non-final field, a nonzero slot id which is unique
  /// within this compilation unit.  If this id is found in
  /// [LinkedUnit.parametersInheritingCovariant], then the parameter of the
  /// synthetic setter inherits `@covariant` behavior from a base class.
  ///
  /// Otherwise, zero.
  inheritsCovariantSlot:uint (id: 15);

  /// 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 this variable is declared using the `covariant` keyword.
  /// This should be false for everything except instance fields.
  isCovariant:bool (id: 14);

  /// 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, deprecated);

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

root_type PackageBundle;

file_identifier "PBdl";
