OLD | NEW |
1 // Copyright (c) 2015, the Dart project authors. Please see the AUTHORS file | 1 // Copyright (c) 2015, the Dart project authors. Please see the AUTHORS file |
2 // for details. All rights reserved. Use of this source code is governed by a | 2 // for details. All rights reserved. Use of this source code is governed by a |
3 // BSD-style license that can be found in the LICENSE file. | 3 // BSD-style license that can be found in the LICENSE file. |
4 | 4 |
5 library analyzer_cli.src.build_mode; | 5 library analyzer_cli.src.build_mode; |
6 | 6 |
7 import 'dart:async'; | 7 import 'dart:async'; |
8 import 'dart:io' as io; | 8 import 'dart:io' as io; |
9 | 9 |
10 import 'package:analyzer/dart/ast/ast.dart' show CompilationUnit; | |
11 import 'package:analyzer/error/error.dart'; | 10 import 'package:analyzer/error/error.dart'; |
12 import 'package:analyzer/file_system/file_system.dart'; | 11 import 'package:analyzer/file_system/file_system.dart'; |
| 12 import 'package:analyzer/src/dart/analysis/driver.dart'; |
| 13 import 'package:analyzer/src/dart/analysis/file_state.dart'; |
13 import 'package:analyzer/src/dart/sdk/sdk.dart'; | 14 import 'package:analyzer/src/dart/sdk/sdk.dart'; |
14 import 'package:analyzer/src/generated/engine.dart'; | 15 import 'package:analyzer/src/generated/engine.dart'; |
15 import 'package:analyzer/src/generated/sdk.dart'; | 16 import 'package:analyzer/src/generated/sdk.dart'; |
16 import 'package:analyzer/src/generated/source.dart'; | 17 import 'package:analyzer/src/generated/source.dart'; |
17 import 'package:analyzer/src/generated/source_io.dart'; | 18 import 'package:analyzer/src/generated/source_io.dart'; |
18 import 'package:analyzer/src/source/source_resource.dart'; | 19 import 'package:analyzer/src/source/source_resource.dart'; |
19 import 'package:analyzer/src/summary/format.dart'; | 20 import 'package:analyzer/src/summary/format.dart'; |
20 import 'package:analyzer/src/summary/idl.dart'; | 21 import 'package:analyzer/src/summary/idl.dart'; |
21 import 'package:analyzer/src/summary/link.dart'; | 22 import 'package:analyzer/src/summary/link.dart'; |
22 import 'package:analyzer/src/summary/package_bundle_reader.dart'; | 23 import 'package:analyzer/src/summary/package_bundle_reader.dart'; |
23 import 'package:analyzer/src/summary/summarize_ast.dart'; | 24 import 'package:analyzer/src/summary/summarize_ast.dart'; |
24 import 'package:analyzer/src/summary/summarize_elements.dart'; | 25 import 'package:analyzer/src/summary/summarize_elements.dart'; |
25 import 'package:analyzer/src/summary/summary_sdk.dart' show SummaryBasedDartSdk; | 26 import 'package:analyzer/src/summary/summary_sdk.dart' show SummaryBasedDartSdk; |
26 import 'package:analyzer/task/dart.dart'; | |
27 import 'package:analyzer_cli/src/driver.dart'; | 27 import 'package:analyzer_cli/src/driver.dart'; |
28 import 'package:analyzer_cli/src/error_formatter.dart'; | 28 import 'package:analyzer_cli/src/error_formatter.dart'; |
29 import 'package:analyzer_cli/src/error_severity.dart'; | 29 import 'package:analyzer_cli/src/error_severity.dart'; |
30 import 'package:analyzer_cli/src/options.dart'; | 30 import 'package:analyzer_cli/src/options.dart'; |
31 import 'package:bazel_worker/bazel_worker.dart'; | 31 import 'package:bazel_worker/bazel_worker.dart'; |
| 32 import 'package:front_end/src/base/performace_logger.dart'; |
| 33 import 'package:front_end/src/byte_store/byte_store.dart'; |
32 | 34 |
33 /** | 35 /** |
34 * Persistent Bazel worker. | 36 * Persistent Bazel worker. |
35 */ | 37 */ |
36 class AnalyzerWorkerLoop extends AsyncWorkerLoop { | 38 class AnalyzerWorkerLoop extends AsyncWorkerLoop { |
37 final StringBuffer errorBuffer = new StringBuffer(); | 39 final StringBuffer errorBuffer = new StringBuffer(); |
38 final StringBuffer outBuffer = new StringBuffer(); | 40 final StringBuffer outBuffer = new StringBuffer(); |
39 | 41 |
40 final ResourceProvider resourceProvider; | 42 final ResourceProvider resourceProvider; |
41 final String dartSdkPath; | 43 final String dartSdkPath; |
42 | 44 |
43 AnalyzerWorkerLoop(this.resourceProvider, AsyncWorkerConnection connection, | 45 AnalyzerWorkerLoop(this.resourceProvider, AsyncWorkerConnection connection, |
44 {this.dartSdkPath}) | 46 {this.dartSdkPath}) |
45 : super(connection: connection); | 47 : super(connection: connection); |
46 | 48 |
47 factory AnalyzerWorkerLoop.std(ResourceProvider resourceProvider, | 49 factory AnalyzerWorkerLoop.std(ResourceProvider resourceProvider, |
48 {io.Stdin stdinStream, io.Stdout stdoutStream, String dartSdkPath}) { | 50 {io.Stdin stdinStream, io.Stdout stdoutStream, String dartSdkPath}) { |
49 AsyncWorkerConnection connection = new StdAsyncWorkerConnection( | 51 AsyncWorkerConnection connection = new StdAsyncWorkerConnection( |
50 inputStream: stdinStream, outputStream: stdoutStream); | 52 inputStream: stdinStream, outputStream: stdoutStream); |
51 return new AnalyzerWorkerLoop(resourceProvider, connection, | 53 return new AnalyzerWorkerLoop(resourceProvider, connection, |
52 dartSdkPath: dartSdkPath); | 54 dartSdkPath: dartSdkPath); |
53 } | 55 } |
54 | 56 |
55 /** | 57 /** |
56 * Performs analysis with given [options]. | 58 * Performs analysis with given [options]. |
57 */ | 59 */ |
58 void analyze(CommandLineOptions options) { | 60 Future<Null> analyze(CommandLineOptions options) async { |
59 new BuildMode(resourceProvider, options, new AnalysisStats()).analyze(); | 61 var buildMode = |
| 62 new BuildMode(resourceProvider, options, new AnalysisStats()); |
| 63 await buildMode.analyze(); |
60 AnalysisEngine.instance.clearCaches(); | 64 AnalysisEngine.instance.clearCaches(); |
61 } | 65 } |
62 | 66 |
63 /** | 67 /** |
64 * Perform a single loop step. | 68 * Perform a single loop step. |
65 */ | 69 */ |
66 @override | 70 @override |
67 Future<WorkResponse> performRequest(WorkRequest request) async { | 71 Future<WorkResponse> performRequest(WorkRequest request) async { |
68 errorBuffer.clear(); | 72 errorBuffer.clear(); |
69 outBuffer.clear(); | 73 outBuffer.clear(); |
70 try { | 74 try { |
71 // Add in the dart-sdk argument if `dartSdkPath` is not null, otherwise it | 75 // Add in the dart-sdk argument if `dartSdkPath` is not null, otherwise it |
72 // will try to find the currently installed sdk. | 76 // will try to find the currently installed sdk. |
73 var arguments = new List<String>.from(request.arguments); | 77 var arguments = new List<String>.from(request.arguments); |
74 if (dartSdkPath != null && | 78 if (dartSdkPath != null && |
75 !arguments.any((arg) => arg.startsWith('--dart-sdk'))) { | 79 !arguments.any((arg) => arg.startsWith('--dart-sdk'))) { |
76 arguments.add('--dart-sdk=$dartSdkPath'); | 80 arguments.add('--dart-sdk=$dartSdkPath'); |
77 } | 81 } |
78 // Prepare options. | 82 // Prepare options. |
79 CommandLineOptions options = | 83 CommandLineOptions options = |
80 CommandLineOptions.parse(arguments, printAndFail: (String msg) { | 84 CommandLineOptions.parse(arguments, printAndFail: (String msg) { |
81 throw new ArgumentError(msg); | 85 throw new ArgumentError(msg); |
82 }); | 86 }); |
83 // Analyze and respond. | 87 // Analyze and respond. |
84 analyze(options); | 88 await analyze(options); |
85 String msg = _getErrorOutputBuffersText(); | 89 String msg = _getErrorOutputBuffersText(); |
86 return new WorkResponse() | 90 return new WorkResponse() |
87 ..exitCode = EXIT_CODE_OK | 91 ..exitCode = EXIT_CODE_OK |
88 ..output = msg; | 92 ..output = msg; |
89 } catch (e, st) { | 93 } catch (e, st) { |
90 String msg = _getErrorOutputBuffersText(); | 94 String msg = _getErrorOutputBuffersText(); |
91 msg += '$e\n$st'; | 95 msg += '$e\n$st'; |
92 return new WorkResponse() | 96 return new WorkResponse() |
93 ..exitCode = EXIT_CODE_ERROR | 97 ..exitCode = EXIT_CODE_ERROR |
94 ..output = msg; | 98 ..output = msg; |
(...skipping 27 matching lines...) Expand all Loading... |
122 | 126 |
123 /** | 127 /** |
124 * Analyzer used when the "--build-mode" option is supplied. | 128 * Analyzer used when the "--build-mode" option is supplied. |
125 */ | 129 */ |
126 class BuildMode { | 130 class BuildMode { |
127 final ResourceProvider resourceProvider; | 131 final ResourceProvider resourceProvider; |
128 final CommandLineOptions options; | 132 final CommandLineOptions options; |
129 final AnalysisStats stats; | 133 final AnalysisStats stats; |
130 | 134 |
131 SummaryDataStore summaryDataStore; | 135 SummaryDataStore summaryDataStore; |
132 InternalAnalysisContext context; | 136 AnalysisOptions analysisOptions; |
| 137 AnalysisDriver analysisDriver; |
133 Map<Uri, File> uriToFileMap; | 138 Map<Uri, File> uriToFileMap; |
134 final List<Source> explicitSources = <Source>[]; | 139 final List<Source> explicitSources = <Source>[]; |
135 final List<PackageBundle> unlinkedBundles = <PackageBundle>[]; | 140 final List<PackageBundle> unlinkedBundles = <PackageBundle>[]; |
136 | 141 |
137 PackageBundleAssembler assembler; | 142 PackageBundleAssembler assembler; |
138 final Set<Source> processedSources = new Set<Source>(); | 143 final Set<Source> processedSources = new Set<Source>(); |
139 final Map<String, UnlinkedUnit> uriToUnit = <String, UnlinkedUnit>{}; | 144 final Map<String, UnlinkedUnit> uriToUnit = <String, UnlinkedUnit>{}; |
140 | 145 |
141 BuildMode(this.resourceProvider, this.options, this.stats); | 146 BuildMode(this.resourceProvider, this.options, this.stats); |
142 | 147 |
143 bool get _shouldOutputSummary => | 148 bool get _shouldOutputSummary => |
144 options.buildSummaryOutput != null || | 149 options.buildSummaryOutput != null || |
145 options.buildSummaryOutputSemantic != null; | 150 options.buildSummaryOutputSemantic != null; |
146 | 151 |
147 /** | 152 /** |
148 * Perform package analysis according to the given [options]. | 153 * Perform package analysis according to the given [options]. |
149 */ | 154 */ |
150 ErrorSeverity analyze() { | 155 Future<ErrorSeverity> analyze() async { |
151 // Write initial progress message. | 156 // Write initial progress message. |
152 if (!options.machineFormat) { | 157 if (!options.machineFormat) { |
153 outSink.writeln("Analyzing ${options.sourceFiles.join(', ')}..."); | 158 outSink.writeln("Analyzing ${options.sourceFiles.join(', ')}..."); |
154 } | 159 } |
155 | 160 |
156 // Create the URI to file map. | 161 // Create the URI to file map. |
157 uriToFileMap = _createUriToFileMap(options.sourceFiles); | 162 uriToFileMap = _createUriToFileMap(options.sourceFiles); |
158 if (uriToFileMap == null) { | 163 if (uriToFileMap == null) { |
159 io.exitCode = ErrorSeverity.ERROR.ordinal; | 164 io.exitCode = ErrorSeverity.ERROR.ordinal; |
160 return ErrorSeverity.ERROR; | 165 return ErrorSeverity.ERROR; |
161 } | 166 } |
162 | 167 |
163 // BuildMode expects sourceFiles in the format "<uri>|<filepath>", | 168 // BuildMode expects sourceFiles in the format "<uri>|<filepath>", |
164 // but the rest of the code base does not understand this format. | 169 // but the rest of the code base does not understand this format. |
165 // Rewrite sourceFiles, stripping the "<uri>|" prefix, so that it | 170 // Rewrite sourceFiles, stripping the "<uri>|" prefix, so that it |
166 // does not cause problems with code that does not expect this format. | 171 // does not cause problems with code that does not expect this format. |
167 options.rewriteSourceFiles(options.sourceFiles | 172 options.rewriteSourceFiles(options.sourceFiles |
168 .map((String uriPipePath) => | 173 .map((String uriPipePath) => |
169 uriPipePath.substring(uriPipePath.indexOf('|') + 1)) | 174 uriPipePath.substring(uriPipePath.indexOf('|') + 1)) |
170 .toList()); | 175 .toList()); |
171 | 176 |
172 // Prepare the analysis context. | 177 // Prepare the analysis driver. |
173 try { | 178 try { |
174 _createContext(); | 179 _createAnalysisDriver(); |
175 } on ConflictingSummaryException catch (e) { | 180 } on ConflictingSummaryException catch (e) { |
176 errorSink.writeln('$e'); | 181 errorSink.writeln('$e'); |
177 io.exitCode = ErrorSeverity.ERROR.ordinal; | 182 io.exitCode = ErrorSeverity.ERROR.ordinal; |
178 return ErrorSeverity.ERROR; | 183 return ErrorSeverity.ERROR; |
179 } | 184 } |
180 | 185 |
181 // Add sources. | 186 // Add sources. |
182 ChangeSet changeSet = new ChangeSet(); | |
183 for (Uri uri in uriToFileMap.keys) { | 187 for (Uri uri in uriToFileMap.keys) { |
184 File file = uriToFileMap[uri]; | 188 File file = uriToFileMap[uri]; |
185 if (!file.exists) { | 189 if (!file.exists) { |
186 errorSink.writeln('File not found: ${file.path}'); | 190 errorSink.writeln('File not found: ${file.path}'); |
187 io.exitCode = ErrorSeverity.ERROR.ordinal; | 191 io.exitCode = ErrorSeverity.ERROR.ordinal; |
188 return ErrorSeverity.ERROR; | 192 return ErrorSeverity.ERROR; |
189 } | 193 } |
190 Source source = new FileSource(file, uri); | 194 Source source = new FileSource(file, uri); |
191 explicitSources.add(source); | 195 explicitSources.add(source); |
192 changeSet.addedSource(source); | |
193 } | |
194 context.applyChanges(changeSet); | |
195 | |
196 if (!options.buildSummaryOnly) { | |
197 // Perform full analysis. | |
198 while (true) { | |
199 AnalysisResult analysisResult = context.performAnalysisTask(); | |
200 if (!analysisResult.hasMoreWork) { | |
201 break; | |
202 } | |
203 } | |
204 } | 196 } |
205 | 197 |
206 // Write summary. | 198 // Write summary. |
207 assembler = new PackageBundleAssembler(); | 199 assembler = new PackageBundleAssembler(); |
208 if (_shouldOutputSummary) { | 200 if (_shouldOutputSummary) { |
209 // Prepare all unlinked units. | 201 // Prepare all unlinked units. |
210 for (var src in explicitSources) { | 202 for (var src in explicitSources) { |
211 _prepareUnlinkedUnit('${src.uri}'); | 203 await _prepareUnlinkedUnit('${src.uri}'); |
212 } | 204 } |
213 | 205 |
214 // Build and assemble linked libraries. | 206 // Build and assemble linked libraries. |
215 if (!options.buildSummaryOnlyUnlinked) { | 207 if (!options.buildSummaryOnlyUnlinked) { |
216 // Prepare URIs of unlinked units that should be linked. | 208 // Prepare URIs of unlinked units that should be linked. |
217 var unlinkedUris = new Set<String>(); | 209 var unlinkedUris = new Set<String>(); |
218 for (var bundle in unlinkedBundles) { | 210 for (var bundle in unlinkedBundles) { |
219 unlinkedUris.addAll(bundle.unlinkedUnitUris); | 211 unlinkedUris.addAll(bundle.unlinkedUnitUris); |
220 } | 212 } |
221 for (var src in explicitSources) { | 213 for (var src in explicitSources) { |
(...skipping 14 matching lines...) Expand all Loading... |
236 bundle.flushInformative(); | 228 bundle.flushInformative(); |
237 io.File file = new io.File(options.buildSummaryOutputSemantic); | 229 io.File file = new io.File(options.buildSummaryOutputSemantic); |
238 file.writeAsBytesSync(bundle.toBuffer(), mode: io.FileMode.WRITE_ONLY); | 230 file.writeAsBytesSync(bundle.toBuffer(), mode: io.FileMode.WRITE_ONLY); |
239 } | 231 } |
240 } | 232 } |
241 | 233 |
242 if (options.buildSummaryOnly) { | 234 if (options.buildSummaryOnly) { |
243 return ErrorSeverity.NONE; | 235 return ErrorSeverity.NONE; |
244 } else { | 236 } else { |
245 // Process errors. | 237 // Process errors. |
246 _printErrors(outputPath: options.buildAnalysisOutput); | 238 await _printErrors(outputPath: options.buildAnalysisOutput); |
247 return _computeMaxSeverity(); | 239 return await _computeMaxSeverity(); |
248 } | 240 } |
249 } | 241 } |
250 | 242 |
251 /** | 243 /** |
252 * Compute linked libraries for the given [libraryUris] using the linked | 244 * Compute linked libraries for the given [libraryUris] using the linked |
253 * libraries of the [summaryDataStore] and unlinked units in [uriToUnit], and | 245 * libraries of the [summaryDataStore] and unlinked units in [uriToUnit], and |
254 * add them to the [assembler]. | 246 * add them to the [assembler]. |
255 */ | 247 */ |
256 void _computeLinkedLibraries(Set<String> libraryUris) { | 248 void _computeLinkedLibraries(Set<String> libraryUris) { |
257 LinkedLibrary getDependency(String absoluteUri) => | 249 LinkedLibrary getDependency(String absoluteUri) => |
258 summaryDataStore.linkedMap[absoluteUri]; | 250 summaryDataStore.linkedMap[absoluteUri]; |
259 | 251 |
260 UnlinkedUnit getUnit(String absoluteUri) => | 252 UnlinkedUnit getUnit(String absoluteUri) => |
261 summaryDataStore.unlinkedMap[absoluteUri] ?? uriToUnit[absoluteUri]; | 253 summaryDataStore.unlinkedMap[absoluteUri] ?? uriToUnit[absoluteUri]; |
262 | 254 |
263 Map<String, LinkedLibraryBuilder> linkResult = link( | 255 Map<String, LinkedLibraryBuilder> linkResult = link( |
264 libraryUris, | 256 libraryUris, |
265 getDependency, | 257 getDependency, |
266 getUnit, | 258 getUnit, |
267 context.declaredVariables.get, | 259 analysisDriver.declaredVariables.get, |
268 options.strongMode); | 260 options.strongMode); |
269 linkResult.forEach(assembler.addLinkedLibrary); | 261 linkResult.forEach(assembler.addLinkedLibrary); |
270 } | 262 } |
271 | 263 |
272 ErrorSeverity _computeMaxSeverity() { | 264 Future<ErrorSeverity> _computeMaxSeverity() async { |
273 ErrorSeverity maxSeverity = ErrorSeverity.NONE; | 265 ErrorSeverity maxSeverity = ErrorSeverity.NONE; |
274 if (!options.buildSuppressExitCode) { | 266 if (!options.buildSuppressExitCode) { |
275 for (Source source in explicitSources) { | 267 for (Source source in explicitSources) { |
276 AnalysisErrorInfo errorInfo = context.getErrors(source); | 268 ErrorsResult result = await analysisDriver.getErrors(source.fullName); |
277 for (AnalysisError error in errorInfo.errors) { | 269 for (AnalysisError error in result.errors) { |
278 ErrorSeverity processedSeverity = determineProcessedSeverity( | 270 ErrorSeverity processedSeverity = determineProcessedSeverity( |
279 error, options, context.analysisOptions); | 271 error, options, analysisDriver.analysisOptions); |
280 if (processedSeverity != null) { | 272 if (processedSeverity != null) { |
281 maxSeverity = maxSeverity.max(processedSeverity); | 273 maxSeverity = maxSeverity.max(processedSeverity); |
282 } | 274 } |
283 } | 275 } |
284 } | 276 } |
285 } | 277 } |
286 return maxSeverity; | 278 return maxSeverity; |
287 } | 279 } |
288 | 280 |
289 void _createContext() { | 281 void _createAnalysisDriver() { |
290 // Read the summaries. | 282 // Read the summaries. |
291 summaryDataStore = new SummaryDataStore(<String>[], | 283 summaryDataStore = new SummaryDataStore(<String>[], |
292 recordDependencyInfo: _shouldOutputSummary); | 284 recordDependencyInfo: _shouldOutputSummary); |
293 | 285 |
294 // Adds a bundle at `path` to `summaryDataStore`. | 286 // Adds a bundle at `path` to `summaryDataStore`. |
295 PackageBundle addBundle(String path) { | 287 PackageBundle addBundle(String path) { |
296 var bundle = | 288 var bundle = |
297 new PackageBundle.fromBuffer(new io.File(path).readAsBytesSync()); | 289 new PackageBundle.fromBuffer(new io.File(path).readAsBytesSync()); |
298 summaryDataStore.addBundle(path, bundle); | 290 summaryDataStore.addBundle(path, bundle); |
299 return bundle; | 291 return bundle; |
(...skipping 35 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
335 Driver.createAnalysisOptionsForCommandLineOptions( | 327 Driver.createAnalysisOptionsForCommandLineOptions( |
336 resourceProvider, options); | 328 resourceProvider, options); |
337 dartSdk.useSummary = !options.buildSummaryOnly; | 329 dartSdk.useSummary = !options.buildSummaryOnly; |
338 sdk = dartSdk; | 330 sdk = dartSdk; |
339 sdkBundle = dartSdk.getSummarySdkBundle(options.strongMode); | 331 sdkBundle = dartSdk.getSummarySdkBundle(options.strongMode); |
340 } | 332 } |
341 | 333 |
342 // Include SDK bundle to avoid parsing SDK sources. | 334 // Include SDK bundle to avoid parsing SDK sources. |
343 summaryDataStore.addBundle(null, sdkBundle); | 335 summaryDataStore.addBundle(null, sdkBundle); |
344 | 336 |
345 // Create the context. | 337 var sourceFactory = new SourceFactory(<UriResolver>[ |
346 context = AnalysisEngine.instance.createAnalysisContext(); | |
347 context.sourceFactory = new SourceFactory(<UriResolver>[ | |
348 new DartUriResolver(sdk), | 338 new DartUriResolver(sdk), |
349 new InSummaryUriResolver(resourceProvider, summaryDataStore), | 339 new InSummaryUriResolver(resourceProvider, summaryDataStore), |
350 new ExplicitSourceResolver(uriToFileMap) | 340 new ExplicitSourceResolver(uriToFileMap) |
351 ]); | 341 ]); |
352 | 342 |
353 // Set context options. | 343 analysisOptions = Driver.createAnalysisOptionsForCommandLineOptions( |
354 Driver.declareVariables(context.declaredVariables, options); | 344 resourceProvider, options); |
355 AnalysisOptionsImpl analysisOptions = Driver | |
356 .createAnalysisOptionsForCommandLineOptions(resourceProvider, options); | |
357 context.analysisOptions = analysisOptions; | |
358 | 345 |
359 if (!options.buildSummaryOnly) { | 346 PerformanceLog logger = new PerformanceLog(null); |
360 // Configure using summaries. | 347 AnalysisDriverScheduler scheduler = new AnalysisDriverScheduler(logger); |
361 context.typeProvider = sdk.context.typeProvider; | 348 analysisDriver = new AnalysisDriver( |
362 context.resultProvider = | 349 scheduler, |
363 new InputPackagesResultProvider(context, summaryDataStore); | 350 logger, |
364 } | 351 resourceProvider, |
| 352 new MemoryByteStore(), |
| 353 new FileContentOverlay(), |
| 354 null, |
| 355 sourceFactory, |
| 356 analysisOptions, |
| 357 externalSummaries: summaryDataStore); |
| 358 Driver.declareVariables(analysisDriver.declaredVariables, options); |
| 359 |
| 360 scheduler.start(); |
365 } | 361 } |
366 | 362 |
367 /** | 363 /** |
368 * Convert [sourceEntities] (a list of file specifications of the form | 364 * Convert [sourceEntities] (a list of file specifications of the form |
369 * "$uri|$path") to a map from URI to path. If an error occurs, report the | 365 * "$uri|$path") to a map from URI to path. If an error occurs, report the |
370 * error and return null. | 366 * error and return null. |
371 */ | 367 */ |
372 Map<Uri, File> _createUriToFileMap(List<String> sourceEntities) { | 368 Map<Uri, File> _createUriToFileMap(List<String> sourceEntities) { |
373 Map<Uri, File> uriToFileMap = <Uri, File>{}; | 369 Map<Uri, File> uriToFileMap = <Uri, File>{}; |
374 for (String sourceFile in sourceEntities) { | 370 for (String sourceFile in sourceEntities) { |
(...skipping 11 matching lines...) Expand all Loading... |
386 return uriToFileMap; | 382 return uriToFileMap; |
387 } | 383 } |
388 | 384 |
389 /** | 385 /** |
390 * Ensure that the [UnlinkedUnit] for [absoluteUri] is available. | 386 * Ensure that the [UnlinkedUnit] for [absoluteUri] is available. |
391 * | 387 * |
392 * If the unit is in the input [summaryDataStore], do nothing. | 388 * If the unit is in the input [summaryDataStore], do nothing. |
393 * | 389 * |
394 * Otherwise compute it and store into the [uriToUnit] and [assembler]. | 390 * Otherwise compute it and store into the [uriToUnit] and [assembler]. |
395 */ | 391 */ |
396 void _prepareUnlinkedUnit(String absoluteUri) { | 392 Future<Null> _prepareUnlinkedUnit(String absoluteUri) async { |
397 // Maybe an input package contains the source. | 393 // Maybe an input package contains the source. |
398 if (summaryDataStore.unlinkedMap[absoluteUri] != null) { | 394 if (summaryDataStore.unlinkedMap[absoluteUri] != null) { |
399 return; | 395 return; |
400 } | 396 } |
401 // Parse the source and serialize its AST. | 397 // Parse the source and serialize its AST. |
402 Uri uri = Uri.parse(absoluteUri); | 398 Uri uri = Uri.parse(absoluteUri); |
403 Source source = context.sourceFactory.forUri2(uri); | 399 Source source = analysisDriver.sourceFactory.forUri2(uri); |
404 if (!source.exists()) { | 400 if (!source.exists()) { |
405 // TODO(paulberry): we should report a warning/error because DDC | 401 // TODO(paulberry): we should report a warning/error because DDC |
406 // compilations are unlikely to work. | 402 // compilations are unlikely to work. |
407 return; | 403 return; |
408 } | 404 } |
409 CompilationUnit unit = context.computeResult(source, PARSED_UNIT); | 405 var result = await analysisDriver.parseFile(source.fullName); |
410 UnlinkedUnitBuilder unlinkedUnit = serializeAstUnlinked(unit); | 406 UnlinkedUnitBuilder unlinkedUnit = serializeAstUnlinked(result.unit); |
411 uriToUnit[absoluteUri] = unlinkedUnit; | 407 uriToUnit[absoluteUri] = unlinkedUnit; |
412 assembler.addUnlinkedUnit(source, unlinkedUnit); | 408 assembler.addUnlinkedUnit(source, unlinkedUnit); |
413 } | 409 } |
414 | 410 |
415 /** | 411 /** |
416 * Print errors for all explicit sources. If [outputPath] is supplied, output | 412 * Print errors for all explicit sources. If [outputPath] is supplied, output |
417 * is sent to a new file at that path. | 413 * is sent to a new file at that path. |
418 */ | 414 */ |
419 void _printErrors({String outputPath}) { | 415 Future<Null> _printErrors({String outputPath}) async { |
420 StringBuffer buffer = new StringBuffer(); | 416 StringBuffer buffer = new StringBuffer(); |
421 var severityProcessor = (AnalysisError error) => | 417 var severityProcessor = (AnalysisError error) => |
422 determineProcessedSeverity(error, options, context.analysisOptions); | 418 determineProcessedSeverity(error, options, analysisOptions); |
423 ErrorFormatter formatter = options.machineFormat | 419 ErrorFormatter formatter = options.machineFormat |
424 ? new MachineErrorFormatter(buffer, options, stats, | 420 ? new MachineErrorFormatter(buffer, options, stats, |
425 severityProcessor: severityProcessor) | 421 severityProcessor: severityProcessor) |
426 : new HumanErrorFormatter(buffer, options, stats, | 422 : new HumanErrorFormatter(buffer, options, stats, |
427 severityProcessor: severityProcessor); | 423 severityProcessor: severityProcessor); |
428 for (Source source in explicitSources) { | 424 for (Source source in explicitSources) { |
429 AnalysisErrorInfo errorInfo = context.getErrors(source); | 425 var result = await analysisDriver.getErrors(source.fullName); |
| 426 var errorInfo = new AnalysisErrorInfoImpl(result.errors, result.lineInfo); |
430 formatter.formatErrors([errorInfo]); | 427 formatter.formatErrors([errorInfo]); |
431 } | 428 } |
432 formatter.flush(); | 429 formatter.flush(); |
433 if (!options.machineFormat) { | 430 if (!options.machineFormat) { |
434 stats.print(buffer); | 431 stats.print(buffer); |
435 } | 432 } |
436 if (outputPath == null) { | 433 if (outputPath == null) { |
437 StringSink sink = options.machineFormat ? errorSink : outSink; | 434 StringSink sink = options.machineFormat ? errorSink : outSink; |
438 sink.write(buffer); | 435 sink.write(buffer); |
439 } else { | 436 } else { |
(...skipping 38 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
478 * Build the inverse mapping of [uriToSourceMap]. | 475 * Build the inverse mapping of [uriToSourceMap]. |
479 */ | 476 */ |
480 static Map<String, Uri> _computePathToUriMap(Map<Uri, File> uriToSourceMap) { | 477 static Map<String, Uri> _computePathToUriMap(Map<Uri, File> uriToSourceMap) { |
481 Map<String, Uri> pathToUriMap = <String, Uri>{}; | 478 Map<String, Uri> pathToUriMap = <String, Uri>{}; |
482 uriToSourceMap.forEach((Uri uri, File file) { | 479 uriToSourceMap.forEach((Uri uri, File file) { |
483 pathToUriMap[file.path] = uri; | 480 pathToUriMap[file.path] = uri; |
484 }); | 481 }); |
485 return pathToUriMap; | 482 return pathToUriMap; |
486 } | 483 } |
487 } | 484 } |
OLD | NEW |