From 89bd370e95c0695250a4f0111be3134b9936eadd Mon Sep 17 00:00:00 2001 From: Konstantin Shcheglov Date: Thu, 11 Jan 2024 03:53:48 +0000 Subject: [PATCH] AnalysisDriver. Produce results for all files of a library. Change-Id: I0118ccdbd4a9059eb3809cb3b6a694731621d809 Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/345363 Commit-Queue: Konstantin Shcheglov Reviewed-by: Brian Wilkerson --- .../test/integration/analysis/error_test.dart | 7 + .../lib/src/dart/analysis/driver.dart | 648 ++++---- .../lib/src/dart/analysis/driver_event.dart | 10 +- .../dart/analysis/driver_caching_test.dart | 6 +- .../test/src/dart/analysis/driver_test.dart | 1406 +++++++++++++---- .../src/dart/analysis/result_printer.dart | 47 +- 6 files changed, 1434 insertions(+), 690 deletions(-) diff --git a/pkg/analysis_server/test/integration/analysis/error_test.dart b/pkg/analysis_server/test/integration/analysis/error_test.dart index 4c0b3cd4e83..95b4a50524a 100644 --- a/pkg/analysis_server/test/integration/analysis/error_test.dart +++ b/pkg/analysis_server/test/integration/analysis/error_test.dart @@ -28,8 +28,15 @@ void f() { await sendServerSetSubscriptions([ServerService.STATUS]); await sendAnalysisUpdateContent({filePath: AddContentOverlay(content)}); await sendAnalysisSetAnalysisRoots([packagePath], []); + await analysisFinished; + // TODO(scheglov): https://github.com/dart-lang/sdk/issues/54577 + // `await analysisFinished` should be enough, but was not promised. + while (currentAnalysisErrors[filePath] == null) { + await pumpEventQueue(); + } + expect(currentAnalysisErrors[filePath], isList); var errors = existingErrorsForFile(filePath); expect(errors, hasLength(1)); diff --git a/pkg/analyzer/lib/src/dart/analysis/driver.dart b/pkg/analyzer/lib/src/dart/analysis/driver.dart index 299b94b127e..174cb3e5398 100644 --- a/pkg/analyzer/lib/src/dart/analysis/driver.dart +++ b/pkg/analyzer/lib/src/dart/analysis/driver.dart @@ -54,12 +54,12 @@ import 'package:analyzer/src/util/performance/operation_performance.dart'; import 'package:analyzer/src/utilities/extensions/collection.dart'; import 'package:analyzer/src/utilities/uri_cache.dart'; -/// This class computes [AnalysisResult]s for Dart files. +/// This class computes analysis results for Dart files. /// /// Let the set of "explicitly analyzed files" denote the set of paths that have /// been passed to [addFile] but not subsequently passed to [removeFile]. Let /// the "current analysis results" denote the map from the set of explicitly -/// analyzed files to the most recent [AnalysisResult] delivered to [results] +/// analyzed files to the most recent analysis result delivered to [results] /// for each file. Let the "current file state" represent a map from file path /// to the file contents most recently read from that file, or fetched from the /// content cache (considering all possible file paths, regardless of @@ -90,7 +90,7 @@ import 'package:analyzer/src/utilities/uri_cache.dart'; // TODO(scheglov): Clean up the list of implicitly analyzed files. class AnalysisDriver { /// The version of data format, should be incremented on every format change. - static const int DATA_VERSION = 326; + static const int DATA_VERSION = 327; /// The number of exception contexts allowed to write. Once this field is /// zero, we stop writing any new exception contexts in this process. @@ -427,7 +427,8 @@ class AnalysisDriver { /// Return the [ResourceProvider] that is used to access the file system. ResourceProvider get resourceProvider => _resourceProvider; - /// Return the [Stream] that produces [AnalysisResult]s for added files. + /// Return the [Stream] that produces [ErrorsResult]s and + /// [ResolvedUnitResult]s for added files. /// /// Note that the stream supports only one single subscriber. /// @@ -1164,7 +1165,7 @@ class AnalysisDriver { final result = await _resolveForCompletion(request); request.completer.complete(result); } catch (exception, stackTrace) { - _reportException(request.path, exception, stackTrace); + _reportException(request.path, exception, stackTrace, null); request.completer.completeError(exception, stackTrace); _clearLibraryContextAfterException(); } @@ -1174,61 +1175,28 @@ class AnalysisDriver { // Analyze a requested file. if (_requestedFiles.isNotEmpty) { final path = _requestedFiles.keys.first; - final completers = _requestedFiles.remove(path)!; - _fileTracker.fileWasAnalyzed(path); - try { - final result = await _computeAnalysisResult(path, withUnit: true); - final unitResult = result.unitResult!; - for (final completer in completers) { - completer.complete(unitResult); - } - _resultController.add(unitResult); - } catch (exception, stackTrace) { - _reportException(path, exception, stackTrace); - for (final completer in completers) { - completer.completeError(exception, stackTrace); - } - _clearLibraryContextAfterException(); - } + await _analyzeFile(path); return; } // Analyze a requested library. if (_requestedLibraries.isNotEmpty) { final library = _requestedLibraries.keys.first; - try { - var result = await _computeResolvedLibrary(library); - for (var completer in _requestedLibraries.remove(library)!) { - completer.complete(result); - } - } catch (exception, stackTrace) { - for (var completer in _requestedLibraries.remove(library)!) { - completer.completeError(exception, stackTrace); - } - _clearLibraryContextAfterException(); - } + await _getResolvedLibrary(library); return; } // Process an error request. if (_errorsRequestedFiles.isNotEmpty) { - var path = _errorsRequestedFiles.keys.first; - var completers = _errorsRequestedFiles.remove(path)!; - var analysisResult = await _computeAnalysisResult(path, withUnit: false); - var result = analysisResult.errorsResult!; - for (var completer in completers) { - completer.complete(result); - } + final path = _errorsRequestedFiles.keys.first; + await _getErrors(path); return; } // Process an index request. if (_indexRequestedFiles.isNotEmpty) { - String path = _indexRequestedFiles.keys.first; - final index = await _computeIndex(path); - for (var completer in _indexRequestedFiles.remove(path)!) { - completer.complete(index); - } + final path = _indexRequestedFiles.keys.first; + await _getIndex(path); return; } @@ -1275,15 +1243,7 @@ class AnalysisDriver { if (_priorityFiles.isNotEmpty) { for (String path in _priorityFiles) { if (_fileTracker.isFilePending(path)) { - try { - var result = await _computeAnalysisResult(path, withUnit: true); - _resultController.add(result.unitResult!); - } catch (exception, stackTrace) { - _reportException(path, exception, stackTrace); - _clearLibraryContextAfterException(); - } finally { - _fileTracker.fileWasAnalyzed(path); - } + await _analyzeFile(path); return; } } @@ -1292,22 +1252,7 @@ class AnalysisDriver { // Analyze a general file. if (_fileTracker.hasPendingFiles) { String path = _fileTracker.anyPendingFile; - try { - var result = await _computeAnalysisResult(path, - withUnit: false, skipIfSameSignature: true); - if (result.isUnchangedErrors) { - // We found that the set of errors is the same as we produced the - // last time, so we don't need to produce it again now. - } else { - _resultController.add(result.errorsResult!); - _lastProducedSignatures[path] = result._signature; - } - } catch (exception, stackTrace) { - _reportException(path, exception, stackTrace); - _clearLibraryContextAfterException(); - } finally { - _fileTracker.fileWasAnalyzed(path); - } + await _produceErrors(path); return; } } @@ -1366,6 +1311,174 @@ class AnalysisDriver { } } + Future _analyzeFile(String path) async { + // We will produce the result for this file, at least. + // And for any other files of the same library. + _fileTracker.fileWasAnalyzed(path); + + final file = _fsState.getFileForPath(path); + + // Prepare the library - the file itself, or the known library. + final kind = file.kind; + final library = kind.library ?? kind.asLibrary; + + // We need the fully resolved unit, or the result is not cached. + return _logger.runAsync('Compute analysis result for $path', () async { + _logger.writeln('Work in $name'); + try { + testView?.numOfAnalyzedLibraries++; + _resultController.add( + events.AnalyzeFile( + file: file, + library: library, + ), + ); + + if (!_hasLibraryByUri('dart:core')) { + _errorsRequestedFiles.completeAll( + path, + _newMissingDartLibraryResult(file, 'dart:core'), + ); + return; + } + + if (!_hasLibraryByUri('dart:async')) { + _errorsRequestedFiles.completeAll( + path, + _newMissingDartLibraryResult(file, 'dart:async'), + ); + return; + } + + await libraryContext.load( + targetLibrary: library, + performance: OperationPerformanceImpl(''), + ); + + var options = libraryContext.analysisContext + .getAnalysisOptionsForFile(file.resource); + + var results = LibraryAnalyzer( + options, + declaredVariables, + libraryContext.elementFactory.libraryOfUri2(library.file.uri), + libraryContext.elementFactory.analysisSession.inheritanceManager, + library, + resourceProvider.pathContext, + testingData: testingData, + ).analyze(); + + final isLibraryWithPriorityFile = _isLibraryWithPriorityFile(library); + + final resolvedUnits = []; + for (var unitResult in results) { + var unitFile = unitResult.file; + + final index = enableIndex + ? indexUnit(unitResult.unit) + : AnalysisDriverUnitIndexBuilder(); + + final resolvedUnit = _createResolvedUnitImpl( + file: unitFile, + unitResult: unitResult, + ); + resolvedUnits.add(resolvedUnit); + + // getResolvedUnit() + _requestedFiles.completeAll(unitFile.path, resolvedUnit); + + // getErrors() + _errorsRequestedFiles.completeAll( + unitFile.path, + _createErrorsResultImpl( + file: file, + errors: unitResult.errors, + ), + ); + + // getIndex() + _indexRequestedFiles.completeAll(unitFile.path, index); + + final unitSignature = _getResolvedUnitSignature(library, unitFile); + { + final unitKey = _getResolvedUnitKey(unitSignature); + final unitBytes = AnalysisDriverResolvedUnitBuilder( + errors: unitResult.errors.map((error) { + return ErrorEncoding.encode(error); + }).toList(), + index: index, + ).toBuffer(); + _byteStore.putGet(unitKey, unitBytes); + } + + _fileTracker.fileWasAnalyzed(unitFile.path); + _lastProducedSignatures[path] = unitSignature; + _resultController.add(resolvedUnit); + + if (isLibraryWithPriorityFile) { + _priorityResults[unitFile.path] = resolvedUnit; + } + + _updateHasErrorOrWarningFlag(file, resolvedUnit.errors); + } + + final libraryResult = ResolvedLibraryResultImpl( + session: currentSession, + element: resolvedUnits.first.libraryElement, + units: resolvedUnits, + ); + + if (isLibraryWithPriorityFile) { + _resolvedLibraryCache[library] = libraryResult; + } + + // getResolvedLibrary() + { + final completers = _requestedLibraries.remove(library); + if (completers != null) { + for (final completer in completers) { + completer.complete(libraryResult); + } + } + } + + // Return the result, full or partial. + _logger.writeln('Computed new analysis result.'); + // return result; + } catch (exception, stackTrace) { + final contextKey = + _storeExceptionContext(path, library, exception, stackTrace); + _reportException(path, exception, stackTrace, contextKey); + + // Complete all related requests with an error. + void completeWithError(List>? completers) { + if (completers != null) { + for (final completer in completers) { + completer.completeError(exception, stackTrace); + } + } + } + + // TODO(scheglov): write tests + for (final file in library.files) { + // getResolvedUnit() + completeWithError( + _requestedFiles.remove(file.path), + ); + // getErrors() + completeWithError( + _errorsRequestedFiles.remove(file.path), + ); + } + // getResolvedLibrary() + completeWithError( + _requestedLibraries.remove(library), + ); + _clearLibraryContextAfterException(); + } + }); + } + void _applyPendingFileChanges() { var accumulatedAffected = {}; for (var fileChange in _pendingFileChanges) { @@ -1409,230 +1522,6 @@ class AnalysisDriver { _resolvedLibraryCache.clear(); } - /// Return the cached or newly computed analysis result of the file with the - /// given [path]. - /// - /// The [withUnit] flag control which result will be returned. - /// When `true`, [AnalysisResult.unitResult] will be set. - /// Otherwise [AnalysisResult.errorsResult] will be set. - /// - /// Return [AnalysisResult._UNCHANGED] if [skipIfSameSignature] is `true` and - /// the resolved signature of the file in its library is the same as the one - /// that was the most recently produced to the client. - Future _computeAnalysisResult(String path, - {required bool withUnit, bool skipIfSameSignature = false}) async { - FileState file = _fsState.getFileForPath(path); - - // Prepare the library - the file itself, or the known library. - final kind = file.kind; - final library = kind.library ?? kind.asLibrary; - - // Prepare the signature and key. - String signature = _getResolvedUnitSignature(library, file); - String key = _getResolvedUnitKey(signature); - - // Skip reading if the signature, so errors, are the same as the last time. - if (skipIfSameSignature) { - assert(!withUnit); - if (_lastProducedSignatures[path] == signature) { - return AnalysisResult.unchangedErrors(signature); - } - } - - // If we don't need the fully resolved unit, check for the cached result. - if (!withUnit) { - var bytes = _byteStore.get(key); - if (bytes != null) { - final unit = AnalysisDriverResolvedUnit.fromBuffer(bytes); - final errors = _getErrorsFromSerialized(file, unit.errors); - _updateHasErrorOrWarningFlag(file, errors); - final index = unit.index!; - final errorsResult = _createErrorsResultImpl( - file: file, - errors: errors, - ); - return AnalysisResult.errors(signature, errorsResult, index); - } - } - - // We need the fully resolved unit, or the result is not cached. - return _logger.runAsync('Compute analysis result for $path', () async { - _logger.writeln('Work in $name'); - try { - testView?.numOfAnalyzedLibraries++; - _resultController.add( - events.ComputeAnalysis( - file: file, - library: library, - ), - ); - - if (!_hasLibraryByUri('dart:core')) { - return _newMissingDartLibraryResult(file, 'dart:core'); - } - - if (!_hasLibraryByUri('dart:async')) { - return _newMissingDartLibraryResult(file, 'dart:async'); - } - - await libraryContext.load( - targetLibrary: library, - performance: OperationPerformanceImpl(''), - ); - - var options = libraryContext.analysisContext - .getAnalysisOptionsForFile(file.resource); - - var results = LibraryAnalyzer( - options, - declaredVariables, - libraryContext.elementFactory.libraryOfUri2(library.file.uri), - libraryContext.elementFactory.analysisSession.inheritanceManager, - library, - resourceProvider.pathContext, - testingData: testingData, - ).analyze(); - - final isLibraryWithPriorityFile = _isLibraryWithPriorityFile(library); - - late AnalysisResult result; - final resolvedUnits = []; - for (var unitResult in results) { - var unitFile = unitResult.file; - - final index = enableIndex - ? indexUnit(unitResult.unit) - : AnalysisDriverUnitIndexBuilder(); - - final unitBytes = AnalysisDriverResolvedUnitBuilder( - errors: unitResult.errors.map((error) { - return ErrorEncoding.encode(error); - }).toList(), - index: index, - ).toBuffer(); - - final resolvedUnit = _createResolvedUnitImpl( - file: unitFile, - unitResult: unitResult, - ); - resolvedUnits.add(resolvedUnit); - - if (isLibraryWithPriorityFile) { - _priorityResults[unitFile.path] = resolvedUnit; - } - - String unitSignature = _getResolvedUnitSignature(library, unitFile); - String unitKey = _getResolvedUnitKey(unitSignature); - _byteStore.putGet(unitKey, unitBytes); - - _updateHasErrorOrWarningFlag(file, resolvedUnit.errors); - - if (unitFile == file) { - if (withUnit) { - result = AnalysisResult.unit(signature, resolvedUnit, index); - } else { - result = AnalysisResult.errors( - signature, - _createErrorsResultImpl( - file: unitFile, - errors: unitResult.errors, - ), - index, - ); - } - } - } - - if (isLibraryWithPriorityFile) { - final libraryResult = ResolvedLibraryResultImpl( - session: currentSession, - element: resolvedUnits.first.libraryElement, - units: resolvedUnits, - ); - _resolvedLibraryCache[library] = libraryResult; - } - - // Return the result, full or partial. - _logger.writeln('Computed new analysis result.'); - return result; - } catch (exception, stackTrace) { - String? contextKey = - _storeExceptionContext(path, library, exception, stackTrace); - throw _ExceptionState(exception, stackTrace, contextKey); - } - }); - } - - Future _computeIndex(String path) async { - var analysisResult = await _computeAnalysisResult(path, withUnit: false); - return analysisResult._index!; - } - - /// Return the newly computed resolution result of the library with the - /// given [path]. - Future _computeResolvedLibrary( - LibraryFileKind library, - ) async { - final cached = _resolvedLibraryCache[library]; - if (cached != null) { - return cached; - } - - final path = library.file.path; - return _logger.runAsync('Compute resolved library $path', () async { - testView?.numOfAnalyzedLibraries++; - await libraryContext.load( - targetLibrary: library, - performance: OperationPerformanceImpl(''), - ); - - _resultController.add( - events.ComputeResolvedLibrary( - library: library, - ), - ); - - var analysisOptions = libraryContext.analysisContext - .getAnalysisOptionsForFile(library.file.resource); - - var unitResults = LibraryAnalyzer( - analysisOptions, - declaredVariables, - libraryContext.elementFactory.libraryOfUri2(library.file.uri), - libraryContext.elementFactory.analysisSession.inheritanceManager, - library, - resourceProvider.pathContext, - testingData: testingData) - .analyze(); - var resolvedUnits = []; - - final isLibraryWithPriorityFile = _isLibraryWithPriorityFile(library); - for (final unitResult in unitResults) { - final unitFile = unitResult.file; - final resolvedUnit = _createResolvedUnitImpl( - file: unitFile, - unitResult: unitResult, - ); - resolvedUnits.add(resolvedUnit); - if (isLibraryWithPriorityFile) { - _priorityResults[unitFile.path] = resolvedUnit; - } - } - - final result = ResolvedLibraryResultImpl( - session: currentSession, - element: resolvedUnits.first.libraryElement, - units: resolvedUnits, - ); - - if (isLibraryWithPriorityFile) { - _resolvedLibraryCache[library] = result; - } - - return result; - }); - } - Future _computeUnitElement(String path) async { FileState file = _fsState.getFileForPath(path); @@ -1805,6 +1694,39 @@ class AnalysisDriver { _saltForUnlinked = buffer.toUint32List(); } + Future _getErrors(String path) async { + final file = _fsState.getFileForPath(path); + + // Prepare the library - the file itself, or the known library. + final kind = file.kind; + final library = kind.library ?? kind.asLibrary; + + // Prepare the signature and key. + final signature = _getResolvedUnitSignature(library, file); + final key = _getResolvedUnitKey(signature); + + final bytes = _byteStore.get(key); + if (bytes != null) { + _resultController.add( + events.GetErrorsFromBytes( + file: file, + library: library, + ), + ); + final unit = AnalysisDriverResolvedUnit.fromBuffer(bytes); + final errors = _getErrorsFromSerialized(file, unit.errors); + _updateHasErrorOrWarningFlag(file, errors); + final result = _createErrorsResultImpl( + file: file, + errors: errors, + ); + _errorsRequestedFiles.completeAll(path, result); + return; + } + + await _analyzeFile(path); + } + /// Return [AnalysisError]s for the given [serialized] errors. List _getErrorsFromSerialized( FileState file, List serialized) { @@ -1818,6 +1740,38 @@ class AnalysisDriver { return errors; } + Future _getIndex(String path) async { + final file = _fsState.getFileForPath(path); + + // Prepare the library - the file itself, or the known library. + final kind = file.kind; + final library = kind.library ?? kind.asLibrary; + + // Prepare the signature and key. + final signature = _getResolvedUnitSignature(library, file); + final key = _getResolvedUnitKey(signature); + + final bytes = _byteStore.get(key); + if (bytes != null) { + final unit = AnalysisDriverResolvedUnit.fromBuffer(bytes); + _indexRequestedFiles.completeAll(path, unit.index!); + return; + } + + await _analyzeFile(path); + } + + /// Completes the [getResolvedLibrary] request. + Future _getResolvedLibrary(LibraryFileKind library) async { + final cached = _resolvedLibraryCache[library]; + if (cached != null) { + _requestedLibraries.completeAll(library, cached); + return; + } + + await _analyzeFile(library.file.path); + } + /// Return the key to store fully resolved results for the [signature]. String _getResolvedUnitKey(String signature) { return '$signature.resolved'; @@ -1871,10 +1825,10 @@ class AnalysisDriver { /// We detected that one of the required `dart` libraries is missing. /// Return the empty analysis result with the error. - AnalysisResult _newMissingDartLibraryResult( + ErrorsResultImpl _newMissingDartLibraryResult( FileState file, String missingUri) { // TODO(scheglov): Find a better way to report this. - var errorsResult = ErrorsResultImpl( + return ErrorsResultImpl( session: currentSession, file: file.resource, lineInfo: file.lineInfo, @@ -1893,8 +1847,6 @@ class AnalysisDriver { ), ], ); - return AnalysisResult.errors( - 'missing', errorsResult, AnalysisDriverUnitIndexBuilder()); } void _onNewFile(FileState file) { @@ -1908,6 +1860,24 @@ class AnalysisDriver { } } + Future _produceErrors(String path) async { + final file = _fsState.getFileForPath(path); + + // Prepare the library - the file itself, or the known library. + final kind = file.kind; + final library = kind.library ?? kind.asLibrary; + + // Don't produce errors if the signature is the same. + final signature = _getResolvedUnitSignature(library, file); + if (_lastProducedSignatures[path] == signature) { + _fileTracker.fileWasAnalyzed(path); + return; + } + + // Analyze, will produce a result into the stream. + await _analyzeFile(path); + } + void _removePotentiallyAffectedLibraries( Set accumulatedAffected, String path, @@ -1932,15 +1902,8 @@ class AnalysisDriver { ); } - void _reportException(String path, Object exception, StackTrace stackTrace) { - String? contextKey; - if (exception is _ExceptionState) { - var state = exception; - exception = exception.exception; - stackTrace = state.stackTrace; - contextKey = state.contextKey; - } - + void _reportException(String path, Object exception, StackTrace stackTrace, + String? contextKey) { CaughtException caught = CaughtException(exception, stackTrace); var fileContentMap = {}; @@ -2339,53 +2302,6 @@ class AnalysisDriverTestView { } } -/// The result of analyzing of a single file. -/// -/// These results are self-consistent, i.e. the file content, line info, the -/// resolved unit correspond to each other. All referenced elements, even -/// external ones, are also self-consistent. But none of the results is -/// guaranteed to be consistent with the state of the files. -/// -/// Every result is independent, and is not guaranteed to be consistent with -/// any previously returned result, even inside of the same library. -class AnalysisResult { - /// The signature of the result based on the content of the file, and the - /// transitive closure of files imported and exported by the library of - /// the requested file. - final String _signature; - - final bool isUnchangedErrors; - - /// Is not `null` if this result is a result with errors. - /// Otherwise is `null`, and usually [unitResult] is set. - final ErrorsResultImpl? errorsResult; - - /// Is not `null` if this result is a result with a resolved unit. - /// Otherwise is `null`, and usually [errorsResult] is set. - final ResolvedUnitResultImpl? unitResult; - - /// The index of the unit. - final AnalysisDriverUnitIndex? _index; - - AnalysisResult.errors( - this._signature, this.errorsResult, AnalysisDriverUnitIndex index) - : isUnchangedErrors = false, - unitResult = null, - _index = index; - - AnalysisResult.unchangedErrors(this._signature) - : isUnchangedErrors = true, - errorsResult = null, - unitResult = null, - _index = null; - - AnalysisResult.unit( - this._signature, this.unitResult, AnalysisDriverUnitIndex index) - : isUnchangedErrors = false, - errorsResult = null, - _index = index; -} - /// An object that watches for the creation and removal of analysis drivers. /// /// Clients may not extend, implement or mix-in this class. @@ -2619,21 +2535,6 @@ class _DiscoverAvailableFilesTask { } } -/// Information about an exception and its context. -class _ExceptionState { - final Object exception; - final StackTrace stackTrace; - - /// The key under which the context of the exception was stored, or `null` - /// if unknown, the maximum number of context to store was reached, etc. - final String? contextKey; - - _ExceptionState(this.exception, this.stackTrace, this.contextKey); - - @override - String toString() => '$exception\n$stackTrace'; -} - class _FileChange { final String path; final _FileChangeKind kind; @@ -2770,3 +2671,14 @@ class _ResolveForCompletionRequest { required this.performance, }); } + +extension on Map>> { + void completeAll(K key, V value) { + final completers = remove(key); + if (completers != null) { + for (final completer in completers) { + completer.complete(value); + } + } + } +} diff --git a/pkg/analyzer/lib/src/dart/analysis/driver_event.dart b/pkg/analyzer/lib/src/dart/analysis/driver_event.dart index d0c90aea027..b713c864bc1 100644 --- a/pkg/analyzer/lib/src/dart/analysis/driver_event.dart +++ b/pkg/analyzer/lib/src/dart/analysis/driver_event.dart @@ -8,20 +8,22 @@ import 'package:analyzer/src/dart/analysis/file_state.dart'; /// An event that happened inside the [AnalysisDriver]. sealed class AnalysisDriverEvent {} -final class ComputeAnalysis extends AnalysisDriverEvent { +final class AnalyzeFile extends AnalysisDriverEvent { final FileState file; final LibraryFileKind library; - ComputeAnalysis({ + AnalyzeFile({ required this.file, required this.library, }); } -final class ComputeResolvedLibrary extends AnalysisDriverEvent { +final class GetErrorsFromBytes extends AnalysisDriverEvent { + final FileState file; final LibraryFileKind library; - ComputeResolvedLibrary({ + GetErrorsFromBytes({ + required this.file, required this.library, }); } diff --git a/pkg/analyzer/test/src/dart/analysis/driver_caching_test.dart b/pkg/analyzer/test/src/dart/analysis/driver_caching_test.dart index 8ef6b846207..5747ad26a24 100644 --- a/pkg/analyzer/test/src/dart/analysis/driver_caching_test.dart +++ b/pkg/analyzer/test/src/dart/analysis/driver_caching_test.dart @@ -449,7 +449,7 @@ void f(MacroA a) {} var analysisDriver = driverFor(a); var userErrors = analysisDriver.results - .whereType() + .whereType() .where((event) => event.path == user.path); // We get errors when the file is added. @@ -507,7 +507,7 @@ void f(MacroA a) {} var analysisDriver = driverFor(a); var userErrors = analysisDriver.results - .whereType() + .whereType() .where((event) => event.path == user.path); // We get errors when the file is added. @@ -546,7 +546,7 @@ void f(MacroA a) {} var analysisDriver = driverFor(user); var userErrors = analysisDriver.results - .whereType() + .whereType() .where((event) => event.path == user.path); // We get errors when the file is added. diff --git a/pkg/analyzer/test/src/dart/analysis/driver_test.dart b/pkg/analyzer/test/src/dart/analysis/driver_test.dart index 5e83170cc39..87eeb88ead7 100644 --- a/pkg/analyzer/test/src/dart/analysis/driver_test.dart +++ b/pkg/analyzer/test/src/dart/analysis/driver_test.dart @@ -19,6 +19,7 @@ import 'package:analyzer/src/error/codes.dart'; import 'package:analyzer/src/generated/engine.dart' show AnalysisOptionsImpl; import 'package:analyzer/src/generated/source.dart' show DartUriResolver, SourceFactory; +import 'package:analyzer/src/summary/idl.dart'; import 'package:analyzer/src/test_utilities/mock_sdk.dart'; import 'package:analyzer/src/test_utilities/resource_provider_mixin.dart'; import 'package:linter/src/rules.dart'; @@ -163,19 +164,25 @@ class AnalysisDriver_PubPackageTest extends PubPackageResolutionTest { driver.addFile2(b); driver.addFile2(a); - // The results are reported in the order of adding. + // The files are analyzed in the order of adding. await assertEventsText(collector, r''' [status] analyzing +[operation] AnalyzeFile + file: /home/test/lib/b.dart + library: /home/test/lib/b.dart [stream] - ErrorsResult #0 + ResolvedUnitResult #0 path: /home/test/lib/b.dart uri: package:test/b.dart - flags: isLibrary + flags: exists isLibrary +[operation] AnalyzeFile + file: /home/test/lib/a.dart + library: /home/test/lib/a.dart [stream] - ErrorsResult #1 + ResolvedUnitResult #1 path: /home/test/lib/a.dart uri: package:test/a.dart - flags: isLibrary + flags: exists isLibrary [status] idle '''); } @@ -196,16 +203,22 @@ import 'a.dart'; // Initial analysis, `b` does not use `a`, so there is a hint. await assertEventsText(collector, r''' [status] analyzing +[operation] AnalyzeFile + file: /home/test/lib/a.dart + library: /home/test/lib/a.dart [stream] - ErrorsResult #0 + ResolvedUnitResult #0 path: /home/test/lib/a.dart uri: package:test/a.dart - flags: isLibrary + flags: exists isLibrary +[operation] AnalyzeFile + file: /home/test/lib/b.dart + library: /home/test/lib/b.dart [stream] - ErrorsResult #1 + ResolvedUnitResult #1 path: /home/test/lib/b.dart uri: package:test/b.dart - flags: isLibrary + flags: exists isLibrary errors 7 +8 UNUSED_IMPORT [status] idle @@ -226,11 +239,14 @@ void f() { // `b` was analyzed, no more hints. await assertEventsText(collector, r''' [status] analyzing +[operation] AnalyzeFile + file: /home/test/lib/b.dart + library: /home/test/lib/b.dart [stream] - ErrorsResult #2 + ResolvedUnitResult #2 path: /home/test/lib/b.dart uri: package:test/b.dart - flags: isLibrary + flags: exists isLibrary [status] idle '''); } @@ -256,25 +272,33 @@ void f() { driver.priorityFiles2 = [b]; // 1. The priority file is produced first. - // 2. We get full `ResolvedUnitResult`. - // 3. For other files we get only `ErrorsResult`. + // 2. Each analyzed file produces `ResolvedUnitResult`. await assertEventsText(collector, r''' [status] analyzing +[operation] AnalyzeFile + file: /home/test/lib/b.dart + library: /home/test/lib/b.dart [stream] ResolvedUnitResult #0 path: /home/test/lib/b.dart uri: package:test/b.dart flags: exists isLibrary +[operation] AnalyzeFile + file: /home/test/lib/a.dart + library: /home/test/lib/a.dart [stream] - ErrorsResult #1 + ResolvedUnitResult #1 path: /home/test/lib/a.dart uri: package:test/a.dart - flags: isLibrary + flags: exists isLibrary +[operation] AnalyzeFile + file: /home/test/lib/c.dart + library: /home/test/lib/c.dart [stream] - ErrorsResult #2 + ResolvedUnitResult #2 path: /home/test/lib/c.dart uri: package:test/c.dart - flags: isLibrary + flags: exists isLibrary [status] idle '''); } @@ -311,11 +335,14 @@ void f() { // So, only `b` was analyzed. await assertEventsText(collector, r''' [status] analyzing +[operation] AnalyzeFile + file: /home/test/lib/b.dart + library: /home/test/lib/b.dart [stream] - ErrorsResult #0 + ResolvedUnitResult #0 path: /home/test/lib/b.dart uri: package:test/b.dart - flags: isLibrary + flags: exists isLibrary [status] idle '''); } @@ -332,6 +359,9 @@ void f() { collector.getResolvedUnit('A1', a); await assertEventsText(collector, r''' [status] analyzing +[operation] AnalyzeFile + file: /home/test/lib/a.dart + library: /home/test/lib/a.dart [future] getResolvedUnit name: A1 ResolvedUnitResult #0 @@ -374,6 +404,9 @@ void f() { collector.getResolvedUnit('A1', a); await assertEventsText(collector, r''' [status] analyzing +[operation] AnalyzeFile + file: /home/test/lib/a.dart + library: /home/test/lib/a.dart [future] getResolvedUnit name: A1 ResolvedUnitResult #0 @@ -391,6 +424,9 @@ void f() { collector.getResolvedUnit('A2', a); await assertEventsText(collector, r''' [status] analyzing +[operation] AnalyzeFile + file: /home/test/lib/a.dart + library: /home/test/lib/a.dart [future] getResolvedUnit name: A2 ResolvedUnitResult #1 @@ -408,6 +444,9 @@ void f() { collector.getResolvedUnit('A3', a); await assertEventsText(collector, r''' [status] analyzing +[operation] AnalyzeFile + file: /home/test/lib/a.dart + library: /home/test/lib/a.dart [future] getResolvedUnit name: A3 ResolvedUnitResult #2 @@ -416,11 +455,14 @@ void f() { flags: exists isLibrary [stream] ResolvedUnitResult #2 +[operation] AnalyzeFile + file: /home/test/lib/b.dart + library: /home/test/lib/b.dart [stream] - ErrorsResult #3 + ResolvedUnitResult #3 path: /home/test/lib/b.dart uri: package:test/b.dart - flags: isLibrary + flags: exists isLibrary [status] idle '''); @@ -430,6 +472,9 @@ void f() { collector.getResolvedUnit('A4', a); await assertEventsText(collector, r''' [status] analyzing +[operation] AnalyzeFile + file: /home/test/lib/a.dart + library: /home/test/lib/a.dart [future] getResolvedUnit name: A4 ResolvedUnitResult #4 @@ -455,6 +500,9 @@ void f() { collector.getResolvedUnit('A1', a); await assertEventsText(collector, r''' [status] analyzing +[operation] AnalyzeFile + file: /home/test/lib/a.dart + library: /home/test/lib/a.dart [future] getResolvedUnit name: A1 ResolvedUnitResult #0 @@ -480,6 +528,9 @@ void f() { collector.getResolvedUnit('B1', b); await assertEventsText(collector, r''' [status] analyzing +[operation] AnalyzeFile + file: /home/test/lib/b.dart + library: /home/test/lib/b.dart [future] getResolvedUnit name: B1 ResolvedUnitResult #1 @@ -505,6 +556,9 @@ void f() { collector.getResolvedUnit('A3', a); await assertEventsText(collector, r''' [status] analyzing +[operation] AnalyzeFile + file: /home/test/lib/a.dart + library: /home/test/lib/a.dart [future] getResolvedUnit name: A3 ResolvedUnitResult #2 @@ -527,6 +581,9 @@ void f() { collector.getResolvedUnit('A1', a); await assertEventsText(collector, r''' [status] analyzing +[operation] AnalyzeFile + file: /home/test/lib/a.dart + library: /home/test/lib/a.dart [future] getResolvedUnit name: A1 ResolvedUnitResult #0 @@ -542,6 +599,9 @@ void f() { collector.getResolvedUnit('A2', a); await assertEventsText(collector, r''' [status] analyzing +[operation] AnalyzeFile + file: /home/test/lib/a.dart + library: /home/test/lib/a.dart [future] getResolvedUnit name: A2 ResolvedUnitResult #1 @@ -572,6 +632,9 @@ part of 'a.dart'; collector.getResolvedUnit('A1', a); await assertEventsText(collector, r''' [status] analyzing +[operation] AnalyzeFile + file: /home/test/lib/a.dart + library: /home/test/lib/a.dart [future] getResolvedUnit name: A1 ResolvedUnitResult #0 @@ -580,11 +643,16 @@ part of 'a.dart'; flags: exists isLibrary [stream] ResolvedUnitResult #0 +[stream] + ResolvedUnitResult #1 + path: /home/test/lib/b.dart + uri: package:test/b.dart + flags: exists isPart [status] idle '''); // Verify that the results for `a` and `b` are cached. - // Note, no status analyzing. + // Note, operation 'AnalyzeFile'. collector.getResolvedUnit('A2', a); collector.getResolvedUnit('B1', b); await assertEventsText(collector, r''' @@ -594,13 +662,10 @@ part of 'a.dart'; [future] getResolvedUnit name: B1 ResolvedUnitResult #1 - path: /home/test/lib/b.dart - uri: package:test/b.dart - flags: exists isPart '''); // Ask for resolved library. - // Note, no status analyzing. + // Note, operation 'AnalyzeFile'. collector.getResolvedLibrary('L1', a); await assertEventsText(collector, r''' [future] getResolvedLibrary @@ -631,35 +696,40 @@ part of 'a.dart'; collector.getResolvedUnit('B1', b); await assertEventsText(collector, r''' [status] analyzing +[operation] AnalyzeFile + file: /home/test/lib/b.dart + library: /home/test/lib/a.dart +[stream] + ResolvedUnitResult #0 + path: /home/test/lib/a.dart + uri: package:test/a.dart + flags: exists isLibrary [future] getResolvedUnit name: B1 - ResolvedUnitResult #0 + ResolvedUnitResult #1 path: /home/test/lib/b.dart uri: package:test/b.dart flags: exists isPart [stream] - ResolvedUnitResult #0 + ResolvedUnitResult #1 [status] idle '''); // Verify that the results for `a` and `b` are cached. - // Note, no status analyzing. + // Note, operation 'AnalyzeFile'. collector.getResolvedUnit('A1', a); collector.getResolvedUnit('B2', b); await assertEventsText(collector, r''' [future] getResolvedUnit name: A1 - ResolvedUnitResult #1 - path: /home/test/lib/a.dart - uri: package:test/a.dart - flags: exists isLibrary + ResolvedUnitResult #0 [future] getResolvedUnit name: B2 - ResolvedUnitResult #0 + ResolvedUnitResult #1 '''); // Ask for resolved library. - // Note, no status analyzing. + // Note, operation 'AnalyzeFile'. collector.getResolvedLibrary('L1', a); await assertEventsText(collector, r''' [future] getResolvedLibrary @@ -667,8 +737,8 @@ part of 'a.dart'; ResolvedLibraryResult #2 element: package:test/a.dart units - ResolvedUnitResult #1 ResolvedUnitResult #0 + ResolvedUnitResult #1 '''); } @@ -690,35 +760,40 @@ part of 'a.dart'; collector.getResolvedUnit('B1', b); await assertEventsText(collector, r''' [status] analyzing +[operation] AnalyzeFile + file: /home/test/lib/b.dart + library: /home/test/lib/a.dart +[stream] + ResolvedUnitResult #0 + path: /home/test/lib/a.dart + uri: package:test/a.dart + flags: exists isLibrary [future] getResolvedUnit name: B1 - ResolvedUnitResult #0 + ResolvedUnitResult #1 path: /home/test/lib/b.dart uri: package:test/b.dart flags: exists isPart [stream] - ResolvedUnitResult #0 + ResolvedUnitResult #1 [status] idle '''); // Verify that the results for `a` and `b` are cached. - // Note, no status analyzing. + // Note, operation 'AnalyzeFile'. collector.getResolvedUnit('A1', a); collector.getResolvedUnit('B2', b); await assertEventsText(collector, r''' [future] getResolvedUnit name: A1 - ResolvedUnitResult #1 - path: /home/test/lib/a.dart - uri: package:test/a.dart - flags: exists isLibrary + ResolvedUnitResult #0 [future] getResolvedUnit name: B2 - ResolvedUnitResult #0 + ResolvedUnitResult #1 '''); // Ask for resolved library. - // Note, no status analyzing. + // Note, operation 'AnalyzeFile'. collector.getResolvedLibrary('L1', a); await assertEventsText(collector, r''' [future] getResolvedLibrary @@ -726,8 +801,8 @@ part of 'a.dart'; ResolvedLibraryResult #2 element: package:test/a.dart units - ResolvedUnitResult #1 ResolvedUnitResult #0 + ResolvedUnitResult #1 '''); } @@ -756,6 +831,9 @@ var B = 0; // The type of `B` is `int`. await assertEventsText(collector, r''' [status] analyzing +[operation] AnalyzeFile + file: /home/test/lib/a.dart + library: /home/test/lib/a.dart [stream] ResolvedUnitResult #0 path: /home/test/lib/a.dart @@ -779,6 +857,9 @@ var B = 1.2; // The type of `B` is now `double`. await assertEventsText(collector, r''' [status] analyzing +[operation] AnalyzeFile + file: /home/test/lib/a.dart + library: /home/test/lib/a.dart [stream] ResolvedUnitResult #1 path: /home/test/lib/a.dart @@ -813,11 +894,14 @@ import 'a.dart'; // `b` is analyzed, has an error. await assertEventsText(collector, r''' [status] analyzing +[operation] AnalyzeFile + file: /home/test/lib/b.dart + library: /home/test/lib/b.dart [stream] - ErrorsResult #0 + ResolvedUnitResult #0 path: /home/test/lib/b.dart uri: package:test/b.dart - flags: isLibrary + flags: exists isLibrary errors 31 +8 URI_DOES_NOT_EXIST [status] idle @@ -831,16 +915,22 @@ import 'a.dart'; // No errors anymore. await assertEventsText(collector, r''' [status] analyzing +[operation] AnalyzeFile + file: /home/test/lib/a.dart + library: /home/test/lib/a.dart [stream] - ErrorsResult #1 + ResolvedUnitResult #1 path: /home/test/lib/a.dart uri: package:test/a.dart - flags: isLibrary + flags: exists isLibrary +[operation] AnalyzeFile + file: /home/test/lib/b.dart + library: /home/test/lib/b.dart [stream] - ErrorsResult #2 + ResolvedUnitResult #2 path: /home/test/lib/b.dart uri: package:test/b.dart - flags: isLibrary + flags: exists isLibrary [status] idle '''); } @@ -857,11 +947,14 @@ import 'a.dart'; // Nothing interesting, "a" is analyzed. await assertEventsText(collector, r''' [status] analyzing +[operation] AnalyzeFile + file: /home/test/lib/a.dart + library: /home/test/lib/a.dart [stream] - ErrorsResult #0 + ResolvedUnitResult #0 path: /home/test/lib/a.dart uri: package:test/a.dart - flags: isLibrary + flags: exists isLibrary [status] idle '''); @@ -1064,6 +1157,9 @@ final B1 = A1; // We have results for both "a" and "b". await assertEventsText(collector, r''' [status] analyzing +[operation] AnalyzeFile + file: /home/test/lib/a.dart + library: /home/test/lib/a.dart [stream] ResolvedUnitResult #0 path: /home/test/lib/a.dart @@ -1072,6 +1168,9 @@ final B1 = A1; selectedVariableTypes A1: int A2: int +[operation] AnalyzeFile + file: /home/test/lib/b.dart + library: /home/test/lib/b.dart [stream] ResolvedUnitResult #1 path: /home/test/lib/b.dart @@ -1094,6 +1193,9 @@ final A2 = B1; // The results are consistent. await assertEventsText(collector, r''' [status] analyzing +[operation] AnalyzeFile + file: /home/test/lib/a.dart + library: /home/test/lib/a.dart [stream] ResolvedUnitResult #2 path: /home/test/lib/a.dart @@ -1102,6 +1204,9 @@ final A2 = B1; selectedVariableTypes A1: double A2: double +[operation] AnalyzeFile + file: /home/test/lib/b.dart + library: /home/test/lib/b.dart [stream] ResolvedUnitResult #3 path: /home/test/lib/b.dart @@ -1137,6 +1242,9 @@ final A2 = B1; // Initial analysis. await assertEventsText(collector, r''' [status] analyzing +[operation] AnalyzeFile + file: /home/test/lib/a.dart + library: /home/test/lib/a.dart [stream] ResolvedUnitResult #0 path: /home/test/lib/a.dart @@ -1158,6 +1266,9 @@ final A2 = B1; driver.changeFile2(a); await assertEventsText(collector, r''' [status] analyzing +[operation] AnalyzeFile + file: /home/test/lib/a.dart + library: /home/test/lib/a.dart [stream] ResolvedUnitResult #1 path: /home/test/lib/a.dart @@ -1247,7 +1358,7 @@ final v = 2; final collector = DriverEventCollector(driver); // Not cached. - // Note, no status analyzing. + // Note, operation 'AnalyzeFile'. collector.getCachedResolvedUnit('A1', a); await assertEventsText(collector, r''' [future] getCachedResolvedUnit @@ -1259,6 +1370,9 @@ final v = 2; collector.getResolvedUnit('A2', a); await assertEventsText(collector, r''' [status] analyzing +[operation] AnalyzeFile + file: /home/test/lib/a.dart + library: /home/test/lib/a.dart [future] getResolvedUnit name: A2 ResolvedUnitResult #0 @@ -1271,7 +1385,7 @@ final v = 2; '''); // Has cached. - // Note, no status analyzing. + // Note, operation 'AnalyzeFile'. collector.getCachedResolvedUnit('A3', a); await assertEventsText(collector, r''' [future] getCachedResolvedUnit @@ -1290,6 +1404,9 @@ var v = 0 collector.getErrors('A1', a); await assertEventsText(collector, r''' +[operation] AnalyzeFile + file: /home/test/lib/a.dart + library: /home/test/lib/a.dart [future] getErrors name: A1 ErrorsResult #0 @@ -1298,6 +1415,74 @@ var v = 0 flags: isLibrary errors 8 +1 EXPECTED_TOKEN +[stream] + ResolvedUnitResult #1 + path: /home/test/lib/a.dart + uri: package:test/a.dart + flags: exists isLibrary + errors + 8 +1 EXPECTED_TOKEN +'''); + + // The result is produced from bytes. + collector.getErrors('A2', a); + await assertEventsText(collector, r''' +[operation] GetErrorsFromBytes + file: /home/test/lib/a.dart + library: /home/test/lib/a.dart +[future] getErrors + name: A2 + ErrorsResult #2 + path: /home/test/lib/a.dart + uri: package:test/a.dart + flags: isLibrary + errors + 8 +1 EXPECTED_TOKEN +'''); + } + + test_getErrors_library_part() async { + final a = newFile('$testPackageLibPath/a.dart', r''' +part 'b.dart'; +'''); + + final b = newFile('$testPackageLibPath/b.dart', r''' +part of 'a.dart'; +'''); + + final driver = driverFor(testFile); + final collector = DriverEventCollector(driver); + + collector.getErrors('A1', a); + collector.getErrors('B1', b); + + // Note, both `getErrors()` returned during the library analysis. + await assertEventsText(collector, r''' +[operation] AnalyzeFile + file: /home/test/lib/a.dart + library: /home/test/lib/a.dart +[future] getErrors + name: A1 + ErrorsResult #0 + path: /home/test/lib/a.dart + uri: package:test/a.dart + flags: isLibrary +[stream] + ResolvedUnitResult #1 + path: /home/test/lib/a.dart + uri: package:test/a.dart + flags: exists isLibrary +[future] getErrors + name: B1 + ErrorsResult #2 + path: /home/test/lib/a.dart + uri: package:test/a.dart + flags: isLibrary +[stream] + ResolvedUnitResult #3 + path: /home/test/lib/b.dart + uri: package:test/b.dart + flags: exists isPart '''); } @@ -1499,6 +1684,9 @@ void f(A a) {} collector.getResolvedUnit('A1', a); await assertEventsText(collector, r''' [status] analyzing +[operation] AnalyzeFile + file: /home/test/lib/a.dart + library: /home/test/lib/a.dart [future] getResolvedUnit name: A1 ResolvedUnitResult #0 @@ -1525,6 +1713,9 @@ void f(A a) {} collector.getResolvedUnit('B1', b); await assertEventsText(collector, r''' [status] analyzing +[operation] AnalyzeFile + file: /home/test/lib/b.dart + library: /home/test/lib/b.dart [future] getResolvedUnit name: B1 ResolvedUnitResult #1 @@ -1552,6 +1743,9 @@ void f(A a) {} collector.getResolvedUnit('B2', b); await assertEventsText(collector, r''' [status] analyzing +[operation] AnalyzeFile + file: /home/test/lib/b.dart + library: /home/test/lib/b.dart [future] getResolvedUnit name: B2 ResolvedUnitResult #2 @@ -1589,7 +1783,7 @@ void f(A a) {} } test_getIndex() async { - newFile(testFile.path, r''' + final a = newFile('$testPackageLibPath/a.dart', r''' void foo() {} void f() { @@ -1598,16 +1792,30 @@ void f() { '''); final driver = driverFor(testFile); - driver.addFile2(testFile); + final collector = DriverEventCollector(driver); - final index = await driver.getIndex2(testFile); - index!; + unawaited(collector.getIndex('A1', a).then((index) { + index!; - final unitId = index.strings.indexOf('package:test/test.dart'); - expect(unitId, isNonNegative); + final unitId = index.strings.indexOf('package:test/a.dart'); + expect(unitId, isNonNegative); - final fooId = index.strings.indexOf('foo'); - expect(fooId, isNonNegative); + final fooId = index.strings.indexOf('foo'); + expect(fooId, isNonNegative); + })); + + await assertEventsText(collector, r''' +[operation] AnalyzeFile + file: /home/test/lib/a.dart + library: /home/test/lib/a.dart +[future] getIndex + name: A1 +[stream] + ResolvedUnitResult #0 + path: /home/test/lib/a.dart + uri: package:test/a.dart + flags: exists isLibrary +'''); } test_getIndex_notAbsolutePath() async { @@ -1811,24 +2019,22 @@ class A {} final driver = driverFor(testFile); final collector = DriverEventCollector(driver); - configuration.libraryConfiguration.unitConfiguration.withContentPredicate = - (_) => true; - - collector.getResolvedLibrary('X', a); + collector.getResolvedLibrary('A1', a); await assertEventsText(collector, r''' +[operation] AnalyzeFile + file: /home/test/lib/a.dart + library: /home/test/lib/a.dart +[stream] + ResolvedUnitResult #0 + path: /home/test/lib/a.dart + uri: package:test/a.dart + flags: exists isLibrary [future] getResolvedLibrary - name: X - ResolvedLibraryResult #0 + name: A1 + ResolvedLibraryResult #1 element: package:test/a.dart units - ResolvedUnitResult #1 - path: /home/test/lib/a.dart - uri: package:test/a.dart - flags: exists isLibrary - content ---- -class A {} ---- + ResolvedUnitResult #0 '''); } @@ -1848,41 +2054,48 @@ part of 'a.dart'; collector.getResolvedLibrary('A1', a); await assertEventsText(collector, r''' +[operation] AnalyzeFile + file: /home/test/lib/a.dart + library: /home/test/lib/a.dart +[stream] + ResolvedUnitResult #0 + path: /home/test/lib/a.dart + uri: package:test/a.dart + flags: exists isLibrary [future] getResolvedLibrary name: A1 - ResolvedLibraryResult #0 + ResolvedLibraryResult #1 element: package:test/a.dart units - ResolvedUnitResult #1 - path: /home/test/lib/a.dart - uri: package:test/a.dart - flags: exists isLibrary + ResolvedUnitResult #0 ResolvedUnitResult #2 path: /home/test/lib/b.dart uri: package:test/b.dart flags: exists isPart +[stream] + ResolvedUnitResult #2 '''); // Ask again, the same cached instance should be returned. - // Note, no status analyzing. + // Note, operation 'AnalyzeFile'. collector.getResolvedLibrary('A2', a); await assertEventsText(collector, r''' [future] getResolvedLibrary name: A2 - ResolvedLibraryResult #0 + ResolvedLibraryResult #1 '''); // Ask `a`, returns cached. - // Note, no status analyzing. + // Note, operation 'AnalyzeFile'. collector.getResolvedUnit('A3', a); await assertEventsText(collector, r''' [future] getResolvedUnit name: A3 - ResolvedUnitResult #1 + ResolvedUnitResult #0 '''); // Ask `b`, returns cached. - // Note, no status analyzing. + // Note, operation 'AnalyzeFile'. collector.getResolvedUnit('B1', b); await assertEventsText(collector, r''' [future] getResolvedUnit @@ -1941,15 +2154,20 @@ part of 'b.dart'; collector.getResolvedLibraryByUri('A1', uri); await assertEventsText(collector, r''' +[operation] AnalyzeFile + file: /home/test/lib/a.dart + library: /home/test/lib/a.dart +[stream] + ResolvedUnitResult #0 + path: /home/test/lib/a.dart + uri: package:test/a.dart + flags: exists isLibrary [future] getResolvedLibraryByUri name: A1 - ResolvedLibraryResult #0 + ResolvedLibraryResult #1 element: package:test/a.dart units - ResolvedUnitResult #1 - path: /home/test/lib/a.dart - uri: package:test/a.dart - flags: exists isLibrary + ResolvedUnitResult #0 '''); } @@ -1980,24 +2198,15 @@ part of 'a.dart'; final collector = DriverEventCollector(driver); collector.getResolvedUnit('A1', a); - collector.getResolvedUnit('B2', b); + collector.getResolvedUnit('B1', b); final uri = Uri.parse('package:test/a.dart'); collector.getResolvedLibraryByUri('A2', uri); - configuration.withOperations = true; - - // Note, that the `get` events are reported before `stream` events. - // TODO(scheglov): The current state is not optimal. - // We resolve `a.dart` separately as `analysisId: 0`. - // And then again `b.dart` as `analysisId: 1`. - // But actually we always resolve the whole library `a.dart`. - // So, we resolved it twice. - // Even worse, for `getResolvedLibraryByUri` we resolve it again. - // Theoretically we could have just one resolution overall. + // Note, the library is resolved only once. await assertEventsText(collector, r''' [status] analyzing -[operation] computeAnalysisResult +[operation] AnalyzeFile file: /home/test/lib/a.dart library: /home/test/lib/a.dart [future] getResolvedUnit @@ -2008,33 +2217,22 @@ part of 'a.dart'; flags: exists isLibrary [stream] ResolvedUnitResult #0 -[operation] computeAnalysisResult - file: /home/test/lib/b.dart - library: /home/test/lib/a.dart [future] getResolvedUnit - name: B2 + name: B1 ResolvedUnitResult #1 path: /home/test/lib/b.dart uri: package:test/b.dart flags: exists isPart -[stream] - ResolvedUnitResult #1 -[status] idle -[operation] computeResolvedLibrary - library: /home/test/lib/a.dart [future] getResolvedLibraryByUri name: A2 ResolvedLibraryResult #2 element: package:test/a.dart units - ResolvedUnitResult #3 - path: /home/test/lib/a.dart - uri: package:test/a.dart - flags: exists isLibrary - ResolvedUnitResult #4 - path: /home/test/lib/b.dart - uri: package:test/b.dart - flags: exists isPart + ResolvedUnitResult #0 + ResolvedUnitResult #1 +[stream] + ResolvedUnitResult #1 +[status] idle '''); } @@ -2113,6 +2311,9 @@ part of 'b.dart'; collector.getResolvedUnit('A1', a); await assertEventsText(collector, r''' [status] analyzing +[operation] AnalyzeFile + file: /home/test/lib/a.dart + library: /home/test/lib/a.dart [future] getResolvedUnit name: A1 ResolvedUnitResult #0 @@ -2125,6 +2326,74 @@ part of 'b.dart'; '''); } + test_getResolvedUnit_added() async { + final a = newFile('$testPackageLibPath/a.dart', ''); + + final driver = driverFor(testFile); + final collector = DriverEventCollector(driver); + + driver.addFile2(a); + collector.getResolvedUnit('A1', a); + + // Note, no separate `ErrorsResult`. + await assertEventsText(collector, r''' +[status] analyzing +[operation] AnalyzeFile + file: /home/test/lib/a.dart + library: /home/test/lib/a.dart +[future] getResolvedUnit + name: A1 + ResolvedUnitResult #0 + path: /home/test/lib/a.dart + uri: package:test/a.dart + flags: exists isLibrary +[stream] + ResolvedUnitResult #0 +[status] idle +'''); + } + + test_getResolvedUnit_augmentation_library() async { + final a = newFile('$testPackageLibPath/a.dart', r''' +import augment 'b.dart'; +'''); + + final b = newFile('$testPackageLibPath/b.dart', r''' +library augment 'a.dart'; +'''); + + final driver = driverFor(testFile); + final collector = DriverEventCollector(driver); + + collector.getResolvedUnit('B1', b); + collector.getResolvedUnit('A1', a); + + // Note, the library is resolved only once. + await assertEventsText(collector, r''' +[status] analyzing +[operation] AnalyzeFile + file: /home/test/lib/b.dart + library: /home/test/lib/a.dart +[future] getResolvedUnit + name: A1 + ResolvedUnitResult #0 + path: /home/test/lib/a.dart + uri: package:test/a.dart + flags: exists isLibrary +[stream] + ResolvedUnitResult #0 +[future] getResolvedUnit + name: B1 + ResolvedUnitResult #1 + path: /home/test/lib/b.dart + uri: package:test/b.dart + flags: exists isAugmentation +[stream] + ResolvedUnitResult #1 +[status] idle +'''); + } + test_getResolvedUnit_importLibrary_thenRemoveIt() async { final a = newFile('$testPackageLibPath/a.dart', r''' class A {}'''); @@ -2144,6 +2413,9 @@ class B extends A {} collector.getResolvedUnit('B1', b); await assertEventsText(collector, r''' [status] analyzing +[operation] AnalyzeFile + file: /home/test/lib/b.dart + library: /home/test/lib/b.dart [future] getResolvedUnit name: B1 ResolvedUnitResult #0 @@ -2152,11 +2424,14 @@ class B extends A {} flags: exists isLibrary [stream] ResolvedUnitResult #0 +[operation] AnalyzeFile + file: /home/test/lib/a.dart + library: /home/test/lib/a.dart [stream] - ErrorsResult #1 + ResolvedUnitResult #1 path: /home/test/lib/a.dart uri: package:test/a.dart - flags: isLibrary + flags: exists isLibrary [status] idle '''); @@ -2168,6 +2443,9 @@ class B extends A {} collector.getResolvedUnit('B2', b); await assertEventsText(collector, r''' [status] analyzing +[operation] AnalyzeFile + file: /home/test/lib/b.dart + library: /home/test/lib/b.dart [future] getResolvedUnit name: B2 ResolvedUnitResult #2 @@ -2190,6 +2468,9 @@ class B extends A {} collector.getResolvedUnit('B2', b); await assertEventsText(collector, r''' [status] analyzing +[operation] AnalyzeFile + file: /home/test/lib/b.dart + library: /home/test/lib/b.dart [future] getResolvedUnit name: B2 ResolvedUnitResult #3 @@ -2198,11 +2479,180 @@ class B extends A {} flags: exists isLibrary [stream] ResolvedUnitResult #3 +[operation] AnalyzeFile + file: /home/test/lib/a.dart + library: /home/test/lib/a.dart [stream] - ErrorsResult #4 + ResolvedUnitResult #4 + path: /home/test/lib/a.dart + uri: package:test/a.dart + flags: exists isLibrary +[status] idle +'''); + } + + test_getResolvedUnit_library_added_part() async { + final a = newFile('$testPackageLibPath/a.dart', r''' +part 'b.dart'; +'''); + + final b = newFile('$testPackageLibPath/b.dart', r''' +part of 'a.dart'; +'''); + + final driver = driverFor(testFile); + final collector = DriverEventCollector(driver); + + driver.addFile2(a); + driver.addFile2(b); + collector.getResolvedUnit('A1', a); + + // Note, the library is resolved only once. + // Note, no separate `ErrorsResult` for `a` or `b`. + await assertEventsText(collector, r''' +[status] analyzing +[operation] AnalyzeFile + file: /home/test/lib/a.dart + library: /home/test/lib/a.dart +[future] getResolvedUnit + name: A1 + ResolvedUnitResult #0 + path: /home/test/lib/a.dart + uri: package:test/a.dart + flags: exists isLibrary +[stream] + ResolvedUnitResult #0 +[stream] + ResolvedUnitResult #1 + path: /home/test/lib/b.dart + uri: package:test/b.dart + flags: exists isPart +[status] idle +'''); + } + + test_getResolvedUnit_library_augmentation() async { + final a = newFile('$testPackageLibPath/a.dart', r''' +import augment 'b.dart'; +'''); + + final b = newFile('$testPackageLibPath/b.dart', r''' +library augment 'a.dart'; +'''); + + final driver = driverFor(testFile); + final collector = DriverEventCollector(driver); + + collector.getResolvedUnit('A1', a); + collector.getResolvedUnit('B1', b); + + // Note, the library is resolved only once. + await assertEventsText(collector, r''' +[status] analyzing +[operation] AnalyzeFile + file: /home/test/lib/a.dart + library: /home/test/lib/a.dart +[future] getResolvedUnit + name: A1 + ResolvedUnitResult #0 + path: /home/test/lib/a.dart + uri: package:test/a.dart + flags: exists isLibrary +[stream] + ResolvedUnitResult #0 +[future] getResolvedUnit + name: B1 + ResolvedUnitResult #1 + path: /home/test/lib/b.dart + uri: package:test/b.dart + flags: exists isAugmentation +[stream] + ResolvedUnitResult #1 +[status] idle +'''); + } + + test_getResolvedUnit_library_part() async { + final a = newFile('$testPackageLibPath/a.dart', r''' +part 'b.dart'; +'''); + + final b = newFile('$testPackageLibPath/b.dart', r''' +part of 'a.dart'; +'''); + + final driver = driverFor(testFile); + final collector = DriverEventCollector(driver); + + collector.getResolvedUnit('A1', a); + collector.getResolvedUnit('B1', b); + + // Note, the library is resolved only once. + await assertEventsText(collector, r''' +[status] analyzing +[operation] AnalyzeFile + file: /home/test/lib/a.dart + library: /home/test/lib/a.dart +[future] getResolvedUnit + name: A1 + ResolvedUnitResult #0 + path: /home/test/lib/a.dart + uri: package:test/a.dart + flags: exists isLibrary +[stream] + ResolvedUnitResult #0 +[future] getResolvedUnit + name: B1 + ResolvedUnitResult #1 + path: /home/test/lib/b.dart + uri: package:test/b.dart + flags: exists isPart +[stream] + ResolvedUnitResult #1 +[status] idle +'''); + } + + test_getResolvedUnit_library_pending_getErrors_part() async { + final a = newFile('$testPackageLibPath/a.dart', r''' +part 'b.dart'; +'''); + + final b = newFile('$testPackageLibPath/b.dart', r''' +part of 'a.dart'; +'''); + + final driver = driverFor(testFile); + final collector = DriverEventCollector(driver); + + collector.getErrors('B1', b); + collector.getResolvedUnit('A1', a); + + // Note, the library is resolved only once. + await assertEventsText(collector, r''' +[status] analyzing +[operation] AnalyzeFile + file: /home/test/lib/a.dart + library: /home/test/lib/a.dart +[future] getResolvedUnit + name: A1 + ResolvedUnitResult #0 + path: /home/test/lib/a.dart + uri: package:test/a.dart + flags: exists isLibrary +[stream] + ResolvedUnitResult #0 +[future] getErrors + name: B1 + ErrorsResult #1 path: /home/test/lib/a.dart uri: package:test/a.dart flags: isLibrary +[stream] + ResolvedUnitResult #2 + path: /home/test/lib/b.dart + uri: package:test/b.dart + flags: exists isPart [status] idle '''); } @@ -2227,6 +2677,9 @@ final foo = 0; collector.getResolvedUnit('A1', a); await assertEventsText(collector, r''' [status] analyzing +[operation] AnalyzeFile + file: /home/test/lib/a.txt + library: /home/test/lib/a.txt [future] getResolvedUnit name: A1 ResolvedUnitResult #0 @@ -2311,6 +2764,186 @@ part 'a.dart'; ]); } + test_getResolvedUnit_part_library() async { + final a = newFile('$testPackageLibPath/a.dart', r''' +part 'b.dart'; +'''); + + final b = newFile('$testPackageLibPath/b.dart', r''' +part of 'a.dart'; +'''); + + final driver = driverFor(testFile); + final collector = DriverEventCollector(driver); + + collector.getResolvedUnit('B1', b); + collector.getResolvedUnit('A1', a); + + // Note, the library is resolved only once. + await assertEventsText(collector, r''' +[status] analyzing +[operation] AnalyzeFile + file: /home/test/lib/b.dart + library: /home/test/lib/a.dart +[future] getResolvedUnit + name: A1 + ResolvedUnitResult #0 + path: /home/test/lib/a.dart + uri: package:test/a.dart + flags: exists isLibrary +[stream] + ResolvedUnitResult #0 +[future] getResolvedUnit + name: B1 + ResolvedUnitResult #1 + path: /home/test/lib/b.dart + uri: package:test/b.dart + flags: exists isPart +[stream] + ResolvedUnitResult #1 +[status] idle +'''); + } + + test_getResolvedUnit_part_pending_getErrors_library() async { + final a = newFile('$testPackageLibPath/a.dart', r''' +part 'b.dart'; +'''); + + final b = newFile('$testPackageLibPath/b.dart', r''' +part of 'a.dart'; +'''); + + final driver = driverFor(testFile); + final collector = DriverEventCollector(driver); + + collector.getErrors('A1', a); + collector.getResolvedUnit('B1', b); + + // Note, the library is resolved only once. + await assertEventsText(collector, r''' +[status] analyzing +[operation] AnalyzeFile + file: /home/test/lib/b.dart + library: /home/test/lib/a.dart +[future] getErrors + name: A1 + ErrorsResult #0 + path: /home/test/lib/b.dart + uri: package:test/b.dart + flags: isPart +[stream] + ResolvedUnitResult #1 + path: /home/test/lib/a.dart + uri: package:test/a.dart + flags: exists isLibrary +[future] getResolvedUnit + name: B1 + ResolvedUnitResult #2 + path: /home/test/lib/b.dart + uri: package:test/b.dart + flags: exists isPart +[stream] + ResolvedUnitResult #2 +[status] idle +'''); + } + + test_getResolvedUnit_pending_getErrors() async { + final a = newFile('$testPackageLibPath/a.dart', ''); + + final driver = driverFor(testFile); + final collector = DriverEventCollector(driver); + + collector.getResolvedUnit('A1', a); + collector.getErrors('A2', a); + + // Note, the library is resolved only once. + await assertEventsText(collector, r''' +[status] analyzing +[operation] AnalyzeFile + file: /home/test/lib/a.dart + library: /home/test/lib/a.dart +[future] getResolvedUnit + name: A1 + ResolvedUnitResult #0 + path: /home/test/lib/a.dart + uri: package:test/a.dart + flags: exists isLibrary +[future] getErrors + name: A2 + ErrorsResult #1 + path: /home/test/lib/a.dart + uri: package:test/a.dart + flags: isLibrary +[stream] + ResolvedUnitResult #0 +[status] idle +'''); + } + + test_getResolvedUnit_pending_getErrors2() async { + final a = newFile('$testPackageLibPath/a.dart', ''); + + final driver = driverFor(testFile); + final collector = DriverEventCollector(driver); + + collector.getErrors('A1', a); + collector.getResolvedUnit('A2', a); + + // Note, the library is resolved only once. + await assertEventsText(collector, r''' +[status] analyzing +[operation] AnalyzeFile + file: /home/test/lib/a.dart + library: /home/test/lib/a.dart +[future] getResolvedUnit + name: A2 + ResolvedUnitResult #0 + path: /home/test/lib/a.dart + uri: package:test/a.dart + flags: exists isLibrary +[future] getErrors + name: A1 + ErrorsResult #1 + path: /home/test/lib/a.dart + uri: package:test/a.dart + flags: isLibrary +[stream] + ResolvedUnitResult #0 +[status] idle +'''); + } + + test_getResolvedUnit_pending_getIndex() async { + final a = newFile('$testPackageLibPath/a.dart', ''); + + final driver = driverFor(testFile); + final collector = DriverEventCollector(driver); + + unawaited(collector.getIndex('A1', a)); + collector.getResolvedUnit('A2', a); + + // Note, no separate `getIndex` result. + await assertEventsText(collector, r''' +[status] analyzing +[operation] AnalyzeFile + file: /home/test/lib/a.dart + library: /home/test/lib/a.dart +[future] getResolvedUnit + name: A2 + ResolvedUnitResult #0 + path: /home/test/lib/a.dart + uri: package:test/a.dart + flags: exists isLibrary +[future] getIndex + name: A1 +[stream] + ResolvedUnitResult #0 +[status] idle +'''); + } + test_getResolvedUnit_thenRemove() async { final a = newFile('$testPackageLibPath/a.dart', ''); @@ -2326,6 +2959,9 @@ part 'a.dart'; // The future with the result still completes. await assertEventsText(collector, r''' [status] analyzing +[operation] AnalyzeFile + file: /home/test/lib/a.dart + library: /home/test/lib/a.dart [future] getResolvedUnit name: A1 ResolvedUnitResult #0 @@ -2351,6 +2987,9 @@ part 'a.dart'; // Both futures complete. await assertEventsText(collector, r''' [status] analyzing +[operation] AnalyzeFile + file: /home/test/lib/a.dart + library: /home/test/lib/a.dart [future] getResolvedUnit name: A1 ResolvedUnitResult #0 @@ -2402,17 +3041,22 @@ import 'package:test/b.dart'; collector.getResolvedLibrary('A1', a); await assertEventsText(collector, r''' +[operation] AnalyzeFile + file: /home/test/lib/a.dart + library: /home/test/lib/a.dart +[stream] + ResolvedUnitResult #0 + path: /home/test/lib/a.dart + uri: package:test/a.dart + flags: exists isLibrary + errors + 7 +21 URI_DOES_NOT_EXIST [future] getResolvedLibrary name: A1 - ResolvedLibraryResult #0 + ResolvedLibraryResult #1 element: package:test/a.dart units - ResolvedUnitResult #1 - path: /home/test/lib/a.dart - uri: package:test/a.dart - flags: exists isLibrary - errors - 7 +21 URI_DOES_NOT_EXIST + ResolvedUnitResult #0 '''); collector.getUnitElement('A2', a); @@ -2445,7 +3089,6 @@ final B = A; final driver = driverFor(testFile); final collector = DriverEventCollector(driver); - configuration.withOperations = true; configuration.libraryConfiguration.unitConfiguration.variableTypesSelector = (result) { switch (result.uriStr) { @@ -2461,19 +3104,24 @@ final B = A; collector.getResolvedUnit('B1', b); await assertEventsText(collector, r''' [status] analyzing -[operation] computeAnalysisResult +[operation] AnalyzeFile file: /home/test/lib/b.dart library: /home/test/lib/a.dart +[stream] + ResolvedUnitResult #0 + path: /home/test/lib/a.dart + uri: package:test/a.dart + flags: exists isLibrary [future] getResolvedUnit name: B1 - ResolvedUnitResult #0 + ResolvedUnitResult #1 path: /home/test/lib/b.dart uri: package:test/b.dart flags: exists isPart selectedVariableTypes B: int [stream] - ResolvedUnitResult #0 + ResolvedUnitResult #1 [status] idle '''); @@ -2488,19 +3136,24 @@ final A = 1.2; collector.getResolvedUnit('B2', b); await assertEventsText(collector, r''' [status] analyzing -[operation] computeAnalysisResult +[operation] AnalyzeFile file: /home/test/lib/b.dart library: /home/test/lib/a.dart +[stream] + ResolvedUnitResult #2 + path: /home/test/lib/a.dart + uri: package:test/a.dart + flags: exists isLibrary [future] getResolvedUnit name: B2 - ResolvedUnitResult #1 + ResolvedUnitResult #3 path: /home/test/lib/b.dart uri: package:test/b.dart flags: exists isPart selectedVariableTypes B: int [stream] - ResolvedUnitResult #1 + ResolvedUnitResult #3 [status] idle '''); } @@ -2612,6 +3265,9 @@ void f(A a) {} collector.getResolvedUnit('A1', a); await assertEventsText(collector, r''' [status] analyzing +[operation] AnalyzeFile + file: /home/test/lib/a.dart + library: /home/test/lib/a.dart [future] getResolvedUnit name: A1 ResolvedUnitResult #0 @@ -2643,6 +3299,9 @@ class A {} collector.getResolvedUnit('B1', b); await assertEventsText(collector, r''' [status] analyzing +[operation] AnalyzeFile + file: /home/test/lib/b.dart + library: /home/test/lib/b.dart [future] getResolvedUnit name: B1 ResolvedUnitResult #1 @@ -2672,6 +3331,9 @@ CompilationUnit collector.getResolvedUnit('B2', b); await assertEventsText(collector, r''' [status] analyzing +[operation] AnalyzeFile + file: /home/test/lib/b.dart + library: /home/test/lib/b.dart [future] getResolvedUnit name: B2 ResolvedUnitResult #2 @@ -2767,20 +3429,36 @@ final a = A(); // Process `a` so that we know that it's a library for `b`. collector.getErrors('A1', a); await assertEventsText(collector, r''' +[operation] AnalyzeFile + file: /home/test/lib/hidden/a.dart + library: /home/test/lib/hidden/a.dart [future] getErrors name: A1 ErrorsResult #0 path: /home/test/lib/hidden/a.dart uri: package:test/hidden/a.dart flags: isLibrary +[stream] + ResolvedUnitResult #1 + path: /home/test/lib/hidden/a.dart + uri: package:test/hidden/a.dart + flags: exists isLibrary +[stream] + ResolvedUnitResult #2 + path: /home/test/lib/b.dart + uri: package:test/b.dart + flags: exists isPart '''); // `b` does not have errors in the context of `a`. collector.getErrors('B1', b); await assertEventsText(collector, r''' +[operation] GetErrorsFromBytes + file: /home/test/lib/b.dart + library: /home/test/lib/hidden/a.dart [future] getErrors name: B1 - ErrorsResult #1 + ErrorsResult #3 path: /home/test/lib/b.dart uri: package:test/b.dart flags: isPart @@ -2806,32 +3484,30 @@ final a = A(); driver.addFile2(a); driver.addFile2(b); - configuration.withOperations = true; - // Because `a` is added, we know how to analyze `b`. // So, it has no errors. collector.getErrors('B1', b); await assertEventsText(collector, r''' [status] analyzing -[operation] computeAnalysisResult +[operation] AnalyzeFile file: /home/test/lib/b.dart library: /home/test/lib/hidden/a.dart -[future] getErrors - name: B1 - ErrorsResult #0 - path: /home/test/lib/b.dart - uri: package:test/b.dart - flags: isPart [stream] - ErrorsResult #1 + ResolvedUnitResult #0 path: /home/test/lib/hidden/a.dart uri: package:test/hidden/a.dart - flags: isLibrary -[stream] - ErrorsResult #2 + flags: exists isLibrary +[future] getErrors + name: B1 + ErrorsResult #1 path: /home/test/lib/b.dart uri: package:test/b.dart flags: isPart +[stream] + ResolvedUnitResult #2 + path: /home/test/lib/b.dart + uri: package:test/b.dart + flags: exists isPart [status] idle '''); } @@ -2851,22 +3527,30 @@ final a = new A(); final driver = driverFor(testFile); final collector = DriverEventCollector(driver); - configuration.withOperations = true; - // We discover sibling files as libraries. // So, we know that `a` is the library of `b`. // So, no errors. collector.getErrors('B1', b); await assertEventsText(collector, r''' -[operation] computeAnalysisResult +[operation] AnalyzeFile file: /home/test/lib/b.dart library: /home/test/lib/a.dart +[stream] + ResolvedUnitResult #0 + path: /home/test/lib/a.dart + uri: package:test/a.dart + flags: exists isLibrary [future] getErrors name: B1 - ErrorsResult #0 + ErrorsResult #1 path: /home/test/lib/b.dart uri: package:test/b.dart flags: isPart +[stream] + ResolvedUnitResult #2 + path: /home/test/lib/b.dart + uri: package:test/b.dart + flags: exists isPart '''); } @@ -2885,13 +3569,11 @@ final a = new A(); final driver = driverFor(testFile); final collector = DriverEventCollector(driver); - configuration.withOperations = true; - // We don't know that `a` is the library of `b`. // So, we treat it as its own library, has errors. collector.getErrors('B1', b); await assertEventsText(collector, r''' -[operation] computeAnalysisResult +[operation] AnalyzeFile file: /home/test/lib/b.dart library: /home/test/lib/b.dart [future] getErrors @@ -2902,6 +3584,13 @@ final a = new A(); flags: isPart errors 25 +1 CREATION_WITH_NON_TYPE +[stream] + ResolvedUnitResult #1 + path: /home/test/lib/b.dart + uri: package:test/b.dart + flags: exists isPart + errors + 25 +1 CREATION_WITH_NON_TYPE '''); } @@ -2924,6 +3613,9 @@ final a = new A(); collector.getResolvedUnit('A1', a); await assertEventsText(collector, r''' [status] analyzing +[operation] AnalyzeFile + file: /home/test/lib/hidden/a.dart + library: /home/test/lib/hidden/a.dart [future] getResolvedUnit name: A1 ResolvedUnitResult #0 @@ -2932,26 +3624,34 @@ final a = new A(); flags: exists isLibrary [stream] ResolvedUnitResult #0 +[stream] + ResolvedUnitResult #1 + path: /home/test/lib/b.dart + uri: package:test/b.dart + flags: exists isPart [status] idle '''); - configuration.withOperations = true; - // We know that `b` is analyzed as part of `a`. collector.getResolvedUnit('B1', b); await assertEventsText(collector, r''' [status] analyzing -[operation] computeAnalysisResult +[operation] AnalyzeFile file: /home/test/lib/b.dart library: /home/test/lib/hidden/a.dart +[stream] + ResolvedUnitResult #2 + path: /home/test/lib/hidden/a.dart + uri: package:test/hidden/a.dart + flags: exists isLibrary [future] getResolvedUnit name: B1 - ResolvedUnitResult #1 + ResolvedUnitResult #3 path: /home/test/lib/b.dart uri: package:test/b.dart flags: exists isPart [stream] - ResolvedUnitResult #1 + ResolvedUnitResult #3 [status] idle '''); } @@ -2975,28 +3675,26 @@ final a = new A(); driver.addFile2(a); driver.addFile2(b); - configuration.withOperations = true; - // Because `a` is added, we know how to analyze `b`. collector.getResolvedUnit('B1', b); await assertEventsText(collector, r''' [status] analyzing -[operation] computeAnalysisResult +[operation] AnalyzeFile file: /home/test/lib/b.dart library: /home/test/lib/hidden/a.dart +[stream] + ResolvedUnitResult #0 + path: /home/test/lib/hidden/a.dart + uri: package:test/hidden/a.dart + flags: exists isLibrary [future] getResolvedUnit name: B1 - ResolvedUnitResult #0 + ResolvedUnitResult #1 path: /home/test/lib/b.dart uri: package:test/b.dart flags: exists isPart [stream] - ResolvedUnitResult #0 -[stream] - ErrorsResult #1 - path: /home/test/lib/hidden/a.dart - uri: package:test/hidden/a.dart - flags: isLibrary + ResolvedUnitResult #1 [status] idle '''); } @@ -3016,14 +3714,12 @@ final a = new A(); final driver = driverFor(testFile); final collector = DriverEventCollector(driver); - configuration.withOperations = true; - // We don't know that `a` is the library of `b`. // So, we treat it as its own library. collector.getResolvedUnit('B1', b); await assertEventsText(collector, r''' [status] analyzing -[operation] computeAnalysisResult +[operation] AnalyzeFile file: /home/test/lib/b.dart library: /home/test/lib/b.dart [future] getResolvedUnit @@ -3054,11 +3750,14 @@ part 'b.dart'; // Analyze the library without the part. await assertEventsText(collector, r''' [status] analyzing +[operation] AnalyzeFile + file: /home/test/lib/a.dart + library: /home/test/lib/a.dart [stream] - ErrorsResult #0 + ResolvedUnitResult #0 path: /home/test/lib/a.dart uri: package:test/a.dart - flags: isLibrary + flags: exists isLibrary errors 26 +8 URI_DOES_NOT_EXIST 7 +12 UNUSED_IMPORT @@ -3078,19 +3777,22 @@ Future? f; collector.getResolvedUnit('B1', b); await assertEventsText(collector, r''' [status] analyzing +[operation] AnalyzeFile + file: /home/test/lib/b.dart + library: /home/test/lib/a.dart +[stream] + ResolvedUnitResult #1 + path: /home/test/lib/a.dart + uri: package:test/a.dart + flags: exists isLibrary [future] getResolvedUnit name: B1 - ResolvedUnitResult #1 + ResolvedUnitResult #2 path: /home/test/lib/b.dart uri: package:test/b.dart flags: exists isPart [stream] - ResolvedUnitResult #1 -[stream] - ErrorsResult #2 - path: /home/test/lib/a.dart - uri: package:test/a.dart - flags: isLibrary + ResolvedUnitResult #2 [status] idle '''); } @@ -3111,13 +3813,11 @@ final a = new A(); // Discover the library. driver.getFileSync2(a); - configuration.withOperations = true; - // There is no library which `b` is a part of, so `A` is unresolved. collector.getResolvedUnit('B1', b); await assertEventsText(collector, r''' [status] analyzing -[operation] computeAnalysisResult +[operation] AnalyzeFile file: /home/test/lib/b.dart library: /home/test/lib/b.dart [future] getResolvedUnit @@ -3143,13 +3843,11 @@ var a = new A(); final driver = driverFor(testFile); final collector = DriverEventCollector(driver); - configuration.withOperations = true; - // There is no library which `b` is a part of, so `A` is unresolved. collector.getResolvedUnit('B1', b); await assertEventsText(collector, r''' [status] analyzing -[operation] computeAnalysisResult +[operation] AnalyzeFile file: /home/test/lib/b.dart library: /home/test/lib/b.dart [future] getResolvedUnit @@ -3185,6 +3883,9 @@ final a = new A(); collector.getResolvedUnit('A1', a); await assertEventsText(collector, r''' [status] analyzing +[operation] AnalyzeFile + file: /home/test/lib/hidden/a.dart + library: /home/test/lib/hidden/a.dart [future] getResolvedUnit name: A1 ResolvedUnitResult #0 @@ -3193,6 +3894,11 @@ final a = new A(); flags: exists isLibrary [stream] ResolvedUnitResult #0 +[stream] + ResolvedUnitResult #1 + path: /home/test/lib/b.dart + uri: package:test/b.dart + flags: exists isPart [status] idle '''); @@ -3226,8 +3932,6 @@ final a = new A(); driver.addFile2(a); driver.addFile2(b); - configuration.withOperations = true; - // Because `a` is added, we know how to analyze `b`. collector.getUnitElement('B1', b); await assertEventsText(collector, r''' @@ -3237,19 +3941,19 @@ final a = new A(); uri: package:test/b.dart flags: isPart enclosing: package:test/hidden/a.dart -[operation] computeAnalysisResult +[operation] AnalyzeFile file: /home/test/lib/hidden/a.dart library: /home/test/lib/hidden/a.dart [stream] - ErrorsResult #0 + ResolvedUnitResult #0 path: /home/test/lib/hidden/a.dart uri: package:test/hidden/a.dart - flags: isLibrary + flags: exists isLibrary [stream] - ErrorsResult #1 + ResolvedUnitResult #1 path: /home/test/lib/b.dart uri: package:test/b.dart - flags: isPart + flags: exists isPart [status] idle '''); } @@ -3263,8 +3967,6 @@ final a = new A(); final driver = driverFor(testFile); final collector = DriverEventCollector(driver); - configuration.withOperations = true; - // We don't know the library for `b`. // So, we treat it as its own library. collector.getUnitElement('B1', b); @@ -3299,25 +4001,23 @@ final a = new A(); driver.addFile2(a); driver.addFile2(b); - configuration.withOperations = true; - // We discover all added libraries. // So, we know that `a` is the library of `b`. await assertEventsText(collector, r''' [status] analyzing -[operation] computeAnalysisResult +[operation] AnalyzeFile file: /home/test/lib/hidden/a.dart library: /home/test/lib/hidden/a.dart [stream] - ErrorsResult #0 + ResolvedUnitResult #0 path: /home/test/lib/hidden/a.dart uri: package:test/hidden/a.dart - flags: isLibrary + flags: exists isLibrary [stream] - ErrorsResult #1 + ResolvedUnitResult #1 path: /home/test/lib/b.dart uri: package:test/b.dart - flags: isPart + flags: exists isPart [status] idle '''); } @@ -3344,25 +4044,23 @@ final a = new A(); driver.addFile2(b); driver.addFile2(a); - configuration.withOperations = true; - // We discover all added libraries. // So, we know that `a` is the library of `b`. await assertEventsText(collector, r''' [status] analyzing -[operation] computeAnalysisResult +[operation] AnalyzeFile file: /home/test/lib/b.dart library: /home/test/lib/hidden/a.dart [stream] - ErrorsResult #0 - path: /home/test/lib/b.dart - uri: package:test/b.dart - flags: isPart -[stream] - ErrorsResult #1 + ResolvedUnitResult #0 path: /home/test/lib/hidden/a.dart uri: package:test/hidden/a.dart - flags: isLibrary + flags: exists isLibrary +[stream] + ResolvedUnitResult #1 + path: /home/test/lib/b.dart + uri: package:test/b.dart + flags: exists isPart [status] idle '''); } @@ -3390,25 +4088,23 @@ final a = new A(); driver.addFile2(a); driver.priorityFiles2 = [b]; - configuration.withOperations = true; - // We discover all added libraries. // So, we know that `a` is the library of `b`. await assertEventsText(collector, r''' [status] analyzing -[operation] computeAnalysisResult +[operation] AnalyzeFile file: /home/test/lib/b.dart library: /home/test/lib/hidden/a.dart [stream] ResolvedUnitResult #0 + path: /home/test/lib/hidden/a.dart + uri: package:test/hidden/a.dart + flags: exists isLibrary +[stream] + ResolvedUnitResult #1 path: /home/test/lib/b.dart uri: package:test/b.dart flags: exists isPart -[stream] - ErrorsResult #1 - path: /home/test/lib/hidden/a.dart - uri: package:test/hidden/a.dart - flags: isLibrary [status] idle '''); } @@ -3424,20 +4120,18 @@ final a = new A(); driver.addFile2(b); - configuration.withOperations = true; - // There is no library for `b`. // So, we analyze `b` as its own library. await assertEventsText(collector, r''' [status] analyzing -[operation] computeAnalysisResult +[operation] AnalyzeFile file: /home/test/lib/b.dart library: /home/test/lib/b.dart [stream] - ErrorsResult #0 + ResolvedUnitResult #0 path: /home/test/lib/b.dart uri: package:test/b.dart - flags: isPart + flags: exists isPart errors 25 +1 CREATION_WITH_NON_TYPE [status] idle @@ -3456,13 +4150,11 @@ final a = new A(); driver.addFile2(b); driver.priorityFiles2 = [b]; - configuration.withOperations = true; - // There is no library for `b`. // So, we analyze `b` as its own library. await assertEventsText(collector, r''' [status] analyzing -[operation] computeAnalysisResult +[operation] AnalyzeFile file: /home/test/lib/b.dart library: /home/test/lib/b.dart [stream] @@ -3487,11 +4179,14 @@ final a = new A(); // Initial analysis. await assertEventsText(collector, r''' [status] analyzing +[operation] AnalyzeFile + file: /home/test/lib/a.dart + library: /home/test/lib/a.dart [stream] - ErrorsResult #0 + ResolvedUnitResult #0 path: /home/test/lib/a.dart uri: package:test/a.dart - flags: isLibrary + flags: exists isLibrary [status] idle '''); @@ -3501,11 +4196,14 @@ final a = new A(); // We analyze `a` again. await assertEventsText(collector, r''' [status] analyzing +[operation] AnalyzeFile + file: /home/test/lib/a.dart + library: /home/test/lib/a.dart [stream] - ErrorsResult #1 + ResolvedUnitResult #1 path: /home/test/lib/a.dart uri: package:test/a.dart - flags: isLibrary + flags: exists isLibrary [status] idle '''); } @@ -3546,6 +4244,9 @@ final B = 0; // We have results for both `a` and `b`. await assertEventsText(collector, r''' [status] analyzing +[operation] AnalyzeFile + file: /home/test/lib/a.dart + library: /home/test/lib/a.dart [stream] ResolvedUnitResult #0 path: /home/test/lib/a.dart @@ -3553,6 +4254,9 @@ final B = 0; flags: exists isLibrary selectedVariableTypes A: int +[operation] AnalyzeFile + file: /home/test/lib/b.dart + library: /home/test/lib/b.dart [stream] ResolvedUnitResult #1 path: /home/test/lib/b.dart @@ -3575,6 +4279,9 @@ final B = 1.2; // But the change causes `a` to be reanalyzed. await assertEventsText(collector, r''' [status] analyzing +[operation] AnalyzeFile + file: /home/test/lib/a.dart + library: /home/test/lib/a.dart [stream] ResolvedUnitResult #2 path: /home/test/lib/a.dart @@ -3625,16 +4332,22 @@ final a = new A(); // No errors in `b`. await assertEventsText(collector, r''' [status] analyzing +[operation] AnalyzeFile + file: /home/test/lib/a.dart + library: /home/test/lib/a.dart [stream] - ErrorsResult #0 + ResolvedUnitResult #0 path: /home/test/lib/a.dart uri: package:test/a.dart - flags: isLibrary + flags: exists isLibrary +[operation] AnalyzeFile + file: /home/test/lib/b.dart + library: /home/test/lib/b.dart [stream] - ErrorsResult #1 + ResolvedUnitResult #1 path: /home/test/lib/b.dart uri: package:test/b.dart - flags: isLibrary + flags: exists isLibrary [status] idle '''); @@ -3643,11 +4356,14 @@ final a = new A(); driver.removeFile2(a); await assertEventsText(collector, r''' [status] analyzing +[operation] AnalyzeFile + file: /home/test/lib/b.dart + library: /home/test/lib/b.dart [stream] - ErrorsResult #2 + ResolvedUnitResult #2 path: /home/test/lib/b.dart uri: package:test/b.dart - flags: isLibrary + flags: exists isLibrary errors 7 +8 URI_DOES_NOT_EXIST 31 +1 CREATION_WITH_NON_TYPE @@ -3706,36 +4422,54 @@ class F extends X {} // Note, `f` has an error. await assertEventsText(collector, r''' [status] analyzing +[operation] AnalyzeFile + file: /home/test/lib/a.dart + library: /home/test/lib/a.dart [stream] - ErrorsResult #0 + ResolvedUnitResult #0 path: /home/test/lib/a.dart uri: package:test/a.dart - flags: isLibrary + flags: exists isLibrary +[operation] AnalyzeFile + file: /home/test/lib/b.dart + library: /home/test/lib/b.dart [stream] - ErrorsResult #1 + ResolvedUnitResult #1 path: /home/test/lib/b.dart uri: package:test/b.dart - flags: isLibrary + flags: exists isLibrary +[operation] AnalyzeFile + file: /home/test/lib/c.dart + library: /home/test/lib/c.dart [stream] - ErrorsResult #2 + ResolvedUnitResult #2 path: /home/test/lib/c.dart uri: package:test/c.dart - flags: isLibrary + flags: exists isLibrary +[operation] AnalyzeFile + file: /home/test/lib/d.dart + library: /home/test/lib/d.dart [stream] - ErrorsResult #3 + ResolvedUnitResult #3 path: /home/test/lib/d.dart uri: package:test/d.dart - flags: isLibrary + flags: exists isLibrary +[operation] AnalyzeFile + file: /home/test/lib/e.dart + library: /home/test/lib/e.dart [stream] - ErrorsResult #4 + ResolvedUnitResult #4 path: /home/test/lib/e.dart uri: package:test/e.dart - flags: isLibrary + flags: exists isLibrary +[operation] AnalyzeFile + file: /home/test/lib/f.dart + library: /home/test/lib/f.dart [stream] - ErrorsResult #5 + ResolvedUnitResult #5 path: /home/test/lib/f.dart uri: package:test/f.dart - flags: isLibrary + flags: exists isLibrary errors 57 +1 EXTENDS_NON_CLASS [status] idle @@ -3753,38 +4487,56 @@ class B {} // 4. Then the rest, in order of adding. await assertEventsText(collector, r''' [status] analyzing +[operation] AnalyzeFile + file: /home/test/lib/b.dart + library: /home/test/lib/b.dart [stream] - ErrorsResult #6 + ResolvedUnitResult #6 path: /home/test/lib/b.dart uri: package:test/b.dart - flags: isLibrary + flags: exists isLibrary +[operation] AnalyzeFile + file: /home/test/lib/d.dart + library: /home/test/lib/d.dart [stream] - ErrorsResult #7 + ResolvedUnitResult #7 path: /home/test/lib/d.dart uri: package:test/d.dart - flags: isLibrary + flags: exists isLibrary +[operation] AnalyzeFile + file: /home/test/lib/f.dart + library: /home/test/lib/f.dart [stream] - ErrorsResult #8 + ResolvedUnitResult #8 path: /home/test/lib/f.dart uri: package:test/f.dart - flags: isLibrary + flags: exists isLibrary errors 57 +1 EXTENDS_NON_CLASS +[operation] AnalyzeFile + file: /home/test/lib/a.dart + library: /home/test/lib/a.dart [stream] - ErrorsResult #9 + ResolvedUnitResult #9 path: /home/test/lib/a.dart uri: package:test/a.dart - flags: isLibrary + flags: exists isLibrary +[operation] AnalyzeFile + file: /home/test/lib/c.dart + library: /home/test/lib/c.dart [stream] - ErrorsResult #10 + ResolvedUnitResult #10 path: /home/test/lib/c.dart uri: package:test/c.dart - flags: isLibrary + flags: exists isLibrary +[operation] AnalyzeFile + file: /home/test/lib/e.dart + library: /home/test/lib/e.dart [stream] - ErrorsResult #11 + ResolvedUnitResult #11 path: /home/test/lib/e.dart uri: package:test/e.dart - flags: isLibrary + flags: exists isLibrary [status] idle '''); } @@ -3823,31 +4575,46 @@ import 'b.dart'; // Initial analysis, all files analyzed in order of adding. await assertEventsText(collector, r''' [status] analyzing +[operation] AnalyzeFile + file: /home/test/lib/a.dart + library: /home/test/lib/a.dart [stream] - ErrorsResult #0 + ResolvedUnitResult #0 path: /home/test/lib/a.dart uri: package:test/a.dart - flags: isLibrary + flags: exists isLibrary +[operation] AnalyzeFile + file: /home/test/lib/b.dart + library: /home/test/lib/b.dart [stream] - ErrorsResult #1 + ResolvedUnitResult #1 path: /home/test/lib/b.dart uri: package:test/b.dart - flags: isLibrary + flags: exists isLibrary +[operation] AnalyzeFile + file: /home/test/lib/c.dart + library: /home/test/lib/c.dart [stream] - ErrorsResult #2 + ResolvedUnitResult #2 path: /home/test/lib/c.dart uri: package:test/c.dart - flags: isLibrary + flags: exists isLibrary +[operation] AnalyzeFile + file: /home/test/lib/d.dart + library: /home/test/lib/d.dart [stream] - ErrorsResult #3 + ResolvedUnitResult #3 path: /home/test/lib/d.dart uri: package:test/d.dart - flags: isLibrary + flags: exists isLibrary +[operation] AnalyzeFile + file: /home/test/lib/e.dart + library: /home/test/lib/e.dart [stream] - ErrorsResult #4 + ResolvedUnitResult #4 path: /home/test/lib/e.dart uri: package:test/e.dart - flags: isLibrary + flags: exists isLibrary [status] idle '''); @@ -3865,26 +4632,38 @@ class B2 {} // Then `d` and `e` because they import `a` and `b`. await assertEventsText(collector, r''' [status] analyzing +[operation] AnalyzeFile + file: /home/test/lib/a.dart + library: /home/test/lib/a.dart [stream] - ErrorsResult #5 + ResolvedUnitResult #5 path: /home/test/lib/a.dart uri: package:test/a.dart - flags: isLibrary + flags: exists isLibrary +[operation] AnalyzeFile + file: /home/test/lib/b.dart + library: /home/test/lib/b.dart [stream] - ErrorsResult #6 + ResolvedUnitResult #6 path: /home/test/lib/b.dart uri: package:test/b.dart - flags: isLibrary + flags: exists isLibrary +[operation] AnalyzeFile + file: /home/test/lib/d.dart + library: /home/test/lib/d.dart [stream] - ErrorsResult #7 + ResolvedUnitResult #7 path: /home/test/lib/d.dart uri: package:test/d.dart - flags: isLibrary + flags: exists isLibrary +[operation] AnalyzeFile + file: /home/test/lib/e.dart + library: /home/test/lib/e.dart [stream] - ErrorsResult #8 + ResolvedUnitResult #8 path: /home/test/lib/e.dart uri: package:test/e.dart - flags: isLibrary + flags: exists isLibrary [status] idle '''); } @@ -3904,11 +4683,14 @@ final v = 0; // Initial analysis. await assertEventsText(collector, r''' [status] analyzing +[operation] AnalyzeFile + file: /home/test/lib/a.dart + library: /home/test/lib/a.dart [stream] - ErrorsResult #0 + ResolvedUnitResult #0 path: /home/test/lib/a.dart uri: package:test/a.dart - flags: isLibrary + flags: exists isLibrary [status] idle '''); @@ -3923,11 +4705,14 @@ final v = 0 driver.changeFile2(a); await assertEventsText(collector, r''' [status] analyzing +[operation] AnalyzeFile + file: /home/test/lib/a.dart + library: /home/test/lib/a.dart [stream] - ErrorsResult #1 + ResolvedUnitResult #1 path: /home/test/lib/a.dart uri: package:test/a.dart - flags: isLibrary + flags: exists isLibrary errors 10 +1 EXPECTED_TOKEN [status] idle @@ -3952,16 +4737,22 @@ class B {} // Initial analysis. await assertEventsText(collector, r''' [status] analyzing +[operation] AnalyzeFile + file: /home/test/lib/a.dart + library: /home/test/lib/a.dart [stream] - ErrorsResult #0 + ResolvedUnitResult #0 path: /home/test/lib/a.dart uri: package:test/a.dart - flags: isLibrary + flags: exists isLibrary +[operation] AnalyzeFile + file: /home/test/lib/b.dart + library: /home/test/lib/b.dart [stream] - ErrorsResult #1 + ResolvedUnitResult #1 path: /home/test/lib/b.dart uri: package:test/b.dart - flags: isLibrary + flags: exists isLibrary [status] idle '''); @@ -3974,11 +4765,14 @@ class A2 {} // Only `a` is analyzed, `b` is not affected. await assertEventsText(collector, r''' [status] analyzing +[operation] AnalyzeFile + file: /home/test/lib/a.dart + library: /home/test/lib/a.dart [stream] - ErrorsResult #2 + ResolvedUnitResult #2 path: /home/test/lib/a.dart uri: package:test/a.dart - flags: isLibrary + flags: exists isLibrary [status] idle '''); } @@ -3993,11 +4787,14 @@ class A2 {} await assertEventsText(collector, r''' [status] analyzing +[operation] AnalyzeFile + file: /home/test/lib/a.dart + library: /home/test/lib/a.dart [stream] - ErrorsResult #0 + ResolvedUnitResult #0 path: /home/test/lib/a.dart uri: package:test/a.dart - flags: isLibrary + flags: exists isLibrary [status] idle '''); } @@ -4356,6 +5153,17 @@ class DriverEventCollector { })); } + Future getIndex(String name, File file) async { + final value = await driver.getIndex(file.path); + events.add( + GetIndexEvent( + name: name, + result: value, + ), + ); + return value; + } + void getLibraryByUri(String name, String uriStr) { final future = driver.getLibraryByUri(uriStr); unawaited(future.then((value) { diff --git a/pkg/analyzer/test/src/dart/analysis/result_printer.dart b/pkg/analyzer/test/src/dart/analysis/result_printer.dart index 72336587383..bfb525263ad 100644 --- a/pkg/analyzer/test/src/dart/analysis/result_printer.dart +++ b/pkg/analyzer/test/src/dart/analysis/result_printer.dart @@ -10,6 +10,7 @@ import 'package:analyzer/error/error.dart'; import 'package:analyzer/src/dart/analysis/driver_event.dart' as events; import 'package:analyzer/src/dart/analysis/results.dart'; import 'package:analyzer/src/dart/analysis/status.dart'; +import 'package:analyzer/src/summary/idl.dart'; import 'package:analyzer/src/utilities/extensions/file_system.dart'; import 'package:test/test.dart'; @@ -82,6 +83,8 @@ class DriverEventsPrinter { _writeGetCachedResolvedUnit(event); case GetErrorsEvent(): _writeErrorsEvent(event); + case GetIndexEvent(): + _writeIndexEvent(event); case GetLibraryByUriEvent(): _writeGetLibraryByUriEvent(event); case GetResolvedLibraryEvent(): @@ -158,6 +161,13 @@ class DriverEventsPrinter { }); } + void _writeIndexEvent(GetIndexEvent event) { + sink.writelnWithIndent('[future] getIndex'); + sink.withIndent(() { + sink.writelnWithIndent('name: ${event.name}'); + }); + } + void _writeLibraryElementResult(SomeLibraryElementResult result) { switch (result) { case CannotResolveUriResult(): @@ -208,32 +218,27 @@ class DriverEventsPrinter { void _writeResultStreamEvent(ResultStreamEvent event) { final object = event.object; switch (object) { - case events.ComputeAnalysis(): - if (!configuration.withOperations) { - return; - } - sink.writelnWithIndent('[operation] computeAnalysisResult'); + case events.AnalyzeFile(): + sink.writelnWithIndent('[operation] AnalyzeFile'); sink.withIndent(() { final file = object.file.resource; sink.writelnWithIndent('file: ${file.posixPath}'); final libraryFile = object.library.file.resource; sink.writelnWithIndent('library: ${libraryFile.posixPath}'); }); - case events.ComputeResolvedLibrary(): - if (!configuration.withOperations) { - return; - } - sink.writelnWithIndent('[operation] computeResolvedLibrary'); - sink.withIndent(() { - final fileState = object.library.file; - final file = fileState.resource; - sink.writelnWithIndent('library: ${file.posixPath}'); - }); case ErrorsResult(): sink.writelnWithIndent('[stream]'); sink.withIndent(() { _writeErrorsResult(object); }); + case events.GetErrorsFromBytes(): + sink.writelnWithIndent('[operation] GetErrorsFromBytes'); + sink.withIndent(() { + final file = object.file.resource; + sink.writelnWithIndent('file: ${file.posixPath}'); + final libraryFile = object.library.file.resource; + sink.writelnWithIndent('library: ${libraryFile.posixPath}'); + }); case ResolvedUnitResult(): sink.writelnWithIndent('[stream]'); sink.withIndent(() { @@ -283,7 +288,6 @@ class DriverEventsPrinter { } class DriverEventsPrinterConfiguration { - var withOperations = false; var libraryConfiguration = ResolvedLibraryResultPrinterConfiguration(); var unitElementConfiguration = UnitElementPrinterConfiguration(); } @@ -310,6 +314,17 @@ final class GetErrorsEvent extends DriverEvent { }); } +/// The result of `getIndex`. +final class GetIndexEvent extends DriverEvent { + final String name; + final AnalysisDriverUnitIndex? result; + + GetIndexEvent({ + required this.name, + required this.result, + }); +} + /// The result of `getLibraryByUri`. final class GetLibraryByUriEvent extends DriverEvent { final String name;