blob: a50058896925099d1ba02be95b1c063b18026280 [file] [log] [blame]
// Copyright (c) 2020, the Dart project authors. Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.
import 'dart:convert';
import 'package:analyzer/dart/analysis/results.dart';
import 'package:analyzer/file_system/file_system.dart';
import 'package:analyzer/src/dart/analysis/byte_store.dart';
import 'package:analyzer/src/dart/analysis/file_state.dart';
import 'package:analyzer/src/dart/analysis/library_context.dart';
import 'package:analyzer/src/dart/analysis/performance_logger.dart';
import 'package:analyzer/src/dart/micro/resolve_file.dart';
import 'package:analyzer/src/dart/sdk/sdk.dart';
import 'package:analyzer/src/test_utilities/find_element.dart';
import 'package:analyzer/src/test_utilities/find_node.dart';
import 'package:analyzer/src/test_utilities/mock_sdk.dart';
import 'package:analyzer/src/test_utilities/resource_provider_mixin.dart';
import 'package:analyzer/src/util/performance/operation_performance.dart';
import 'package:analyzer/src/workspace/bazel.dart';
import 'package:crypto/crypto.dart';
import 'package:linter/src/rules.dart';
import 'package:test/test.dart';
import '../analysis/analyzer_state_printer.dart' as printer;
import '../resolution/node_text_expectations.dart';
import '../resolution/resolution.dart';
/// [FileResolver] based implementation of [ResolutionTest].
class FileResolutionTest with ResourceProviderMixin, ResolutionTest {
static final String _testFile = '/workspace/dart/test/lib/test.dart';
final MemoryByteStore byteStore = MemoryByteStore();
final FileResolverTestData testData = FileResolverTestData();
final StringBuffer logBuffer = StringBuffer();
late PerformanceLog logger;
late FileResolver fileResolver;
final printer.IdProvider _idProvider = printer.IdProvider();
FileSystemState get fsState => fileResolver.fsState!;
LibraryContext get libraryContext {
return fileResolver.libraryContext!;
}
Folder get sdkRoot => newFolder('/sdk');
File get testFile => getFile(testFilePath);
@override
String get testFilePath => _testFile;
String get testPackageLibPath => '$testPackageRootPath/lib';
String get testPackageRootPath => '$workspaceRootPath/dart/test';
String get workspaceRootPath => '/workspace';
@override
void addTestFile(String content) {
newFile(_testFile, content);
}
void assertStateString(
String expected, {
bool omitSdkFiles = true,
}) {
final buffer = StringBuffer();
printer.AnalyzerStatePrinter(
byteStore: byteStore,
idProvider: _idProvider,
libraryContext: libraryContext,
omitSdkFiles: omitSdkFiles,
resourceProvider: resourceProvider,
sink: buffer,
withKeysGetPut: true,
).writeFileResolver(testData);
final actual = buffer.toString();
if (actual != expected) {
print(actual);
NodeTextExpectationsCollector.add(actual);
}
expect(actual, expected);
}
/// Create a new [FileResolver] into [fileResolver].
///
/// We do this the first time, and to test reusing results from [byteStore].
void createFileResolver() {
var workspace = BazelWorkspace.find(
resourceProvider,
convertPath(_testFile),
)!;
fileResolver = FileResolver(
logger: logger,
resourceProvider: resourceProvider,
byteStore: byteStore,
sourceFactory: workspace.createSourceFactory(
FolderBasedDartSdk(resourceProvider, sdkRoot),
null,
),
getFileDigest: (String path) => _getDigest(path),
workspace: workspace,
prefetchFiles: null,
isGenerated: (_) => false,
testData: testData,
);
}
Future<ErrorsResult> getTestErrors() async {
var path = convertPath(_testFile);
return fileResolver.getErrors2(path: path);
}
@override
Future<ResolvedUnitResult> resolveFile(
String path, {
OperationPerformanceImpl? performance,
}) async {
result = await fileResolver.resolve2(
path: path,
performance: performance,
);
return result;
}
@override
Future<void> resolveTestFile() async {
var path = convertPath(_testFile);
result = await resolveFile(path);
findNode = FindNode(result.content, result.unit);
findElement = FindElement(result.unit);
}
void setUp() {
registerLintRules();
logger = PerformanceLog(logBuffer);
createMockSdk(
resourceProvider: resourceProvider,
root: sdkRoot,
);
newFile('/workspace/WORKSPACE', '');
newFile('/workspace/dart/test/BUILD', r'''
dart_package(
null_safety = True,
)
''');
createFileResolver();
}
String _getDigest(String path) {
try {
var content = resourceProvider.getFile(path).readAsStringSync();
var contentBytes = utf8.encode(content);
return md5.convert(contentBytes).toString();
} catch (_) {
return '';
}
}
}