blob: f6d3bd25225bb5b0e09524c7f65a5d173c2a7dc9 [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 'dart:typed_data';
import 'package:analyzer/src/summary2/data_reader.dart';
import 'package:analyzer/src/summary2/data_writer.dart';
import 'package:meta/meta.dart';
class PackageBundleBuilder {
final List<PackageBundleLibrary> _libraries = [];
void addLibrary(String uriStr, List<String> unitUriStrList) {
_libraries.add(
PackageBundleLibrary(
uriStr,
unitUriStrList.map((e) => PackageBundleUnit(e)).toList(),
),
);
}
Uint8List finish({
required Uint8List resolutionBytes,
PackageBundleSdk? sdk,
}) {
var byteSink = ByteSink();
var sink = BufferedSink(byteSink);
if (sdk != null) {
sink.writeByte(1);
sdk._write(sink);
} else {
sink.writeByte(0);
}
sink.writeList(_libraries, (PackageBundleLibrary library) {
sink.writeStringUtf8(library.uriStr);
sink.writeList(
library.units,
(PackageBundleUnit unit) => sink.writeStringUtf8(unit.uriStr),
);
});
sink.writeUint8List(resolutionBytes);
return sink.flushAndTake();
}
}
@internal
class PackageBundleLibrary {
final String uriStr;
final List<PackageBundleUnit> units;
PackageBundleLibrary(this.uriStr, this.units);
}
class PackageBundleReader {
final List<PackageBundleLibrary> libraries = [];
late final PackageBundleSdk? _sdk;
late final Uint8List _resolutionBytes;
PackageBundleReader(Uint8List bytes) {
var reader = SummaryDataReader(bytes);
var hasSdk = reader.readByte() != 0;
if (hasSdk) {
_sdk = PackageBundleSdk._fromReader(reader);
}
var librariesLength = reader.readUInt30();
for (var i = 0; i < librariesLength; i++) {
var uriStr = reader.readStringUtf8();
var unitsLength = reader.readUInt30();
var units = List.generate(unitsLength, (_) {
var uriStr = reader.readStringUtf8();
return PackageBundleUnit(uriStr);
});
libraries.add(
PackageBundleLibrary(uriStr, units),
);
}
_resolutionBytes = reader.readUint8List();
}
Uint8List get resolutionBytes => _resolutionBytes;
PackageBundleSdk? get sdk => _sdk;
}
class PackageBundleSdk {
final int languageVersionMajor;
final int languageVersionMinor;
/// The content of the `allowed_experiments.json` from SDK.
final String allowedExperimentsJson;
PackageBundleSdk({
required this.languageVersionMajor,
required this.languageVersionMinor,
required this.allowedExperimentsJson,
});
factory PackageBundleSdk._fromReader(SummaryDataReader reader) {
return PackageBundleSdk(
languageVersionMajor: reader.readUInt30(),
languageVersionMinor: reader.readUInt30(),
allowedExperimentsJson: reader.readStringUtf8(),
);
}
void _write(BufferedSink sink) {
sink.writeUInt30(languageVersionMajor);
sink.writeUInt30(languageVersionMinor);
sink.writeStringUtf8(allowedExperimentsJson);
}
}
@internal
class PackageBundleUnit {
final String uriStr;
PackageBundleUnit(this.uriStr);
}