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

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

Issue 1838883002: Add the '--build-summary-only-ast' flag for generating summaries using only ASTs. (Closed) Base URL: git@github.com:dart-lang/sdk.git@master
Patch Set: Created 4 years, 9 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 | « pkg/analyzer/lib/src/summary/package_bundle_reader.dart ('k') | pkg/analyzer_cli/lib/src/options.dart » ('j') | 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 42c3dc1c6e430158ea4a794391d3bf2bf58aa39a..800efff7a811d7e15678eecbcc0d3a178682847f 100644
--- a/pkg/analyzer_cli/lib/src/build_mode.dart
+++ b/pkg/analyzer_cli/lib/src/build_mode.dart
@@ -7,6 +7,7 @@ library analyzer_cli.src.build_mode;
import 'dart:core' hide Resource;
import 'dart:io' as io;
+import 'package:analyzer/dart/ast/ast.dart' show CompilationUnit;
import 'package:analyzer/dart/element/element.dart';
import 'package:analyzer/file_system/file_system.dart';
import 'package:analyzer/file_system/physical_file_system.dart';
@@ -17,8 +18,12 @@ import 'package:analyzer/src/generated/sdk_io.dart';
import 'package:analyzer/src/generated/source.dart';
import 'package:analyzer/src/generated/source_io.dart';
import 'package:analyzer/src/summary/format.dart';
+import 'package:analyzer/src/summary/idl.dart';
import 'package:analyzer/src/summary/package_bundle_reader.dart';
+import 'package:analyzer/src/summary/prelink.dart';
+import 'package:analyzer/src/summary/summarize_ast.dart';
import 'package:analyzer/src/summary/summarize_elements.dart';
+import 'package:analyzer/task/dart.dart';
import 'package:analyzer_cli/src/analyzer_impl.dart';
import 'package:analyzer_cli/src/driver.dart';
import 'package:analyzer_cli/src/error_formatter.dart';
@@ -32,10 +37,15 @@ class BuildMode {
final AnalysisStats stats;
final ResourceProvider resourceProvider = PhysicalResourceProvider.INSTANCE;
+ SummaryDataStore summaryDataStore;
InternalAnalysisContext context;
Map<Uri, JavaFile> uriToFileMap;
final List<Source> explicitSources = <Source>[];
+ PackageBundleAssembler assembler = new PackageBundleAssembler();
+ final Set<Source> processedSources = new Set<Source>();
+ final Map<Uri, UnlinkedUnit> uriToUnit = <Uri, UnlinkedUnit>{};
+
BuildMode(this.options, this.stats);
/**
@@ -84,13 +94,15 @@ class BuildMode {
// Write summary.
if (options.buildSummaryOutput != null) {
- PackageBundleAssembler assembler = new PackageBundleAssembler();
for (Source source in explicitSources) {
if (context.computeKindOf(source) == SourceKind.LIBRARY) {
if (options.buildSummaryFallback) {
assembler.addFallbackLibrary(source);
+ } else if (options.buildSummaryOnlyAst) {
+ _serializeAstBasedSummary(source);
} else {
- LibraryElement libraryElement = context.computeLibraryElement(source);
+ LibraryElement libraryElement =
+ context.computeLibraryElement(source);
assembler.serializeLibraryElement(libraryElement);
}
}
@@ -142,8 +154,12 @@ class BuildMode {
sdk.useSummary = true;
// Read the summaries.
- SummaryDataStore summaryDataStore =
- new SummaryDataStore(options.buildSummaryInputs);
+ summaryDataStore = new SummaryDataStore(options.buildSummaryInputs);
+
+ // In AST mode include SDK bundle to avoid parsing SDK sources.
+ if (options.buildSummaryOnlyAst) {
+ summaryDataStore.addBundle(null, sdk.getSummarySdkBundle());
+ }
// Create the context.
context = AnalysisEngine.instance.createAnalysisContext();
@@ -154,8 +170,8 @@ class BuildMode {
]);
// Set context options.
- Driver.setAnalysisContextOptions(
- context, options, (AnalysisOptionsImpl contextOptions) {
+ Driver.setAnalysisContextOptions(context, options,
+ (AnalysisOptionsImpl contextOptions) {
if (options.buildSummaryOnlyDiet) {
contextOptions.analyzeFunctionBodies = false;
}
@@ -195,6 +211,55 @@ class BuildMode {
}
/**
+ * Serialize the library with the given [source] into [assembler] using only
+ * its AST, [UnlinkedUnit]s of input packages and ASTs (via [UnlinkedUnit]s)
+ * of package sources.
+ */
+ void _serializeAstBasedSummary(Source source) {
+ Source resolveRelativeUri(String relativeUri) {
+ Source resolvedSource =
+ context.sourceFactory.resolveUri(source, relativeUri);
+ if (resolvedSource == null) {
+ context.sourceFactory.resolveUri(source, relativeUri);
+ throw new StateError('Could not resolve $relativeUri in the context of '
+ '$source (${source.runtimeType})');
+ }
+ return resolvedSource;
+ }
+
+ UnlinkedUnit _getUnlinkedUnit(Source source) {
+ // Maybe an input package contains the source.
+ {
+ String uriStr = source.uri.toString();
+ UnlinkedUnit unlinkedUnit = summaryDataStore.unlinkedMap[uriStr];
+ if (unlinkedUnit != null) {
+ return unlinkedUnit;
+ }
+ }
+ // Parse the source and serialize its AST.
+ return uriToUnit.putIfAbsent(source.uri, () {
+ CompilationUnit unit = context.computeResult(source, PARSED_UNIT);
+ UnlinkedUnitBuilder unlinkedUnit = serializeAstUnlinked(unit);
+ assembler.addUnlinkedUnit(source, unlinkedUnit);
+ return unlinkedUnit;
+ });
+ }
+
+ UnlinkedUnit getPart(String relativeUri) {
+ return _getUnlinkedUnit(resolveRelativeUri(relativeUri));
+ }
+
+ UnlinkedPublicNamespace getImport(String relativeUri) {
+ return getPart(relativeUri).publicNamespace;
+ }
+
+ UnlinkedUnitBuilder definingUnit = _getUnlinkedUnit(source);
+ LinkedLibraryBuilder linkedLibrary =
+ prelink(definingUnit, getPart, getImport);
+ assembler.addLinkedLibrary(source.uri.toString(), linkedLibrary);
+ }
+
+ /**
* Convert [sourceEntities] (a list of file specifications of the form
* "$uri|$path") to a map from URI to path. If an error occurs, report the
* error and return null.
« no previous file with comments | « pkg/analyzer/lib/src/summary/package_bundle_reader.dart ('k') | pkg/analyzer_cli/lib/src/options.dart » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698