scan method

  1. @override
Future<RuntimeScannerSummary> scan(
  1. String outputFolder,
  2. RuntimeScannerConfiguration configuration, {
  3. Directory? source,
})
override

Executes a mock reflection scan with the given configuration.

This simplified scan process:

  1. Sets up the mirror system
  2. Force-loads specified files
  3. Generates reflection metadata
  4. Updates the runtime context
  5. Includes core Dart types

Parameters:

  • outputFolder: Output directory path (unused in mock implementation)
  • configuration: Configuration for the scanning process
  • source: 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;
}