scan method
Future<RuntimeScannerSummary>
scan(
- String outputFolder,
- RuntimeScannerConfiguration configuration, {
- Directory? source,
override
Executes a mock reflection scan with the given configuration.
This simplified scan process:
- Sets up the mirror system
- Force-loads specified files
- Generates reflection metadata
- Updates the runtime context
- Includes core Dart types
Parameters:
outputFolder
: Output directory path (unused in mock implementation)configuration
: Configuration for the scanning processsource
: Optional source directory (defaults to current)
Returns a RuntimeScannerSummary containing the scan results.
Example:
final summary = await mockScan.scan(
'build',
RuntimeScanLoader(
reload: true,
scanClasses: [MyImportantClass],
),
);
Implementation
@override
Future<RuntimeScannerSummary> scan(String outputFolder, RuntimeScannerConfiguration configuration, {Directory? source}) async {
final stopwatch = Stopwatch()..start();
_logInfo("Starting mock runtime scan...");
FileUtility FileUtils = FileUtility(_logInfo, _logWarning, _logError, configuration, false);
// 1. Setup directory and verify its existence
Directory directory = source ?? Directory.current;
_package ??= await _readPackageName(directory);
directory = Directory(p.join(directory.path, outputFolder));
if(!await directory.exists()) {
await directory.create(recursive: true);
} else {
await directory.delete(recursive: true);
await directory.create(recursive: true);
}
// 2. Get current mirror system
_logInfo('Setting up mirror system...');
mirrors.MirrorSystem access = mirrors.currentMirrorSystem();
// 3. Force load specified files
final dartFiles = await FileUtils.findDartFiles(directory);
final resources = await FileUtils.discoverAllResources(_package!);
dartFiles.addAll(_forceLoadFiles);
_logInfo('Loading dart files that are not present in the [currentMirrorSystem#(${access.isolate.debugName})]...');
Map<File, Uri> urisToLoad = FileUtils.getUrisToLoad(dartFiles, _package!);
List<mirrors.LibraryMirror> forceLoadedMirrors = [];
for (final uriEntry in urisToLoad.entries) {
mirrors.LibraryMirror? mirror = await FileUtils.forceLoadLibrary(uriEntry.value, uriEntry.key, access);
if(mirror != null) {
forceLoadedMirrors.add(mirror);
}
}
List<Uri> dartUris = [
Uri.parse('dart:async')
];
for (final uri in dartUris) {
mirrors.LibraryMirror? mirror = await FileUtils.forceLoadLibrary(uri, File(''), access);
if(mirror != null) {
forceLoadedMirrors.add(mirror);
}
}
_logInfo('Loaded ${forceLoadedMirrors.length} dart files into the mirror system.');
configuration = _addDefaultPackagesToScan(configuration, _package!);
// 4. Generate reflection metadata
_logInfo('Generating declaration metadata...');
final params = MockLibraryGeneratorParams(
mirrorSystem: access,
forceLoadedMirrors: forceLoadedMirrors,
onInfo: _logInfo,
onWarning: _logWarning,
onError: _logError,
configuration: configuration,
packages: [_createPackage(_package!)],
);
print(configuration);
final libraryGenerator = _libraryGeneratorFactory?.call(params) ?? MockLibraryGenerator(
mirrorSystem: params.mirrorSystem,
forceLoadedMirrors: params.forceLoadedMirrors,
onInfo: params.onInfo,
onWarning: params.onWarning,
onError: params.onError,
configuration: params.configuration,
packages: params.packages,
);
List<LibraryDeclaration> libraries = [];
libraries = await libraryGenerator.generate(dartFiles.toList());
_logInfo('Generated declaration metadata for ${libraries.length} libraries');
// 5. Create or update context
final refreshContext = _context == null || configuration.reload;
if (refreshContext) {
_context = StandardRuntimeProvider();
}
if (libraries.isNotEmpty) {
_context?.addLibraries(libraries, replace: refreshContext);
}
// 6. Generate AOT Runtime Resolvers
RuntimeResolving resolving = RuntimeResolving(
access: access,
libraries: libraries,
forceLoadedMirrors: forceLoadedMirrors,
outputFolder: outputFolder,
fileUtils: FileUtils,
package: _package!,
logInfo: _logInfo,
logWarning: _logWarning,
logError: _logError,
);
_context?.addAssets(resources);
_context?.setRuntimeResolver(await resolving.resolve());
stopwatch.stop();
_logInfo("Mock scan completed in ${stopwatch.elapsedMilliseconds}ms");
final summary = DefaultRuntimeScannerSummary();
summary.setContext(_context!);
summary.setBuildTime(DateTime.now());
return summary;
}