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

/// Top-level declarations in a compilation unit.
table CiderUnitTopLevelDeclarations {
  extensionNames:[string] (id: 0);

  functionNames:[string] (id: 1);

  typeNames:[string] (id: 2);

  variableNames:[string] (id: 3);
}

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

  /// Top-level declarations of the unit.
  topLevelDeclarations:CiderUnitTopLevelDeclarations (id: 1);

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

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