getUsedPackages method

Future<Set<String>> getUsedPackages()

Returns a set of packages that are actually used in the project.

Implementation

Future<Set<String>> getUsedPackages() async {
  final usedPackages = <String>{};

  for (final dir in directoriesToAnalyze) {
    print("📂 Scanning directory: $dir");

    List<File> dartFiles = [];

    // If scanning bin/, use listSync directly
    if (dir == 'bin') {
      final binDir = Directory(dir);
      if (binDir.existsSync()) {
        dartFiles.addAll(
          binDir
              .listSync(recursive: true)
              .whereType<File>()
              .where((file) => file.path.endsWith('.dart')),
        );
      }
    } else {
      dartFiles.addAll(Glob("$dir/**/*.dart").listSync().whereType<File>());
    }

    for (final file in dartFiles) {
      print("📄 Found file: ${file.path}");

      if (_shouldIgnore(file.path)) continue;

      final content = file.readAsStringSync();
      final parseResult = parseString(
        content: content,
        throwIfDiagnostics: false,
      );

      for (var directive
          in parseResult.unit.directives.whereType<ImportDirective>()) {
        final uri = directive.uri.stringValue;
        if (uri != null && uri.startsWith('package:')) {
          final packageName = uri.split('/')[0].replaceFirst('package:', '');
          usedPackages.add(packageName);
        }
      }
    }
  }

  return usedPackages;
}