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

  TYPE_ALIAS,

  VARIABLE
}

/// 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: an unnamed constructor.
  ///   Is invoked by an enum constant, without arguments, which is special
  ///   because when the name given, an empty argument list must be added.
  /// Right: location.
  IS_INVOKED_BY_ENUM_CONSTANT_WITHOUT_ARGUMENTS,

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

  /// Left: a constructor.
  ///   Is referenced by a constructor tear-off at, which is special because
  ///   the name of the constructor is required (`new` for unnamed).
  /// Right: location.
  IS_REFERENCED_BY_CONSTRUCTOR_TEAR_OFF,

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

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

  isStatic:bool (id: 12);

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

  locationOffset:uint (id: 14);

  locationStartColumn:uint (id: 15);

  locationStartLine:uint (id: 16);

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

  parameterNames:[string] (id: 18);

  parameters:string (id: 19);

  parameterTypes:[string] (id: 20);

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

  requiredParameterCount:uint (id: 22);

  returnType:string (id: 23);

  typeParameters:string (id: 24);
}

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

/// Errors for a single unit.
table CiderUnitErrors {
  errors:[AnalysisDriverUnitError] (id: 1);

  /// The hash signature of this data.
  signature:[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);

  /// The URL of the message, if any.
  url:string (id: 4);
}

/// 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 package.
table PackageBundle {
  /// The version 2 of the summary.
  fake:uint (id: 0);
}

root_type PackageBundle;

file_identifier "PBdl";
