blob: d3f0b359e5838b0d6fc3ae8332da3cf918f13b35 [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/dart/analysis/results.dart';
import 'package:analyzer/file_system/file_system.dart';
import 'package:analyzer/src/context/packages.dart';
import 'package:analyzer/src/dart/analysis/byte_store.dart';
import 'package:analyzer/src/dart/analysis/driver.dart';
import 'package:analyzer/src/dart/analysis/performance_logger.dart';
import 'package:analyzer/src/dart/element/element.dart';
import 'package:analyzer/src/dart/sdk/sdk.dart';
import 'package:analyzer/src/generated/engine.dart';
import 'package:analyzer/src/generated/source.dart';
import 'package:analyzer/src/summary2/bundle_writer.dart';
import 'package:analyzer/src/summary2/package_bundle_format.dart';
import 'package:yaml/yaml.dart';
/// Build summary for SDK at the given [sdkPath].
///
/// If [embedderYamlPath] is provided, then libraries from this file are
/// appended to the libraries of the specified SDK.
Future<Uint8List> buildSdkSummary2({
required ResourceProvider resourceProvider,
required String sdkPath,
String? embedderYamlPath,
}) async {
var sdk = FolderBasedDartSdk(
resourceProvider,
resourceProvider.getFolder(sdkPath),
);
// Append libraries from the embedder.
if (embedderYamlPath != null) {
var file = resourceProvider.getFile(embedderYamlPath);
var content = file.readAsStringSync();
var map = loadYaml(content) as YamlMap;
var embedderSdk = EmbedderSdk(
resourceProvider,
{file.parent: map},
languageVersion: sdk.languageVersion,
);
for (var library in embedderSdk.sdkLibraries) {
var uriStr = library.shortName;
if (sdk.libraryMap.getLibrary(uriStr) == null) {
sdk.libraryMap.setLibrary(uriStr, library);
}
}
}
final logger = PerformanceLog(StringBuffer());
final scheduler = AnalysisDriverScheduler(logger);
final analysisDriver = AnalysisDriver(
scheduler: scheduler,
logger: logger,
resourceProvider: resourceProvider,
byteStore: MemoryByteStore(),
sourceFactory: SourceFactory([
DartUriResolver(sdk),
]),
analysisOptions: AnalysisOptionsImpl(),
packages: Packages({}),
);
scheduler.start();
final analysisSession = analysisDriver.currentSession;
final elementFactory = analysisDriver.libraryContext.elementFactory;
final bundleWriter = BundleWriter(
elementFactory.dynamicRef,
);
final packageBuilder = PackageBundleBuilder();
for (final uriStr in sdk.uris) {
final libraryResult = await analysisSession.getLibraryByUri(uriStr);
libraryResult as LibraryElementResult;
final libraryElement = libraryResult.element as LibraryElementImpl;
bundleWriter.writeLibraryElement(libraryElement);
packageBuilder.addLibrary(
uriStr,
libraryElement.units.map((e) {
return e.source.uri.toString();
}).toList(),
);
}
final writeWriterResult = bundleWriter.finish();
return packageBuilder.finish(
resolutionBytes: writeWriterResult.resolutionBytes,
sdk: PackageBundleSdk(
languageVersionMajor: sdk.languageVersion.major,
languageVersionMinor: sdk.languageVersion.minor,
allowedExperimentsJson: sdk.allowedExperimentsJson,
),
);
}