blob: 2c01812b24af91ecf5b09618945a1a990a10f417 [file] [log] [blame]
// Copyright (c) 2019, 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 'package:analyzer/file_system/file_system.dart';
import 'package:analyzer/file_system/physical_file_system.dart';
// ignore: implementation_imports
import 'package:analyzer/src/test_utilities/resource_provider_mixin.dart';
import 'package:analyzer_testing/package_root.dart' as package_root;
import 'package:path/path.dart' as path;
void _cacheFiles(Map<String, String> cachedFiles) {
var resourceProvider = PhysicalResourceProvider.INSTANCE;
var pathContext = resourceProvider.pathContext;
var packageRoot = pathContext.normalize(package_root.packageRoot);
var mockPath = pathContext.join(
packageRoot,
'analyzer_utilities',
'lib',
'test',
'mock_packages',
'package_content',
);
void addFiles(Resource resource) {
if (resource is Folder) {
resource.getChildren().forEach(addFiles);
} else if (resource is File) {
var relativePath = pathContext.relative(resource.path, from: mockPath);
var relativePathComponents = pathContext.split(relativePath);
var relativePosixPath = relativePathComponents.join('/');
cachedFiles[relativePosixPath] = resource.readAsStringSync();
}
}
addFiles(resourceProvider.getFolder(mockPath));
}
/// Helper for copying files from "tests/mock_packages" to memory file system
/// for Blaze.
class BlazeMockPackages {
static final BlazeMockPackages instance = BlazeMockPackages._();
/// The mapping from relative Posix paths of files to the file contents.
final Map<String, String> _cachedFiles = {};
BlazeMockPackages._() {
_cacheFiles(_cachedFiles);
}
void addFlutter(ResourceProvider provider) {
_addFiles(provider, 'flutter');
}
void addMeta(ResourceProvider provider) {
_addFiles(provider, 'meta');
}
/// Add files of the given [packageName] to the [provider].
Folder _addFiles(ResourceProvider provider, String packageName) {
var packagesPath = provider.convertPath('/workspace/third_party/dart');
for (var entry in _cachedFiles.entries) {
var relativePosixPath = entry.key;
var relativePathComponents = relativePosixPath.split('/');
if (relativePathComponents[0] == packageName) {
var relativePath = provider.pathContext.joinAll(relativePathComponents);
var path = provider.pathContext.join(packagesPath, relativePath);
provider.getFile(path).writeAsStringSync(entry.value);
}
}
var packagesFolder = provider.getFolder(packagesPath);
return packagesFolder.getChildAssumingFolder(packageName);
}
}
/// Helper for copying files from "test/mock_packages" to memory file system.
mixin MockPackagesMixin {
/// The mapping from relative Posix paths of files to the file contents.
///
/// `null` until the cache is first populated.
Map<String, String>? _cachedFiles;
/// The path to a folder where mock packages can be written.
String get packagesRootPath;
path.Context get pathContext => resourceProvider.pathContext;
ResourceProvider get resourceProvider;
Folder addAngularMeta() {
var packageFolder = _addFiles('angular_meta');
return packageFolder.getChildAssumingFolder('lib');
}
Folder addFfi() {
var packageFolder = _addFiles('ffi');
return packageFolder.getChildAssumingFolder('lib');
}
Folder addFixnum() {
var packageFolder = _addFiles('fixnum');
return packageFolder.getChildAssumingFolder('lib');
}
Folder addFlutter() {
var packageFolder = _addFiles('flutter');
return packageFolder.getChildAssumingFolder('lib');
}
Folder addFlutterTest() {
var packageFolder = _addFiles('flutter_test');
return packageFolder.getChildAssumingFolder('lib');
}
Folder addJs() {
var packageFolder = _addFiles('js');
return packageFolder.getChildAssumingFolder('lib');
}
Folder addKernel() {
var packageFolder = _addFiles('kernel');
return packageFolder.getChildAssumingFolder('lib');
}
Folder addMeta() {
var packageFolder = _addFiles('meta');
return packageFolder.getChildAssumingFolder('lib');
}
Folder addPedantic() {
var packageFolder = _addFiles('pedantic');
return packageFolder.getChildAssumingFolder('lib');
}
Folder addTestReflectiveLoader() {
var packageFolder = _addFiles('test_reflective_loader');
return packageFolder.getChildAssumingFolder('lib');
}
Folder addUI() {
var packageFolder = _addFiles('ui');
return packageFolder.getChildAssumingFolder('lib');
}
Folder addVectorMath() {
var packageFolder = _addFiles('vector_math');
return packageFolder.getChildAssumingFolder('lib');
}
/// Add files of the given [packageName] to the [provider].
Folder _addFiles(String packageName) {
var cachedFiles = _cachedFiles;
if (cachedFiles == null) {
cachedFiles = {};
_cacheFiles(cachedFiles);
_cachedFiles = cachedFiles;
}
for (var entry in cachedFiles.entries) {
var relativePosixPath = entry.key;
var relativePathComponents = relativePosixPath.split('/');
if (relativePathComponents[0] == packageName) {
var relativePath = pathContext.joinAll(relativePathComponents);
var path = resourceProvider.convertPath(
'$packagesRootPath/$relativePath',
);
resourceProvider.getFile(path).writeAsStringSync(entry.value);
}
}
var packagesFolder = resourceProvider.getFolder(
resourceProvider.convertPath(packagesRootPath),
);
return packagesFolder.getChildAssumingFolder(packageName);
}
}