Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(15)

Unified Diff: pkg/analyzer_cli/lib/src/build_mode.dart

Issue 2994753002: Prepare all unlinked units before linking. (Closed)
Patch Set: Created 3 years, 4 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « no previous file | no next file » | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: pkg/analyzer_cli/lib/src/build_mode.dart
diff --git a/pkg/analyzer_cli/lib/src/build_mode.dart b/pkg/analyzer_cli/lib/src/build_mode.dart
index 353563159a40e0c887cf877ff9d9d4fa3e82475b..1c9a13a4a598f35a99152b70483996f7f24cc465 100644
--- a/pkg/analyzer_cli/lib/src/build_mode.dart
+++ b/pkg/analyzer_cli/lib/src/build_mode.dart
@@ -136,7 +136,7 @@ class BuildMode {
PackageBundleAssembler assembler;
final Set<Source> processedSources = new Set<Source>();
- final Map<Uri, UnlinkedUnit> uriToUnit = <Uri, UnlinkedUnit>{};
+ final Map<String, UnlinkedUnit> uriToUnit = <String, UnlinkedUnit>{};
BuildMode(this.resourceProvider, this.options, this.stats);
@@ -206,22 +206,26 @@ class BuildMode {
// Write summary.
assembler = new PackageBundleAssembler();
if (_shouldOutputSummary) {
- if (options.buildSummaryOnlyUnlinked) {
- for (var src in explicitSources) {
- // Note: This adds the unit to the assembler if it needed to be
- // computed, so we don't need to explicitly do that.
- _unlinkedUnitForUri('${src.uri}');
- }
- } else {
- Set<String> unlinkedUris =
- explicitSources.map((Source s) => s.uri.toString()).toSet();
+ // Prepare all unlinked units.
+ for (var src in explicitSources) {
+ _prepareUnlinkedUnit('${src.uri}');
+ }
+
+ // Build and assemble linked libraries.
+ if (!options.buildSummaryOnlyUnlinked) {
+ // Prepare URIs of unlinked units that should be linked.
+ var unlinkedUris = new Set<String>();
for (var bundle in unlinkedBundles) {
unlinkedUris.addAll(bundle.unlinkedUnitUris);
}
-
- _serializeAstBasedSummary(unlinkedUris);
+ for (var src in explicitSources) {
+ unlinkedUris.add('${src.uri}');
+ }
+ // Perform linking.
+ _computeLinkedLibraries(unlinkedUris);
assembler.recordDependencies(summaryDataStore);
}
+
// Write the whole package bundle.
PackageBundleBuilder bundle = assembler.assemble();
if (options.buildSummaryOutput != null) {
@@ -244,6 +248,27 @@ class BuildMode {
}
}
+ /**
+ * Compute linked libraries for the given [libraryUris] using the linked
+ * libraries of the [summaryDataStore] and unlinked units in [uriToUnit], and
+ * add them to the [assembler].
+ */
+ void _computeLinkedLibraries(Set<String> libraryUris) {
+ LinkedLibrary getDependency(String absoluteUri) =>
+ summaryDataStore.linkedMap[absoluteUri];
+
+ UnlinkedUnit getUnit(String absoluteUri) =>
+ summaryDataStore.unlinkedMap[absoluteUri] ?? uriToUnit[absoluteUri];
+
+ Map<String, LinkedLibraryBuilder> linkResult = link(
+ libraryUris,
+ getDependency,
+ getUnit,
+ context.declaredVariables.get,
+ options.strongMode);
+ linkResult.forEach(assembler.addLinkedLibrary);
+ }
+
ErrorSeverity _computeMaxSeverity() {
ErrorSeverity maxSeverity = ErrorSeverity.NONE;
if (!options.buildSuppressExitCode) {
@@ -362,6 +387,32 @@ class BuildMode {
}
/**
+ * Ensure that the [UnlinkedUnit] for [absoluteUri] is available.
+ *
+ * If the unit is in the input [summaryDataStore], do nothing.
+ *
+ * Otherwise compute it and store into the [uriToUnit] and [assembler].
+ */
+ void _prepareUnlinkedUnit(String absoluteUri) {
+ // Maybe an input package contains the source.
+ if (summaryDataStore.unlinkedMap[absoluteUri] != null) {
+ return;
+ }
+ // Parse the source and serialize its AST.
+ Uri uri = Uri.parse(absoluteUri);
+ Source source = context.sourceFactory.forUri2(uri);
+ if (!source.exists()) {
+ // TODO(paulberry): we should report a warning/error because DDC
+ // compilations are unlikely to work.
+ return;
+ }
+ CompilationUnit unit = context.computeResult(source, PARSED_UNIT);
+ UnlinkedUnitBuilder unlinkedUnit = serializeAstUnlinked(unit);
+ uriToUnit[absoluteUri] = unlinkedUnit;
+ assembler.addUnlinkedUnit(source, unlinkedUnit);
+ }
+
+ /**
* Print errors for all explicit sources. If [outputPath] is supplied, output
* is sent to a new file at that path.
*/
@@ -389,54 +440,6 @@ class BuildMode {
new io.File(outputPath).writeAsStringSync(buffer.toString());
}
}
-
- /**
- * Serialize the package with the given [sources] into [assembler] using only
- * their ASTs and [LinkedUnit]s of input packages.
- */
- void _serializeAstBasedSummary(Set<String> unlinkedUris) {
- LinkedLibrary _getDependency(String absoluteUri) =>
- summaryDataStore.linkedMap[absoluteUri];
-
- Map<String, LinkedLibraryBuilder> linkResult = link(
- unlinkedUris,
- _getDependency,
- _unlinkedUnitForUri,
- context.declaredVariables.get,
- options.strongMode);
- linkResult.forEach(assembler.addLinkedLibrary);
- }
-
- /**
- * Returns the [UnlinkedUnit] for [absoluteUri], either by computing it or
- * using the stored one in [uriToUnit].
- *
- * If the [UnlinkedUnit] needed to be computed, it will also be added to the
- * [assembler].
- */
- UnlinkedUnit _unlinkedUnitForUri(String absoluteUri) {
- // Maybe an input package contains the source.
- {
- UnlinkedUnit unlinkedUnit = summaryDataStore.unlinkedMap[absoluteUri];
- if (unlinkedUnit != null) {
- return unlinkedUnit;
- }
- }
- // Parse the source and serialize its AST.
- Uri uri = Uri.parse(absoluteUri);
- Source source = context.sourceFactory.forUri2(uri);
- if (!source.exists()) {
- // TODO(paulberry): we should report a warning/error because DDC
- // compilations are unlikely to work.
- return null;
- }
- return uriToUnit.putIfAbsent(uri, () {
- CompilationUnit unit = context.computeResult(source, PARSED_UNIT);
- UnlinkedUnitBuilder unlinkedUnit = serializeAstUnlinked(unit);
- assembler.addUnlinkedUnit(source, unlinkedUnit);
- return unlinkedUnit;
- });
- }
}
/**
« no previous file with comments | « no previous file | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698