Chromium Code Reviews| Index: pkg/analyzer/lib/src/dart/analysis/driver.dart |
| diff --git a/pkg/analyzer/lib/src/dart/analysis/driver.dart b/pkg/analyzer/lib/src/dart/analysis/driver.dart |
| index 1df60ec490108660716460dff69268fc17ae3188..5d9914cf6e83a36d62b97d14992c6cda410fde14 100644 |
| --- a/pkg/analyzer/lib/src/dart/analysis/driver.dart |
| +++ b/pkg/analyzer/lib/src/dart/analysis/driver.dart |
| @@ -9,6 +9,7 @@ import 'dart:typed_data'; |
| import 'package:analyzer/context/context_root.dart'; |
| import 'package:analyzer/context/declared_variables.dart'; |
| import 'package:analyzer/dart/analysis/results.dart' as results; |
| +import 'package:analyzer/dart/analysis/session.dart'; |
| import 'package:analyzer/dart/ast/ast.dart'; |
| import 'package:analyzer/dart/element/element.dart' |
| show CompilationUnitElement, LibraryElement; |
| @@ -22,6 +23,7 @@ import 'package:analyzer/src/dart/analysis/index.dart'; |
| import 'package:analyzer/src/dart/analysis/library_analyzer.dart'; |
| import 'package:analyzer/src/dart/analysis/library_context.dart'; |
| import 'package:analyzer/src/dart/analysis/search.dart'; |
| +import 'package:analyzer/src/dart/analysis/session.dart'; |
| import 'package:analyzer/src/dart/analysis/status.dart'; |
| import 'package:analyzer/src/dart/analysis/top_level_declaration.dart'; |
| import 'package:analyzer/src/generated/engine.dart' |
| @@ -280,6 +282,14 @@ class AnalysisDriver implements AnalysisDriverGeneric { |
| final Map<String, AnalysisResult> _allCachedResults = {}; |
| /** |
| + * The current analysis session. |
| + * |
| + * TODO(brianwilkerson) Create a new session when the current session might |
| + * produce inconsistent results. |
| + */ |
| + AnalysisSession _currentSession; |
| + |
| + /** |
| * Create a new instance of [AnalysisDriver]. |
| * |
| * The given [SourceFactory] is cloned to ensure that it does not contain a |
| @@ -301,6 +311,7 @@ class AnalysisDriver implements AnalysisDriverGeneric { |
| _sourceFactory = sourceFactory.clone(), |
| _sdkBundle = sdkBundle, |
| _externalSummaries = externalSummaries { |
| + _currentSession = new DriverBasedAnalysisSession(this); |
| _onResults = _resultController.stream.asBroadcastStream(); |
| _testView = new AnalysisDriverTestView(this); |
| _createFileTracker(); |
| @@ -319,6 +330,11 @@ class AnalysisDriver implements AnalysisDriverGeneric { |
| AnalysisOptions get analysisOptions => _analysisOptions; |
| /** |
| + * Return the current analysis session. |
| + */ |
| + AnalysisSession get currentSession => _currentSession; |
| + |
| + /** |
| * Return the stream that produces [ExceptionResult]s. |
| */ |
| Stream<ExceptionResult> get exceptions => _exceptionController.stream; |
| @@ -538,8 +554,8 @@ class AnalysisDriver implements AnalysisDriverGeneric { |
| return null; |
| } |
| - return new ErrorsResult(path, analysisResult.uri, analysisResult.lineInfo, |
| - analysisResult.errors); |
| + return new ErrorsResult(currentSession, path, analysisResult.uri, |
| + analysisResult.lineInfo, analysisResult.errors); |
| } |
| /** |
| @@ -733,8 +749,8 @@ class AnalysisDriver implements AnalysisDriverGeneric { |
| FileState file = _fileTracker.verifyApiSignature(path); |
| RecordingErrorListener listener = new RecordingErrorListener(); |
| CompilationUnit unit = file.parse(listener); |
| - return new ParseResult(file.path, file.uri, file.content, unit.lineInfo, |
| - unit, listener.errors); |
| + return new ParseResult(currentSession, file.path, file.uri, file.content, |
| + unit.lineInfo, unit, listener.errors); |
| } |
| @override |
| @@ -1067,7 +1083,8 @@ class AnalysisDriver implements AnalysisDriverGeneric { |
| CompilationUnitElement element = |
| libraryContext.computeUnitElement(library.source, file.source); |
| String signature = library.transitiveSignature; |
| - return new UnitElementResult(path, file.uri, signature, element); |
| + return new UnitElementResult( |
| + currentSession, path, file.uri, signature, element); |
| } finally { |
| libraryContext.dispose(); |
| } |
| @@ -1599,7 +1616,8 @@ class AnalysisDriverTestView { |
| * Every result is independent, and is not guaranteed to be consistent with |
| * any previously returned result, even inside of the same library. |
| */ |
| -class AnalysisResult implements results.ResolveResult { |
| +class AnalysisResult extends BaseAnalysisResult |
| + implements results.ResolveResult { |
| static final _UNCHANGED = new AnalysisResult( |
| null, null, null, null, null, null, null, null, null, null, null); |
| @@ -1613,12 +1631,6 @@ class AnalysisResult implements results.ResolveResult { |
| */ |
| final SourceFactory sourceFactory; |
| - @override |
| - final String path; |
| - |
| - @override |
| - final Uri uri; |
| - |
| /** |
| * Return `true` if the file exists. |
| */ |
| @@ -1651,15 +1663,16 @@ class AnalysisResult implements results.ResolveResult { |
| AnalysisResult( |
| this.driver, |
| this.sourceFactory, |
| - this.path, |
| - this.uri, |
| + String path, |
| + Uri uri, |
| this.exists, |
| this.content, |
| this.lineInfo, |
| this._signature, |
| this.unit, |
| this.errors, |
| - this._index); |
| + this._index) |
| + : super(driver?.currentSession, path, uri); |
| @override |
| LibraryElement get libraryElement => unit.element.library; |
| @@ -1672,6 +1685,19 @@ class AnalysisResult implements results.ResolveResult { |
| TypeProvider get typeProvider => unit.element.context.typeProvider; |
| } |
| +abstract class BaseAnalysisResult implements results.AnalysisResult { |
| + @override |
| + final String path; |
| + |
| + @override |
| + final AnalysisSession session; |
|
scheglov
2017/06/26 15:30:03
This field should be the first.
Brian Wilkerson
2017/06/26 16:06:19
Done
|
| + |
| + @override |
| + final Uri uri; |
| + |
| + BaseAnalysisResult(this.session, this.path, this.uri); |
| +} |
| + |
| class DriverPerformance { |
| static final PerformanceTag driver = |
| PerformanceStatistics.analyzer.createChild('driver'); |
| @@ -1704,20 +1730,16 @@ abstract class DriverWatcher { |
| * correspond to each other. But none of the results is guaranteed to be |
| * consistent with the state of the files. |
| */ |
| -class ErrorsResult implements results.ErrorsResult { |
| - @override |
| - final String path; |
| - |
| - @override |
| - final Uri uri; |
| - |
| +class ErrorsResult extends BaseAnalysisResult implements results.ErrorsResult { |
| @override |
| final LineInfo lineInfo; |
| @override |
| final List<AnalysisError> errors; |
| - ErrorsResult(this.path, this.uri, this.lineInfo, this.errors); |
| + ErrorsResult( |
| + AnalysisSession session, String path, Uri uri, this.lineInfo, this.errors) |
| + : super(session, path, uri); |
| @override |
| results.ResultState get state => results.ResultState.VALID; |
| @@ -1757,13 +1779,7 @@ class ExceptionResult { |
| * resolved [unit] correspond to each other. But none of the results is |
| * guaranteed to be consistent with the state of the files. |
| */ |
| -class ParseResult implements results.ParseResult { |
| - @override |
| - final String path; |
| - |
| - @override |
| - final Uri uri; |
| - |
| +class ParseResult extends BaseAnalysisResult implements results.ParseResult { |
| @override |
| final String content; |
| @@ -1776,8 +1792,9 @@ class ParseResult implements results.ParseResult { |
| @override |
| final List<AnalysisError> errors; |
| - ParseResult( |
| - this.path, this.uri, this.content, this.lineInfo, this.unit, this.errors); |
| + ParseResult(AnalysisSession session, String path, Uri uri, this.content, |
| + this.lineInfo, this.unit, this.errors) |
| + : super(session, path, uri); |
| @override |
| results.ResultState get state => results.ResultState.VALID; |
| @@ -1794,13 +1811,8 @@ class ParseResult implements results.ParseResult { |
| * Every result is independent, and is not guaranteed to be consistent with |
| * any previously returned result, even inside of the same library. |
| */ |
| -class UnitElementResult implements results.UnitElementResult { |
| - @override |
| - final String path; |
| - |
| - @override |
| - final Uri uri; |
| - |
| +class UnitElementResult extends BaseAnalysisResult |
| + implements results.UnitElementResult { |
| /** |
| * The signature of the [element] is based the APIs of the files of the |
| * library (including the file itself) of the requested file and the |
| @@ -1813,7 +1825,9 @@ class UnitElementResult implements results.UnitElementResult { |
| */ |
| final CompilationUnitElement element; |
| - UnitElementResult(this.path, this.uri, this.signature, this.element); |
| + UnitElementResult(AnalysisSession session, String path, Uri uri, |
| + this.signature, this.element) |
| + : super(session, path, uri); |
| @override |
| results.ResultState get state => results.ResultState.VALID; |