Index: pkg/analyzer/lib/src/lint/analysis.dart |
diff --git a/pkg/analyzer/lib/src/lint/analysis.dart b/pkg/analyzer/lib/src/lint/analysis.dart |
index 631bbc312b0f8124c09ab5fc56094136cdc7b248..667eb75e0f79cd6a9da4a94f157d958b919735b4 100644 |
--- a/pkg/analyzer/lib/src/lint/analysis.dart |
+++ b/pkg/analyzer/lib/src/lint/analysis.dart |
@@ -2,17 +2,19 @@ |
// for details. All rights reserved. Use of this source code is governed by a |
// BSD-style license that can be found in the LICENSE file. |
+import 'dart:async'; |
import 'dart:collection'; |
import 'dart:io' as io; |
-import 'package:analyzer/dart/element/element.dart'; |
import 'package:analyzer/file_system/file_system.dart' |
show File, Folder, ResourceProvider, ResourceUriResolver; |
import 'package:analyzer/file_system/physical_file_system.dart'; |
import 'package:analyzer/source/package_map_resolver.dart'; |
import 'package:analyzer/src/context/builder.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/engine.dart' hide AnalysisResult; |
import 'package:analyzer/src/generated/sdk.dart'; |
import 'package:analyzer/src/generated/source.dart'; |
import 'package:analyzer/src/generated/source_io.dart'; |
@@ -22,6 +24,8 @@ import 'package:analyzer/src/lint/project.dart'; |
import 'package:analyzer/src/lint/registry.dart'; |
import 'package:analyzer/src/services/lint.dart'; |
import 'package:analyzer/src/util/sdk.dart'; |
+import 'package:front_end/src/base/performace_logger.dart'; |
+import 'package:front_end/src/incremental/byte_store.dart'; |
import 'package:package_config/packages.dart' show Packages; |
import 'package:package_config/packages_file.dart' as pkgfile show parse; |
import 'package:package_config/src/packages_impl.dart' show MapPackages; |
@@ -41,7 +45,7 @@ void printAndFail(String message, {int exitCode: 15}) { |
io.exit(exitCode); |
} |
-AnalysisOptions _buildAnalyzerOptions(DriverOptions options) { |
+AnalysisOptions _buildAnalyzerOptions(LinterOptions options) { |
AnalysisOptionsImpl analysisOptions = new AnalysisOptionsImpl(); |
analysisOptions.strongMode = options.strongMode; |
analysisOptions.hint = false; |
@@ -49,6 +53,7 @@ AnalysisOptions _buildAnalyzerOptions(DriverOptions options) { |
analysisOptions.generateSdkErrors = options.showSdkWarnings; |
analysisOptions.enableAssertInitializer = options.enableAssertInitializer; |
analysisOptions.enableTiming = options.enableTiming; |
+ analysisOptions.lintRules = options.enabledLints?.toList(growable: false); |
return analysisOptions; |
} |
@@ -84,10 +89,6 @@ class DriverOptions { |
/// The mock SDK (to speed up testing) or `null` to use the actual SDK. |
DartSdk mockSdk; |
- |
- /// Whether to show lints for the transitive closure of imported and exported |
- /// libraries. |
- bool visitTransitiveClosure = false; |
} |
class LintDriver { |
@@ -111,8 +112,8 @@ class LintDriver { |
ContextBuilder builder = new ContextBuilder(resourceProvider, null, null); |
DartSdk sdk = options.mockSdk ?? |
- new FolderBasedDartSdk( |
- resourceProvider, resourceProvider.getFolder(sdkDir)); |
+ new FolderBasedDartSdk(resourceProvider, |
+ resourceProvider.getFolder(sdkDir), options.strongMode); |
List<UriResolver> resolvers = [new DartUriResolver(sdk)]; |
@@ -138,42 +139,51 @@ class LintDriver { |
return resolvers; |
} |
+ ResourceProvider get resourceProvider => options.resourceProvider; |
+ |
String get sdkDir { |
// In case no SDK has been specified, fall back to inferring it. |
return options.dartSdkPath ?? getSdkPath(); |
} |
- List<AnalysisErrorInfo> analyze(Iterable<io.File> files) { |
- AnalysisContext context = AnalysisEngine.instance.createAnalysisContext(); |
- context.analysisOptions = _buildAnalyzerOptions(options); |
- registerLinters(context); |
- |
- Packages packages = _getPackageConfig(); |
- |
- context.sourceFactory = new SourceFactory(resolvers, packages); |
+ Future<List<AnalysisErrorInfo>> analyze(Iterable<io.File> files) async { |
AnalysisEngine.instance.logger = new StdLogger(); |
+ SourceFactory sourceFactory = |
+ new SourceFactory(resolvers, _getPackageConfig()); |
+ |
+ PerformanceLog log = new PerformanceLog(null); |
+ AnalysisDriverScheduler scheduler = new AnalysisDriverScheduler(log); |
+ AnalysisDriver analysisDriver = new AnalysisDriver( |
+ scheduler, |
+ log, |
+ resourceProvider, |
+ new MemoryByteStore(), |
+ new FileContentOverlay(), |
+ null, |
+ sourceFactory, |
+ _buildAnalyzerOptions(options)); |
+ analysisDriver.results.listen((_) {}); |
+ analysisDriver.exceptions.listen((_) {}); |
+ scheduler.start(); |
+ |
List<Source> sources = []; |
- ChangeSet changeSet = new ChangeSet(); |
for (io.File file in files) { |
- File sourceFile = PhysicalResourceProvider.INSTANCE |
- .getFile(p.normalize(file.absolute.path)); |
+ File sourceFile = |
+ resourceProvider.getFile(p.normalize(file.absolute.path)); |
Source source = sourceFile.createSource(); |
- Uri uri = context.sourceFactory.restoreUri(source); |
+ Uri uri = sourceFactory.restoreUri(source); |
if (uri != null) { |
// Ensure that we analyze the file using its canonical URI (e.g. if |
// it's in "/lib", analyze it using a "package:" URI). |
source = sourceFile.createSource(uri); |
} |
+ |
sources.add(source); |
- changeSet.addedSource(source); |
+ analysisDriver.addFile(source.fullName); |
} |
- context.applyChanges(changeSet); |
- // Temporary location |
- var project = new DartProject(context, sources); |
- // This will get pushed into the generator (or somewhere comparable) when |
- // we have a proper plugin. |
+ DartProject project = await DartProject.create(analysisDriver, sources); |
Registry.ruleRegistry.forEach((lint) { |
if (lint is ProjectVisitor) { |
(lint as ProjectVisitor).visit(project); |
@@ -181,30 +191,14 @@ class LintDriver { |
}); |
List<AnalysisErrorInfo> errors = []; |
- |
for (Source source in sources) { |
- context.computeErrors(source); |
- errors.add(context.getErrors(source)); |
+ ErrorsResult errorsResult = |
+ await analysisDriver.getErrors(source.fullName); |
+ errors.add(new AnalysisErrorInfoImpl( |
+ errorsResult.errors, errorsResult.lineInfo)); |
_sourcesAnalyzed.add(source); |
} |
- if (options.visitTransitiveClosure) { |
- // In the process of computing errors for all the sources in [sources], |
- // the analyzer has visited the transitive closure of all libraries |
- // referenced by those sources. So now we simply need to visit all |
- // library sources known to the analysis context, and all parts they |
- // refer to. |
- for (Source librarySource in context.librarySources) { |
- for (Source source in _getAllUnitSources(context, librarySource)) { |
- if (!_sourcesAnalyzed.contains(source)) { |
- context.computeErrors(source); |
- errors.add(context.getErrors(source)); |
- _sourcesAnalyzed.add(source); |
- } |
- } |
- } |
- } |
- |
return errors; |
} |
@@ -214,18 +208,6 @@ class LintDriver { |
} |
} |
- /// Yield the sources for all the compilation units constituting |
- /// [librarySource] (including the defining compilation unit). |
- Iterable<Source> _getAllUnitSources( |
- AnalysisContext context, Source librarySource) { |
- List<Source> result = <Source>[librarySource]; |
- result.addAll(context |
- .getLibraryElement(librarySource) |
- .parts |
- .map((CompilationUnitElement e) => e.source)); |
- return result; |
- } |
- |
Packages _getPackageConfig() { |
if (options.packageConfigPath != null) { |
String packageConfigPath = options.packageConfigPath; |