| 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 1c9a13a4a598f35a99152b70483996f7f24cc465..cb6a97cdbee324ce7727c7cf8d0b44912104457b 100644
|
| --- a/pkg/analyzer_cli/lib/src/build_mode.dart
|
| +++ b/pkg/analyzer_cli/lib/src/build_mode.dart
|
| @@ -7,9 +7,10 @@ library analyzer_cli.src.build_mode;
|
| import 'dart:async';
|
| import 'dart:io' as io;
|
|
|
| -import 'package:analyzer/dart/ast/ast.dart' show CompilationUnit;
|
| import 'package:analyzer/error/error.dart';
|
| import 'package:analyzer/file_system/file_system.dart';
|
| +import 'package:analyzer/src/dart/analysis/driver.dart';
|
| +import 'package:analyzer/src/dart/analysis/file_state.dart';
|
| import 'package:analyzer/src/dart/sdk/sdk.dart';
|
| import 'package:analyzer/src/generated/engine.dart';
|
| import 'package:analyzer/src/generated/sdk.dart';
|
| @@ -23,12 +24,13 @@ import 'package:analyzer/src/summary/package_bundle_reader.dart';
|
| import 'package:analyzer/src/summary/summarize_ast.dart';
|
| import 'package:analyzer/src/summary/summarize_elements.dart';
|
| import 'package:analyzer/src/summary/summary_sdk.dart' show SummaryBasedDartSdk;
|
| -import 'package:analyzer/task/dart.dart';
|
| import 'package:analyzer_cli/src/driver.dart';
|
| import 'package:analyzer_cli/src/error_formatter.dart';
|
| import 'package:analyzer_cli/src/error_severity.dart';
|
| import 'package:analyzer_cli/src/options.dart';
|
| import 'package:bazel_worker/bazel_worker.dart';
|
| +import 'package:front_end/src/base/performace_logger.dart';
|
| +import 'package:front_end/src/byte_store/byte_store.dart';
|
|
|
| /**
|
| * Persistent Bazel worker.
|
| @@ -55,8 +57,10 @@ class AnalyzerWorkerLoop extends AsyncWorkerLoop {
|
| /**
|
| * Performs analysis with given [options].
|
| */
|
| - void analyze(CommandLineOptions options) {
|
| - new BuildMode(resourceProvider, options, new AnalysisStats()).analyze();
|
| + Future<Null> analyze(CommandLineOptions options) async {
|
| + var buildMode =
|
| + new BuildMode(resourceProvider, options, new AnalysisStats());
|
| + await buildMode.analyze();
|
| AnalysisEngine.instance.clearCaches();
|
| }
|
|
|
| @@ -81,7 +85,7 @@ class AnalyzerWorkerLoop extends AsyncWorkerLoop {
|
| throw new ArgumentError(msg);
|
| });
|
| // Analyze and respond.
|
| - analyze(options);
|
| + await analyze(options);
|
| String msg = _getErrorOutputBuffersText();
|
| return new WorkResponse()
|
| ..exitCode = EXIT_CODE_OK
|
| @@ -129,7 +133,8 @@ class BuildMode {
|
| final AnalysisStats stats;
|
|
|
| SummaryDataStore summaryDataStore;
|
| - InternalAnalysisContext context;
|
| + AnalysisOptions analysisOptions;
|
| + AnalysisDriver analysisDriver;
|
| Map<Uri, File> uriToFileMap;
|
| final List<Source> explicitSources = <Source>[];
|
| final List<PackageBundle> unlinkedBundles = <PackageBundle>[];
|
| @@ -147,7 +152,7 @@ class BuildMode {
|
| /**
|
| * Perform package analysis according to the given [options].
|
| */
|
| - ErrorSeverity analyze() {
|
| + Future<ErrorSeverity> analyze() async {
|
| // Write initial progress message.
|
| if (!options.machineFormat) {
|
| outSink.writeln("Analyzing ${options.sourceFiles.join(', ')}...");
|
| @@ -169,9 +174,9 @@ class BuildMode {
|
| uriPipePath.substring(uriPipePath.indexOf('|') + 1))
|
| .toList());
|
|
|
| - // Prepare the analysis context.
|
| + // Prepare the analysis driver.
|
| try {
|
| - _createContext();
|
| + _createAnalysisDriver();
|
| } on ConflictingSummaryException catch (e) {
|
| errorSink.writeln('$e');
|
| io.exitCode = ErrorSeverity.ERROR.ordinal;
|
| @@ -179,7 +184,6 @@ class BuildMode {
|
| }
|
|
|
| // Add sources.
|
| - ChangeSet changeSet = new ChangeSet();
|
| for (Uri uri in uriToFileMap.keys) {
|
| File file = uriToFileMap[uri];
|
| if (!file.exists) {
|
| @@ -189,18 +193,6 @@ class BuildMode {
|
| }
|
| Source source = new FileSource(file, uri);
|
| explicitSources.add(source);
|
| - changeSet.addedSource(source);
|
| - }
|
| - context.applyChanges(changeSet);
|
| -
|
| - if (!options.buildSummaryOnly) {
|
| - // Perform full analysis.
|
| - while (true) {
|
| - AnalysisResult analysisResult = context.performAnalysisTask();
|
| - if (!analysisResult.hasMoreWork) {
|
| - break;
|
| - }
|
| - }
|
| }
|
|
|
| // Write summary.
|
| @@ -208,7 +200,7 @@ class BuildMode {
|
| if (_shouldOutputSummary) {
|
| // Prepare all unlinked units.
|
| for (var src in explicitSources) {
|
| - _prepareUnlinkedUnit('${src.uri}');
|
| + await _prepareUnlinkedUnit('${src.uri}');
|
| }
|
|
|
| // Build and assemble linked libraries.
|
| @@ -243,8 +235,8 @@ class BuildMode {
|
| return ErrorSeverity.NONE;
|
| } else {
|
| // Process errors.
|
| - _printErrors(outputPath: options.buildAnalysisOutput);
|
| - return _computeMaxSeverity();
|
| + await _printErrors(outputPath: options.buildAnalysisOutput);
|
| + return await _computeMaxSeverity();
|
| }
|
| }
|
|
|
| @@ -264,19 +256,19 @@ class BuildMode {
|
| libraryUris,
|
| getDependency,
|
| getUnit,
|
| - context.declaredVariables.get,
|
| + analysisDriver.declaredVariables.get,
|
| options.strongMode);
|
| linkResult.forEach(assembler.addLinkedLibrary);
|
| }
|
|
|
| - ErrorSeverity _computeMaxSeverity() {
|
| + Future<ErrorSeverity> _computeMaxSeverity() async {
|
| ErrorSeverity maxSeverity = ErrorSeverity.NONE;
|
| if (!options.buildSuppressExitCode) {
|
| for (Source source in explicitSources) {
|
| - AnalysisErrorInfo errorInfo = context.getErrors(source);
|
| - for (AnalysisError error in errorInfo.errors) {
|
| + ErrorsResult result = await analysisDriver.getErrors(source.fullName);
|
| + for (AnalysisError error in result.errors) {
|
| ErrorSeverity processedSeverity = determineProcessedSeverity(
|
| - error, options, context.analysisOptions);
|
| + error, options, analysisDriver.analysisOptions);
|
| if (processedSeverity != null) {
|
| maxSeverity = maxSeverity.max(processedSeverity);
|
| }
|
| @@ -286,7 +278,7 @@ class BuildMode {
|
| return maxSeverity;
|
| }
|
|
|
| - void _createContext() {
|
| + void _createAnalysisDriver() {
|
| // Read the summaries.
|
| summaryDataStore = new SummaryDataStore(<String>[],
|
| recordDependencyInfo: _shouldOutputSummary);
|
| @@ -342,26 +334,30 @@ class BuildMode {
|
| // Include SDK bundle to avoid parsing SDK sources.
|
| summaryDataStore.addBundle(null, sdkBundle);
|
|
|
| - // Create the context.
|
| - context = AnalysisEngine.instance.createAnalysisContext();
|
| - context.sourceFactory = new SourceFactory(<UriResolver>[
|
| + var sourceFactory = new SourceFactory(<UriResolver>[
|
| new DartUriResolver(sdk),
|
| new InSummaryUriResolver(resourceProvider, summaryDataStore),
|
| new ExplicitSourceResolver(uriToFileMap)
|
| ]);
|
|
|
| - // Set context options.
|
| - Driver.declareVariables(context.declaredVariables, options);
|
| - AnalysisOptionsImpl analysisOptions = Driver
|
| - .createAnalysisOptionsForCommandLineOptions(resourceProvider, options);
|
| - context.analysisOptions = analysisOptions;
|
| -
|
| - if (!options.buildSummaryOnly) {
|
| - // Configure using summaries.
|
| - context.typeProvider = sdk.context.typeProvider;
|
| - context.resultProvider =
|
| - new InputPackagesResultProvider(context, summaryDataStore);
|
| - }
|
| + analysisOptions = Driver.createAnalysisOptionsForCommandLineOptions(
|
| + resourceProvider, options);
|
| +
|
| + PerformanceLog logger = new PerformanceLog(null);
|
| + AnalysisDriverScheduler scheduler = new AnalysisDriverScheduler(logger);
|
| + analysisDriver = new AnalysisDriver(
|
| + scheduler,
|
| + logger,
|
| + resourceProvider,
|
| + new MemoryByteStore(),
|
| + new FileContentOverlay(),
|
| + null,
|
| + sourceFactory,
|
| + analysisOptions,
|
| + externalSummaries: summaryDataStore);
|
| + Driver.declareVariables(analysisDriver.declaredVariables, options);
|
| +
|
| + scheduler.start();
|
| }
|
|
|
| /**
|
| @@ -393,21 +389,21 @@ class BuildMode {
|
| *
|
| * Otherwise compute it and store into the [uriToUnit] and [assembler].
|
| */
|
| - void _prepareUnlinkedUnit(String absoluteUri) {
|
| + Future<Null> _prepareUnlinkedUnit(String absoluteUri) async {
|
| // 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);
|
| + Source source = analysisDriver.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);
|
| + var result = await analysisDriver.parseFile(source.fullName);
|
| + UnlinkedUnitBuilder unlinkedUnit = serializeAstUnlinked(result.unit);
|
| uriToUnit[absoluteUri] = unlinkedUnit;
|
| assembler.addUnlinkedUnit(source, unlinkedUnit);
|
| }
|
| @@ -416,17 +412,18 @@ class BuildMode {
|
| * Print errors for all explicit sources. If [outputPath] is supplied, output
|
| * is sent to a new file at that path.
|
| */
|
| - void _printErrors({String outputPath}) {
|
| + Future<Null> _printErrors({String outputPath}) async {
|
| StringBuffer buffer = new StringBuffer();
|
| var severityProcessor = (AnalysisError error) =>
|
| - determineProcessedSeverity(error, options, context.analysisOptions);
|
| + determineProcessedSeverity(error, options, analysisOptions);
|
| ErrorFormatter formatter = options.machineFormat
|
| ? new MachineErrorFormatter(buffer, options, stats,
|
| severityProcessor: severityProcessor)
|
| : new HumanErrorFormatter(buffer, options, stats,
|
| severityProcessor: severityProcessor);
|
| for (Source source in explicitSources) {
|
| - AnalysisErrorInfo errorInfo = context.getErrors(source);
|
| + var result = await analysisDriver.getErrors(source.fullName);
|
| + var errorInfo = new AnalysisErrorInfoImpl(result.errors, result.lineInfo);
|
| formatter.formatErrors([errorInfo]);
|
| }
|
| formatter.flush();
|
|
|