mirror of
https://github.com/dart-lang/sdk
synced 2024-10-14 17:35:46 +00:00
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:
parent
5229eabddf
commit
b5b4cf872f
|
@ -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.
|
||||
|
|
|
@ -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.
|
||||
|
|
|
@ -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();
|
||||
|
|
|
@ -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
|
@ -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 = (_) => [];
|
||||
}
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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',
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
|
|
Loading…
Reference in a new issue