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

Unified Diff: pkg/analyzer/lib/src/lint/analysis.dart

Issue 2992463003: Update linter engine to use driver (linter#743). (Closed)
Patch Set: Created 3 years, 5 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 | « no previous file | pkg/analyzer/lib/src/lint/linter.dart » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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;
« no previous file with comments | « no previous file | pkg/analyzer/lib/src/lint/linter.dart » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698