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

  EXTENSION,

  FIELD,

  FUNCTION,

  FUNCTION_TYPE_ALIAS,

  GETTER,

  METHOD,

  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,

  commentReference,

  compilationUnit,

  conditionalExpression,

  configuration,

  constructorDeclaration,

  constructorFieldInitializer,

  constructorName,

  continueStatement,

  declaredIdentifier,

  defaultFormalParameter,

  doubleLiteral,

  doStatement,

  dottedName,

  emptyFunctionBody,

  emptyStatement,

  enumConstantDeclaration,

  enumDeclaration,

  exportDirective,

  expressionFunctionBody,

  expressionStatement,

  extendsClause,

  extensionDeclaration,

  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,

  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,

  extensionOverride
}

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

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

  EQ_EQ_EQ,

  EXPORT,

  EXTENDS,

  EXTERNAL,

  FACTORY,

  FALSE,

  FINAL,

  FINALLY,

  FOR,

  FUNCTION,

  FUNCTION_KEYWORD,

  GET,

  GT,

  GT_EQ,

  GT_GT,

  GT_GT_EQ,

  GT_GT_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 context messages associated with the error.
  contextMessages:[DiagnosticMessage] (id: 5);

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

  codeLength:uint (id: 1);

  codeOffset:uint (id: 2);

  defaultArgumentListString:string (id: 3);

  defaultArgumentListTextRanges:[uint] (id: 4);

  docComplete:string (id: 5);

  docSummary:string (id: 6);

  fieldMask:uint (id: 7);

  isAbstract:bool (id: 8);

  isConst:bool (id: 9);

  isDeprecated:bool (id: 10);

  isFinal:bool (id: 11);

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

  locationOffset:uint (id: 13);

  locationStartColumn:uint (id: 14);

  locationStartLine:uint (id: 15);

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

  parameterNames:[string] (id: 17);

  parameters:string (id: 18);

  parameterTypes:[string] (id: 19);

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

  requiredParameterCount:uint (id: 21);

  returnType:string (id: 22);

  typeParameters:string (id: 23);
}

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

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

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

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

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

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

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

table DiagnosticMessage {
  /// The absolute and normalized path of the file associated with this message.
  filePath:string (id: 0);

  /// The length of the source range associated with this message.
  length:uint (id: 1);

  /// The text of the message.
  message:string (id: 2);

  /// The zero-based offset from the start of the file to the beginning of the
  /// source range associated with this message.
  offset:uint (id: 3);
}

/// 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_4:[LinkedNode] (id: 4);

  variantField_6:LinkedNode (id: 6);

  variantField_7:LinkedNode (id: 7);

  variantField_17:uint (id: 17);

  variantField_8:LinkedNode (id: 8);

  variantField_38:LinkedNodeTypeSubstitution (id: 38);

  variantField_15:uint (id: 15);

  variantField_28:UnlinkedTokenType (id: 28);

  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_33:[string] (id: 33);

  variantField_29:LinkedNodeCommentType (id: 29);

  variantField_3:[LinkedNode] (id: 3);

  variantField_10:LinkedNode (id: 10);

  variantField_26:LinkedNodeFormalParameterKind (id: 26);

  variantField_21:double (id: 21);

  variantField_25:LinkedNodeType (id: 25);

  variantField_20:string (id: 20);

  variantField_39:[LinkedNodeType] (id: 39);

  flags:uint (id: 18);

  variantField_1:string (id: 1);

  variantField_36:uint (id: 36);

  variantField_16:uint (id: 16);

  variantField_30:string (id: 30);

  variantField_14:LinkedNode (id: 14);

  kind:LinkedNodeKind (id: 0);

  variantField_34:[string] (id: 34);

  name:string (id: 37);

  variantField_31:bool (id: 31);

  variantField_35:UnlinkedTokenType (id: 35);

  variantField_32:TopLevelInferenceError (id: 32);

  variantField_23:LinkedNodeType (id: 23);

  variantField_11:LinkedNode (id: 11);

  variantField_22:string (id: 22);

  variantField_19:uint (id: 19);
}

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

  /// The typedef this function type is created for.
  functionTypedef:uint (id: 9);

  functionTypedefTypeArguments:[LinkedNodeType] (id: 10);

  functionTypeParameters:[LinkedNodeTypeTypeParameter] (id: 2);

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

  interfaceTypeArguments:[LinkedNodeType] (id: 4);

  kind:LinkedNodeTypeKind (id: 5);

  nullabilitySuffix:EntityRefNullabilitySuffix (id: 8);

  typeParameterElement:uint (id: 6);

  typeParameterId:uint (id: 7);
}

/// 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 substitution.
table LinkedNodeTypeSubstitution {
  typeArguments:[LinkedNodeType] (id: 1);

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

/// 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 {
  isNNBD:bool (id: 4);

  isSynthetic:bool (id: 3);

  node:LinkedNode (id: 2);

  /// If the unit is a part, the URI specified in the `part` directive.
  /// Otherwise empty.
  partUriStr:string (id: 5);

  tokens:UnlinkedTokens (id: 1);

  /// The absolute URI.
  uriStr:string (id: 0);
}

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

  /// The version 2 of the summary.
  bundle2:LinkedNodeBundle (id: 9);

  /// 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 extension declaration.
table UnlinkedExtension {
  /// Annotations for this extension.
  annotations:[UnlinkedExpr] (id: 4);

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

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

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

  /// The type being extended.
  extendedType:EntityRef (id: 3);

  /// Field declarations contained in the extension.
  fields:[UnlinkedVariable] (id: 8);

  /// Name of the extension, or an empty string if there is no name.
  name:string (id: 0);

  /// Offset of the extension name relative to the beginning of the file, or
  /// zero if there is no name.
  nameOffset:uint (id: 1);

  /// Type parameters of the extension, if any.
  typeParameters:[UnlinkedTypeParam] (id: 6);
}

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

table UnlinkedInformativeData {
  variantField_2:uint (id: 2);

  variantField_3:uint (id: 3);

  variantField_9:uint (id: 9);

  variantField_8:uint (id: 8);

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

  variantField_6:uint (id: 6);

  variantField_5:uint (id: 5);

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

  variantField_1:uint (id: 1);

  variantField_4:[string] (id: 4);

  /// The kind of the node.
  kind:LinkedNodeKind (id: 0);
}

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

  /// Extensions declared in the compilation unit.
  extensions:[UnlinkedExtension] (id: 22);

  /// 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 this compilation unit is opted into NNBD.
  isNNBD:bool (id: 21);

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

  /// Is `true` if the unit contains a `library` directive.
  hasLibraryDirective:bool (id: 6);

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

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

  informativeData:[UnlinkedInformativeData] (id: 7);

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

  /// 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 `late` keyword.
  isLate:bool (id: 16);

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