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.driver; | 5 library analyzer_cli.src.driver; |
6 | 6 |
7 import 'dart:async'; | 7 import 'dart:async'; |
8 import 'dart:convert'; | 8 import 'dart:convert'; |
9 import 'dart:io' as io; | 9 import 'dart:io' as io; |
10 | 10 |
11 import 'package:analyzer/error/error.dart'; | 11 import 'package:analyzer/error/error.dart'; |
12 import 'package:analyzer/file_system/file_system.dart' as file_system; | 12 import 'package:analyzer/file_system/file_system.dart' as file_system; |
13 import 'package:analyzer/file_system/file_system.dart'; | 13 import 'package:analyzer/file_system/file_system.dart'; |
14 import 'package:analyzer/file_system/physical_file_system.dart'; | 14 import 'package:analyzer/file_system/physical_file_system.dart'; |
15 import 'package:analyzer/plugin/resolver_provider.dart'; | 15 import 'package:analyzer/plugin/resolver_provider.dart'; |
16 import 'package:analyzer/source/analysis_options_provider.dart'; | 16 import 'package:analyzer/source/analysis_options_provider.dart'; |
17 import 'package:analyzer/source/package_map_provider.dart'; | 17 import 'package:analyzer/source/package_map_provider.dart'; |
18 import 'package:analyzer/source/package_map_resolver.dart'; | 18 import 'package:analyzer/source/package_map_resolver.dart'; |
19 import 'package:analyzer/source/pub_package_map_provider.dart'; | 19 import 'package:analyzer/source/pub_package_map_provider.dart'; |
20 import 'package:analyzer/source/sdk_ext.dart'; | 20 import 'package:analyzer/source/sdk_ext.dart'; |
21 import 'package:analyzer/src/context/builder.dart'; | 21 import 'package:analyzer/src/context/builder.dart'; |
| 22 import 'package:analyzer/src/dart/analysis/byte_store.dart'; |
| 23 import 'package:analyzer/src/dart/analysis/driver.dart'; |
| 24 import 'package:analyzer/src/dart/analysis/file_state.dart'; |
22 import 'package:analyzer/src/dart/sdk/sdk.dart'; | 25 import 'package:analyzer/src/dart/sdk/sdk.dart'; |
23 import 'package:analyzer/src/generated/constant.dart'; | 26 import 'package:analyzer/src/generated/constant.dart'; |
24 import 'package:analyzer/src/generated/engine.dart'; | 27 import 'package:analyzer/src/generated/engine.dart'; |
25 import 'package:analyzer/src/generated/interner.dart'; | 28 import 'package:analyzer/src/generated/interner.dart'; |
26 import 'package:analyzer/src/generated/java_engine.dart'; | 29 import 'package:analyzer/src/generated/java_engine.dart'; |
27 import 'package:analyzer/src/generated/sdk.dart'; | 30 import 'package:analyzer/src/generated/sdk.dart'; |
28 import 'package:analyzer/src/generated/source.dart'; | 31 import 'package:analyzer/src/generated/source.dart'; |
29 import 'package:analyzer/src/generated/source_io.dart'; | 32 import 'package:analyzer/src/generated/source_io.dart'; |
30 import 'package:analyzer/src/generated/utilities_general.dart' | 33 import 'package:analyzer/src/generated/utilities_general.dart' |
31 show PerformanceTag; | 34 show PerformanceTag; |
(...skipping 35 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
67 var linterNode = options['linter']; | 70 var linterNode = options['linter']; |
68 return linterNode is YamlMap && linterNode.containsKey('rules'); | 71 return linterNode is YamlMap && linterNode.containsKey('rules'); |
69 } | 72 } |
70 | 73 |
71 typedef Future<ErrorSeverity> _BatchRunnerHandler(List<String> args); | 74 typedef Future<ErrorSeverity> _BatchRunnerHandler(List<String> args); |
72 | 75 |
73 class Driver implements CommandLineStarter { | 76 class Driver implements CommandLineStarter { |
74 static final PerformanceTag _analyzeAllTag = | 77 static final PerformanceTag _analyzeAllTag = |
75 new PerformanceTag("Driver._analyzeAll"); | 78 new PerformanceTag("Driver._analyzeAll"); |
76 | 79 |
| 80 static ByteStore analysisDriverByteStore = new MemoryByteStore(); |
| 81 |
77 /// The plugins that are defined outside the `analyzer_cli` package. | 82 /// The plugins that are defined outside the `analyzer_cli` package. |
78 List<Plugin> _userDefinedPlugins = <Plugin>[]; | 83 List<Plugin> _userDefinedPlugins = <Plugin>[]; |
79 | 84 |
80 /// The context that was most recently created by a call to [_analyzeAll], or | 85 /// The context that was most recently created by a call to [_analyzeAll], or |
81 /// `null` if [_analyzeAll] hasn't been called yet. | 86 /// `null` if [_analyzeAll] hasn't been called yet. |
82 InternalAnalysisContext _context; | 87 InternalAnalysisContext _context; |
83 | 88 |
| 89 AnalysisDriver analysisDriver; |
| 90 |
84 /// The total number of source files loaded by an AnalysisContext. | 91 /// The total number of source files loaded by an AnalysisContext. |
85 int _analyzedFileCount = 0; | 92 int _analyzedFileCount = 0; |
86 | 93 |
87 /// If [_context] is not `null`, the [CommandLineOptions] that guided its | 94 /// If [_context] is not `null`, the [CommandLineOptions] that guided its |
88 /// creation. | 95 /// creation. |
89 CommandLineOptions _previousOptions; | 96 CommandLineOptions _previousOptions; |
90 | 97 |
91 @override | 98 @override |
92 ResolverProvider packageResolverProvider; | 99 ResolverProvider packageResolverProvider; |
93 | 100 |
(...skipping 34 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
128 CommandLineOptions options = CommandLineOptions.parse(args); | 135 CommandLineOptions options = CommandLineOptions.parse(args); |
129 | 136 |
130 // Do analysis. | 137 // Do analysis. |
131 if (options.buildMode) { | 138 if (options.buildMode) { |
132 ErrorSeverity severity = _buildModeAnalyze(options); | 139 ErrorSeverity severity = _buildModeAnalyze(options); |
133 // In case of error propagate exit code. | 140 // In case of error propagate exit code. |
134 if (severity == ErrorSeverity.ERROR) { | 141 if (severity == ErrorSeverity.ERROR) { |
135 io.exitCode = severity.ordinal; | 142 io.exitCode = severity.ordinal; |
136 } | 143 } |
137 } else if (options.shouldBatch) { | 144 } else if (options.shouldBatch) { |
138 _BatchRunner.runAsBatch(args, (List<String> args) { | 145 _BatchRunner.runAsBatch(args, (List<String> args) async { |
139 CommandLineOptions options = CommandLineOptions.parse(args); | 146 CommandLineOptions options = CommandLineOptions.parse(args); |
140 return _analyzeAll(options); | 147 return await _analyzeAll(options); |
141 }); | 148 }); |
142 } else { | 149 } else { |
143 ErrorSeverity severity = await _analyzeAll(options); | 150 ErrorSeverity severity = await _analyzeAll(options); |
144 // In case of error propagate exit code. | 151 // In case of error propagate exit code. |
145 if (severity == ErrorSeverity.ERROR) { | 152 if (severity == ErrorSeverity.ERROR) { |
146 io.exitCode = severity.ordinal; | 153 io.exitCode = severity.ordinal; |
147 } | 154 } |
148 } | 155 } |
149 | 156 |
150 if (_context != null) { | 157 if (_context != null) { |
(...skipping 50 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
201 return ErrorSeverity.ERROR; | 208 return ErrorSeverity.ERROR; |
202 } | 209 } |
203 | 210 |
204 for (io.File file in files) { | 211 for (io.File file in files) { |
205 Source source = _computeLibrarySource(file.absolute.path); | 212 Source source = _computeLibrarySource(file.absolute.path); |
206 if (!knownSources.contains(source)) { | 213 if (!knownSources.contains(source)) { |
207 changeSet.addedSource(source); | 214 changeSet.addedSource(source); |
208 } | 215 } |
209 sourcesToAnalyze.add(source); | 216 sourcesToAnalyze.add(source); |
210 } | 217 } |
| 218 |
| 219 if (analysisDriver != null) { |
| 220 files.forEach((file) { |
| 221 analysisDriver.addFile(file.path); |
| 222 }); |
| 223 } else { |
| 224 context.applyChanges(changeSet); |
| 225 } |
211 } | 226 } |
212 context.applyChanges(changeSet); | |
213 | 227 |
214 // Analyze the libraries. | 228 // Analyze the libraries. |
215 ErrorSeverity allResult = ErrorSeverity.NONE; | 229 ErrorSeverity allResult = ErrorSeverity.NONE; |
216 var libUris = <Uri>[]; | 230 var libUris = <Uri>[]; |
217 var parts = <Source>[]; | 231 var parts = <Source>[]; |
218 for (Source source in sourcesToAnalyze) { | 232 for (Source source in sourcesToAnalyze) { |
219 if (context.computeKindOf(source) == SourceKind.PART) { | 233 if (context.computeKindOf(source) == SourceKind.PART) { |
220 parts.add(source); | 234 parts.add(source); |
221 continue; | 235 continue; |
222 } | 236 } |
(...skipping 310 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
533 AnalyzeFunctionBodiesPredicate dietParsingPolicy = | 547 AnalyzeFunctionBodiesPredicate dietParsingPolicy = |
534 _chooseDietParsingPolicy(options); | 548 _chooseDietParsingPolicy(options); |
535 setAnalysisContextOptions( | 549 setAnalysisContextOptions( |
536 resourceProvider, sourceFactory, _context, options, | 550 resourceProvider, sourceFactory, _context, options, |
537 (AnalysisOptionsImpl contextOptions) { | 551 (AnalysisOptionsImpl contextOptions) { |
538 contextOptions.analyzeFunctionBodiesPredicate = dietParsingPolicy; | 552 contextOptions.analyzeFunctionBodiesPredicate = dietParsingPolicy; |
539 }); | 553 }); |
540 | 554 |
541 _context.sourceFactory = sourceFactory; | 555 _context.sourceFactory = sourceFactory; |
542 | 556 |
543 if (sdkBundle != null) { | 557 if (options.enableNewAnalysisDriver) { |
544 _context.resultProvider = | 558 PerformanceLog log = new PerformanceLog(null); |
545 new InputPackagesResultProvider(_context, summaryDataStore); | 559 AnalysisDriverScheduler scheduler = new AnalysisDriverScheduler(log); |
| 560 analysisDriver = new AnalysisDriver( |
| 561 scheduler, |
| 562 log, |
| 563 resourceProvider, |
| 564 analysisDriverByteStore, |
| 565 new FileContentOverlay(), |
| 566 'test', |
| 567 context.sourceFactory, |
| 568 context.analysisOptions); |
| 569 analysisDriver.results.listen((_) {}); |
| 570 analysisDriver.exceptions.listen((_) {}); |
| 571 scheduler.start(); |
| 572 } else { |
| 573 if (sdkBundle != null) { |
| 574 _context.resultProvider = |
| 575 new InputPackagesResultProvider(_context, summaryDataStore); |
| 576 } |
546 } | 577 } |
547 } | 578 } |
548 | 579 |
549 /// Return discovered packagespec, or `null` if none is found. | 580 /// Return discovered packagespec, or `null` if none is found. |
550 Packages _discoverPackagespec(Uri root) { | 581 Packages _discoverPackagespec(Uri root) { |
551 try { | 582 try { |
552 Packages packages = pkg_discovery.findPackagesFromFile(root); | 583 Packages packages = pkg_discovery.findPackagesFromFile(root); |
553 if (packages != Packages.noPackages) { | 584 if (packages != Packages.noPackages) { |
554 return packages; | 585 return packages; |
555 } | 586 } |
(...skipping 77 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
633 ExtensionManager manager = new ExtensionManager(); | 664 ExtensionManager manager = new ExtensionManager(); |
634 manager.processPlugins(plugins); | 665 manager.processPlugins(plugins); |
635 | 666 |
636 linter.registerLintRules(); | 667 linter.registerLintRules(); |
637 } | 668 } |
638 | 669 |
639 /// Analyze a single source. | 670 /// Analyze a single source. |
640 Future<ErrorSeverity> _runAnalyzer( | 671 Future<ErrorSeverity> _runAnalyzer( |
641 Source source, CommandLineOptions options) async { | 672 Source source, CommandLineOptions options) async { |
642 int startTime = currentTimeMillis(); | 673 int startTime = currentTimeMillis(); |
643 AnalyzerImpl analyzer = new AnalyzerImpl( | 674 AnalyzerImpl analyzer = new AnalyzerImpl(_context.analysisOptions, _context, |
644 _context.analysisOptions, _context, source, options, stats, startTime); | 675 analysisDriver, source, options, stats, startTime); |
645 ErrorSeverity errorSeverity = await analyzer.analyze(); | 676 ErrorSeverity errorSeverity = await analyzer.analyze(); |
646 if (errorSeverity == ErrorSeverity.ERROR) { | 677 if (errorSeverity == ErrorSeverity.ERROR) { |
647 io.exitCode = errorSeverity.ordinal; | 678 io.exitCode = errorSeverity.ordinal; |
648 } | 679 } |
649 if (options.warningsAreFatal && errorSeverity == ErrorSeverity.WARNING) { | 680 if (options.warningsAreFatal && errorSeverity == ErrorSeverity.WARNING) { |
650 io.exitCode = errorSeverity.ordinal; | 681 io.exitCode = errorSeverity.ordinal; |
651 } | 682 } |
652 return errorSeverity; | 683 return errorSeverity; |
653 } | 684 } |
654 | 685 |
(...skipping 227 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
882 for (var package in packages) { | 913 for (var package in packages) { |
883 var packageName = path.basename(package.path); | 914 var packageName = path.basename(package.path); |
884 var realPath = package.resolveSymbolicLinksSync(); | 915 var realPath = package.resolveSymbolicLinksSync(); |
885 result[packageName] = [ | 916 result[packageName] = [ |
886 PhysicalResourceProvider.INSTANCE.getFolder(realPath) | 917 PhysicalResourceProvider.INSTANCE.getFolder(realPath) |
887 ]; | 918 ]; |
888 } | 919 } |
889 return result; | 920 return result; |
890 } | 921 } |
891 } | 922 } |
OLD | NEW |