getProjectLanguages method

Future<Map<String, LanguageStats>> getProjectLanguages(
  1. String path
)

Calculates per-language statistics for the project.

Implementation

Future<Map<String, LanguageStats>> getProjectLanguages(String path) async {
  final fileCounts = <String, int>{};
  final lineCounts = <String, int>{};

  final files = await getProjectFiles(path);
  for (final file in files) {
    final ext = _extension(file);
    final language = _extensionToLanguage[ext];
    if (language == null) continue;

    fileCounts[language] = (fileCounts[language] ?? 0) + 1;

    try {
      final fullPath = file.startsWith('/') ? file : '$path/$file';
      final content = await File(fullPath).readAsString();
      final lines = LineSplitter.split(content).length;
      lineCounts[language] = (lineCounts[language] ?? 0) + lines;
    } catch (_) {
      // Binary or unreadable file.
    }
  }

  final totalLines = lineCounts.values.fold<int>(0, (a, b) => a + b);
  final result = <String, LanguageStats>{};

  for (final language in fileCounts.keys) {
    final lines = lineCounts[language] ?? 0;
    result[language] = LanguageStats(
      fileCount: fileCounts[language]!,
      lineCount: lines,
      percentage: totalLines > 0 ? (lines / totalLines) * 100 : 0,
    );
  }

  return result;
}