blob: 069e06e424f35e66e4628ce7c6723caba29fb541 [file] [log] [blame]
// Copyright (c) 2020, 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.
import 'package:analyzer/src/summary2/ast_binary_tag.dart';
class AstBundle {
/// The blob with libraries.
///
/// Items of [libraryOffsets] point here.
List<AstLibrary>? libraries;
/// Pointers to libraries in the [libraries] blob.
///
/// We need these offsets because we read [ResolutionLibrary] only
/// partially - URI, offsets of units, but nothing about units. So,
/// we don't know where one library ends, and another starts.
///
/// TODO(scheglov) too complicated? Read all?
List<Uint30>? libraryOffsets;
/// [stringTableOffset] points here.
StringTableFormat? stringTable;
/// We record `uint32` to know exactly the location of this field.
/// It is always at the end of the byte buffer `-4`.
Uint32? librariesOffset;
/// We record `uint32` to know exactly the location of this field.
/// It is always at the end of the byte buffer `-0`.
Uint32? stringTableOffset;
}
class AstLibrary {
/// The name from the `library` directive, might be the empty string.
StringRef? name;
/// The offset `+1` of the name in the `library` directive.
/// So, `0` if absent, decoded then into `-1`.
Uint30? nameOffset;
/// The length of the name in the `library` directive, `0` if absent.
Uint30? nameLength;
/// Offsets pointing at [AstUnitFormat.headerOffset].
List<Uint30>? unitOffsets;
}
class AstUnitFormat {
/// The header of the unit, read when create the reader.
/// [headerOffset] points here.
AstUnitHeader? header;
/// [AstUnitIndexItem.offset] from [indexOfMembers] points into here.
Object? declarations;
/// The offset of [header].
Uint30? headerOffset;
/// The index of declarations in the unit.
List<AstUnitIndexItem>? indexOfMembers;
}
class AstUnitHeader {
/// Four elements: package major/minor, override major/minor.
/// The override is `+1`, if `0` then no override.
FormatUint32List? languageVersion;
/// Encoded feature set.
FormatUint32List? featureSet;
}
class AstUnitIndexItem {
/// The offset in [AstUnitFormat.declarations].
Uint30? offset;
/// The tag of the declaration from [Tag].
Byte? tag;
/// If not [Tag.TopLevelVariableDeclaration], the name of the declaration.
/// Otherwise absent, [topLevelVariableNames] instead.
StringRef? name;
/// If [Tag.TopLevelVariableDeclaration], the names of the variables.
/// Otherwise absent, [name] instead.
List<StringRef>? topLevelVariableNames;
}
class Byte {}
class FormatUint32List {}
class ResolutionBundle {
/// The blob with libraries.
///
/// [libraryOffsets] points here.
List<ResolutionLibrary>? libraries;
/// Pointers to libraries in the [libraries] blob.
///
/// We need these offsets because we read [ResolutionLibrary] only
/// partially - URI, offsets of units, but nothing about units. So,
/// we don't know where one library ends, and another starts.
///
/// TODO(scheglov) too complicated? Read all?
List<Uint30>? libraryOffsets;
/// The index of the parent reference, so we can add its name from
/// the [referenceNames]. Is `0` for the root.
///
/// [referencesOffset] points here.
List<Uint30>? referenceParents;
/// The name of this component of a reference, e.g. `String` or `@class`.
/// Is the empty string for the root.
List<StringRef>? referenceNames;
/// We record `uint32` to know exactly the location of this field.
/// It is always at the end of the byte buffer `-8`.
Uint32? librariesOffset;
/// We record `uint32` to know exactly the location of this field.
/// It is always at the end of the byte buffer `-4`.
///
/// Points at [referenceParents].
Uint32? referencesOffset;
/// We record `uint32` to know exactly the location of this field.
/// It is always at the end of the byte buffer `-0`.
Uint32? stringTableOffset;
}
class ResolutionLibrary {
/// The blob with units.
List<ResolutionUnitFormat>? units;
/// [ResolutionBundle.libraryOffsets] points here.
StringRef? uriStr;
/// Indexes of exported elements in [ResolutionBundle.referenceNames].
List<Uint30>? exportedReferences;
/// Absolute offsets pointing at [ResolutionUnitFormat.uriStr].
List<Uint30>? unitOffsets;
}
class ResolutionUnitFormat {
/// [ResolutionLibrary.unitOffsets] points here.
StringRef? uriStr;
Byte? isSynthetic;
Byte? isPart;
/// If [isPart], the URI that is used in the `part` directive.
/// The empty string for the defining unit.
StringRef? partUriStr;
/// The offset of the resolution information for directives.
/// For example resolution of metadata.
Uint30? directivesResolutionOffset;
/// Offsets of the resolution information for each declaration.
List<Uint30>? declarationOffsets;
}
/// The reference to a [String], in form of [Uint30].
class StringRef {}
/// Any string is witten as [Uint30] and is an index into the string table.
/// So, we can write each unique string only once.
class StringTableFormat {
/// The blob with WTF8 encoded strings.
Object? strings;
/// The length of [strings] in bytes. So, we know how much to go back in
/// the byte buffer from here to start reading strings.
Uint30? lengthInBytes;
/// The length of each string in bytes inside [strings].
///
/// This allows us to read strings lazily as they are requested.
List<Uint30>? lengths;
}
class Uint30 {}
class Uint32 {}