Move more AnalysisDriver tests to DriverEventCollector.

Change-Id: I52715322580c36090104f295276cd071733d6e6a
Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/344945
Reviewed-by: Brian Wilkerson <brianwilkerson@google.com>
Commit-Queue: Konstantin Shcheglov <scheglov@google.com>
This commit is contained in:
Konstantin Shcheglov 2024-01-08 17:38:39 +00:00 committed by Commit Queue
parent 5229eabddf
commit b5b4cf872f
9 changed files with 3661 additions and 2201 deletions

View file

@ -503,7 +503,7 @@ class LegacyAnalysisServer extends AnalysisServer {
}
var driver = getAnalysisDriver(path);
return driver?.getCachedResult(path);
return driver?.getCachedResolvedUnit(path);
}
/// Gets the current version number of a document.

View file

@ -722,7 +722,7 @@ class InitializationTest extends AbstractLspAnalysisServerTest {
// analysis root it will not occur.
// https://github.com/dart-lang/sdk/issues/37338
for (var driver in server.driverMap.values) {
expect(driver.getCachedResult(nestedFilePath), isNotNull);
expect(driver.getCachedResolvedUnit(nestedFilePath), isNotNull);
}
// Closing the file should remove it.
@ -1078,7 +1078,7 @@ class InitializationTest extends AbstractLspAnalysisServerTest {
// analysis root it will not occur.
// https://github.com/dart-lang/sdk/issues/37338
for (var driver in server.driverMap.values) {
expect(driver.getCachedResult(nestedFilePath), isNotNull);
expect(driver.getCachedResolvedUnit(nestedFilePath), isNotNull);
}
// Closing the file should remove it.

View file

@ -369,6 +369,10 @@ class AnalysisDriver {
/// not been processed yet, it might be missing.
Set<String> get knownFiles => _fsState.knownFilePaths;
/// See [knownFiles].
Set<File> get knownFiles2 =>
_fsState.knownFiles.map((e) => e.resource).toSet();
/// Return the context in which libraries should be analyzed.
LibraryContext get libraryContext {
return _libraryContext ??= LibraryContext(
@ -720,11 +724,16 @@ class AnalysisDriver {
/// The [path] must be absolute and normalized.
///
/// The [path] can be any file - explicitly or implicitly analyzed, or neither.
ResolvedUnitResult? getCachedResult(String path) {
ResolvedUnitResult? getCachedResolvedUnit(String path) {
_throwIfNotAbsolutePath(path);
return _priorityResults[path];
}
/// See [getCachedResolvedUnit].
ResolvedUnitResult? getCachedResolvedUnit2(File file) {
return _priorityResults[file.path];
}
/// Return a [Future] that completes with the [ErrorsResult] for the Dart
/// file with the given [path].
///
@ -767,6 +776,12 @@ class AnalysisDriver {
return task.completer.future;
}
/// See [getFilesDefiningClassMemberName].
Future<List<File>> getFilesDefiningClassMemberName2(String name) async {
final pathList = await getFilesDefiningClassMemberName(name);
return pathList.map((path) => resourceProvider.getFile(path)).toList();
}
/// Return a [Future] that completes with the list of known files that
/// reference the given external [name].
Future<List<String>> getFilesReferencingName(String name) {
@ -777,6 +792,12 @@ class AnalysisDriver {
return task.completer.future;
}
/// See [getFilesReferencingName].
Future<List<File>> getFilesReferencingName2(String name) async {
final pathList = await getFilesReferencingName(name);
return pathList.map((path) => resourceProvider.getFile(path)).toList();
}
/// Return the [FileResult] for the Dart file with the given [path].
///
/// The [path] must be absolute and normalized.
@ -792,6 +813,11 @@ class AnalysisDriver {
);
}
/// See [getFileSync].
SomeFileResult getFileSync2(File file) {
return getFileSync(file.path);
}
/// Return a [Future] that completes with the [AnalysisDriverUnitIndex] for
/// the file with the given [path], or with `null` if the file cannot be
/// analyzed.
@ -809,6 +835,11 @@ class AnalysisDriver {
return completer.future;
}
/// See [getIndex].
Future<AnalysisDriverUnitIndex?> getIndex2(File file) {
return getIndex(file.path);
}
/// Return a [Future] that completes with [LibraryElementResult] for the given
/// [uri], which is either resynthesized from the provided external summary
/// store, or built for a file to which the given [uri] is resolved.
@ -901,6 +932,11 @@ class AnalysisDriver {
);
}
/// See [getParsedLibrary].
SomeParsedLibraryResult getParsedLibrary2(File file) {
return getParsedLibrary(file.path);
}
/// Return a [ParsedLibraryResult] for the library with the given [uri].
SomeParsedLibraryResult getParsedLibraryByUri(Uri uri) {
var fileOr = _fsState.getFileForUri(uri);
@ -1014,7 +1050,7 @@ class AnalysisDriver {
// Return the cached result.
{
ResolvedUnitResult? result = getCachedResult(path);
ResolvedUnitResult? result = getCachedResolvedUnit(path);
if (result != null) {
if (sendCachedToStream) {
_resultController.add(result);
@ -1036,6 +1072,15 @@ class AnalysisDriver {
return completer.future;
}
/// See [getResolvedUnit].
Future<SomeResolvedUnitResult> getResolvedUnit2(File file,
{bool sendCachedToStream = false}) {
return getResolvedUnit(
file.path,
sendCachedToStream: sendCachedToStream,
);
}
/// Return a [Future] that completes with the [SomeUnitElementResult]
/// for the file with the given [path].
Future<SomeUnitElementResult> getUnitElement(String path) {
@ -1063,6 +1108,11 @@ class AnalysisDriver {
return completer.future;
}
/// See [getUnitElement].
Future<SomeUnitElementResult> getUnitElement2(File file) {
return getUnitElement(file.path);
}
/// Return a [ParsedUnitResult] for the file with the given [path].
///
/// The [path] must be absolute and normalized.
@ -1088,6 +1138,11 @@ class AnalysisDriver {
);
}
/// See [parseFileSync].
SomeParsedUnitResult parseFileSync2(File file) {
return parseFileSync(file.path);
}
/// Perform a single chunk of work and produce [results].
Future<void> performWork() async {
_discoverDartCore();

View file

@ -36,6 +36,10 @@ mixin ResourceProviderMixin {
resourceProvider.deleteFile(convertedPath);
}
void deleteFile2(File file) {
deleteFile(file.path);
}
void deleteFolder(String path) {
String convertedPath = convertPath(path);
resourceProvider.deleteFolder(convertedPath);

File diff suppressed because it is too large Load diff

View file

@ -5,6 +5,7 @@
import 'package:analyzer/dart/analysis/results.dart';
import 'package:analyzer/dart/ast/ast.dart';
import 'package:analyzer/dart/element/element.dart';
import 'package:analyzer/dart/element/type.dart';
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';
@ -41,6 +42,14 @@ class DriverEventsPrinter {
sink.writelnWithIndent('${e.offset} +${e.length} ${e.errorCode.name}');
}
void _writeErrorsEvent(GetErrorsEvent event) {
sink.writelnWithIndent('[future] getErrors');
sink.withIndent(() {
sink.writelnWithIndent('name: ${event.name}');
_writeErrorsResult(event.result);
});
}
void _writeErrorsResult(SomeErrorsResult result) {
switch (result) {
case ErrorsResultImpl():
@ -69,6 +78,10 @@ class DriverEventsPrinter {
void _writeEvent(DriverEvent event) {
switch (event) {
case GetCachedResolvedUnitEvent():
_writeGetCachedResolvedUnit(event);
case GetErrorsEvent():
_writeErrorsEvent(event);
case GetLibraryByUriEvent():
_writeGetLibraryByUriEvent(event);
case GetResolvedLibraryEvent():
@ -77,6 +90,8 @@ class DriverEventsPrinter {
_writeGetResolvedLibraryByUri(event);
case GetResolvedUnitEvent():
_writeGetResolvedUnit(event);
case GetUnitElementEvent():
_writeGetUnitElementEvent(event);
case ResultStreamEvent():
_writeResultStreamEvent(event);
case SchedulerStatusEvent():
@ -86,6 +101,18 @@ class DriverEventsPrinter {
}
}
void _writeGetCachedResolvedUnit(GetCachedResolvedUnitEvent event) {
sink.writelnWithIndent('[future] getCachedResolvedUnit');
sink.withIndent(() {
sink.writelnWithIndent('name: ${event.name}');
if (event.result case final result?) {
_writeResolvedUnitResult(result);
} else {
sink.writelnWithIndent('null');
}
});
}
void _writeGetLibraryByUriEvent(GetLibraryByUriEvent event) {
sink.writelnWithIndent('[future] getLibraryByUri');
sink.withIndent(() {
@ -118,6 +145,19 @@ class DriverEventsPrinter {
});
}
void _writeGetUnitElementEvent(GetUnitElementEvent event) {
sink.writelnWithIndent('[future] getUnitElement');
sink.withIndent(() {
final result = event.result;
switch (result) {
case UnitElementResult():
_writeUnitElementResult(result);
default:
throw UnimplementedError('${result.runtimeType}');
}
});
}
void _writeLibraryElementResult(SomeLibraryElementResult result) {
switch (result) {
case CannotResolveUriResult():
@ -215,11 +255,59 @@ class DriverEventsPrinter {
}
});
}
void _writeUnitElementResult(UnitElementResult result) {
sink.writelnWithIndent('path: ${result.file.posixPath}');
expect(result.path, result.file.path);
sink.writelnWithIndent('uri: ${result.uri}');
sink.writeFlags({
'isAugmentation': result.isAugmentation,
'isLibrary': result.isLibrary,
'isMacroAugmentation': result.isMacroAugmentation,
'isPart': result.isPart,
});
final unitElement = result.element;
elementPrinter.writeNamedElement(
'enclosing',
unitElement.enclosingElement,
);
final elementsToWrite =
configuration.unitElementConfiguration.elementSelector(unitElement);
elementPrinter.writeElementList('selectedElements', elementsToWrite);
}
}
class DriverEventsPrinterConfiguration {
var withOperations = false;
var libraryConfiguration = ResolvedLibraryResultPrinterConfiguration();
var unitElementConfiguration = UnitElementPrinterConfiguration();
}
/// The result of `getCachedResolvedUnit`.
final class GetCachedResolvedUnitEvent extends DriverEvent {
final String name;
final SomeResolvedUnitResult? result;
GetCachedResolvedUnitEvent({
required this.name,
required this.result,
});
}
/// The result of `getErrors`.
final class GetErrorsEvent extends DriverEvent {
final String name;
final SomeErrorsResult result;
GetErrorsEvent({
required this.name,
required this.result,
});
}
/// The result of `getLibraryByUri`.
@ -266,6 +354,17 @@ final class GetResolvedUnitEvent extends DriverEvent {
});
}
/// The result of `getUnitElement`.
final class GetUnitElementEvent extends DriverEvent {
final String name;
final SomeUnitElementResult result;
GetUnitElementEvent({
required this.name,
required this.result,
});
}
class IdProvider {
final Map<Object, String> _map = Map.identity();
@ -303,9 +402,16 @@ class ResolvedLibraryResultPrinter {
}
void _writeResolvedLibraryResult(ResolvedLibraryResult result) {
if (idProvider.existing(result) case final id?) {
sink.writelnWithIndent('ResolvedLibraryResult $id');
return;
}
_libraryElement = result.element;
sink.writelnWithIndent('ResolvedLibraryResult');
final id = idProvider[result];
sink.writelnWithIndent('ResolvedLibraryResult $id');
sink.withIndent(() {
elementPrinter.writeNamedElement('element', result.element);
sink.writeElements('units', result.units, _writeResolvedUnitResult);
@ -403,6 +509,28 @@ class ResolvedUnitResultPrinter {
),
);
}
final typesToWrite = configuration.typesSelector(result);
sink.writeElements(
'selectedTypes',
typesToWrite.entries.toList(),
(entry) {
sink.writeIndent();
sink.write('${entry.key}: ');
elementPrinter.writeType(entry.value);
},
);
final variableTypesToWrite = configuration.variableTypesSelector(result);
sink.writeElements(
'selectedVariableTypes',
variableTypesToWrite,
(variable) {
sink.writeIndent();
sink.write('${variable.name}: ');
elementPrinter.writeType(variable.type);
},
);
});
}
}
@ -410,6 +538,9 @@ class ResolvedUnitResultPrinter {
class ResolvedUnitResultPrinterConfiguration {
var nodeConfiguration = ResolvedNodeTextConfiguration();
AstNode? Function(ResolvedUnitResult) nodeSelector = (_) => null;
Map<String, DartType> Function(ResolvedUnitResult) typesSelector = (_) => {};
List<VariableElement> Function(ResolvedUnitResult) variableTypesSelector =
(_) => [];
bool Function(ResolvedUnitResult) withContentPredicate = (_) => false;
}
@ -427,3 +558,7 @@ final class SchedulerStatusEvent extends DriverEvent {
SchedulerStatusEvent(this.status);
}
class UnitElementPrinterConfiguration {
List<Element> Function(CompilationUnitElement) elementSelector = (_) => [];
}

View file

@ -317,14 +317,14 @@ class A {}
return unitResult.isAugmentation;
};
}, r'''
ResolvedLibraryResult
ResolvedLibraryResult #0
element: package:test/test.dart
units
ResolvedUnitResult #0
ResolvedUnitResult #1
path: /home/test/lib/test.dart
uri: package:test/test.dart
flags: exists isLibrary
ResolvedUnitResult #1
ResolvedUnitResult #2
path: /home/test/lib/test.macro.dart
uri: package:test/test.macro.dart
flags: exists isAugmentation isMacroAugmentation
@ -378,10 +378,10 @@ void f() {
return unitResult.isAugmentation;
};
}, r'''
ResolvedLibraryResult
ResolvedLibraryResult #0
element: package:test/test.dart
units
ResolvedUnitResult #0
ResolvedUnitResult #1
path: /home/test/lib/test.dart
uri: package:test/test.dart
flags: exists isLibrary
@ -395,7 +395,7 @@ ResolvedLibraryResult
staticType: int
semicolon: ;
rightBracket: }
ResolvedUnitResult #1
ResolvedUnitResult #2
path: /home/test/lib/test.macro.dart
uri: package:test/test.macro.dart
flags: exists isAugmentation isMacroAugmentation

View file

@ -27,6 +27,11 @@ class NodeTextExpectationsCollector {
methodName: '_assertWorkspaceCollectionText',
argument: _ArgumentIndex(1),
),
_AssertMethod(
className: 'AnalysisDriver_PubPackageTest',
methodName: 'assertEventsText',
argument: _ArgumentIndex(1),
),
_AssertMethod(
className: 'ContextResolutionTest',
methodName: 'assertDriverStateString',
@ -87,11 +92,6 @@ class NodeTextExpectationsCollector {
methodName: 'assertDartObjectText',
argument: _ArgumentIndex(1),
),
_AssertMethod(
className: 'ResolutionTest',
methodName: 'assertDriverEventsText',
argument: _ArgumentIndex(1),
),
_AssertMethod(
className: 'ResolutionTest',
methodName: 'assertParsedNodeText',

View file

@ -284,10 +284,12 @@ mixin ResolutionTest implements ResourceProviderMixin {
void assertParsedNodeText(
AstNode node,
String expected, {
String? selfUriStr,
bool skipArgumentList = false,
}) {
var actual = _parsedNodeText(
node,
selfUriStr: selfUriStr,
skipArgumentList: skipArgumentList,
);
if (actual != expected) {
@ -543,8 +545,10 @@ mixin ResolutionTest implements ResourceProviderMixin {
String _parsedNodeText(
AstNode node, {
String? selfUriStr,
bool skipArgumentList = false,
}) {
selfUriStr ??= '${result.libraryElement.source.uri}';
final buffer = StringBuffer();
final sink = TreeStringSink(
sink: buffer,
@ -553,7 +557,7 @@ mixin ResolutionTest implements ResourceProviderMixin {
final elementPrinter = ElementPrinter(
sink: sink,
configuration: ElementPrinterConfiguration(),
selfUriStr: '${result.libraryElement.source.uri}',
selfUriStr: selfUriStr,
);
node.accept(
ResolvedAstPrinter(
@ -651,6 +655,10 @@ class _MultiplyDefinedElementMatcher extends Matcher {
}
extension ResolvedUnitResultExtension on ResolvedUnitResult {
FindElement get findElement {
return FindElement(unit);
}
FindNode get findNode {
return FindNode(content, unit);
}