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