runSharedPrefGenerator function

Future<void> runSharedPrefGenerator({
  1. bool? verbose,
})

Implementation

Future<void> runSharedPrefGenerator({bool? verbose}) async {
  final start = DateTime.now();

  final config = await _loadConfig();
  final filePath = config['path'] as String?;
  final rootDir = p.join(Directory.current.path, 'lib');

  final entity = filePath != null ? File(p.join(rootDir, filePath)) : Directory(rootDir);

  if (!entity.existsSync()) {
    print('🚫 Target ${entity is File ? 'File' : 'Directory'} not found: ${entity.path}');
    return;
  }

  print('🔎 Scanning for classes with @sharedPref annotation in ${entity.path} ...');

  List<String> generated = [];
  final files = _collectDartFiles(entity);
  final collection = AnalysisContextCollection(includedPaths: [rootDir]);

  for (final context in collection.contexts) {
    for (final filePath in files) {
      if (filePath.endsWith('.g.dart')) continue;

      final result = await _parseFile(context, filePath);
      if (result == null) continue;

      final sharedPrefClasses = _findSharedPrefClasses(result.unit);
      for (final classDecl in sharedPrefClasses) {
        final fields = _extractFields(classDecl);
        if (fields.isEmpty) continue;

        final out = await _generateAndWriteFile(filePath, classDecl.name.lexeme, fields);

        generated.add(out);
      }
    }
  }

  final duration = DateTime.now().difference(start);

  if (generated.isEmpty) {
    print('🚫 No classes found with @sharedPref annotation in ${entity.path}');
  } else {
    print('✅ Generated ${generated.length} file(s) in ${duration.inMilliseconds}ms');

    print('📦 Generated files:');
    print(generated.join(' - \n'));
  }
}