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

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

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

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

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

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

/// Information about a compilation unit, contains the content hash
/// and unlinked summary.
table CiderUnlinkedUnit {
  /// The hash signature of the contents of the file.
  contentDigest:[uint] (id: 0);

  /// Unlinked summary of the compilation unit.
  unlinkedUnit:UnlinkedUnit2 (id: 1);
}

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

/// Unlinked summary information about a namespace directive.
table UnlinkedNamespaceDirective {
  /// The configurations that control which library will actually be used.
  configurations:[UnlinkedNamespaceDirectiveConfiguration] (id: 0);

  /// The URI referenced by this directive, nad used by default when none
  /// of the [configurations] matches.
  uri:string (id: 1);
}

/// Unlinked summary information about a namespace directive configuration.
table UnlinkedNamespaceDirectiveConfiguration {
  /// The name of the declared variable used in the condition.
  name:string (id: 0);

  /// The URI 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 the empty string if the condition does not include an equality test.
  value:string (id: 1);
}

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

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

  /// The library name of the `part of my.name;` directive.
  partOfName:string (id: 8);

  /// URI of the `part of 'uri';` directive.
  partOfUri:string (id: 7);

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

root_type PackageBundle;

file_identifier "PBdl";
