analyze method

Future<AnalysisResult> analyze()

Analyze dependencies in the current project

Implementation

Future<AnalysisResult> analyze() async {
  final pubspecFile = File(FileConfig.pubspecFile);

  if (!pubspecFile.existsSync()) {
    throw Exception('${FileConfig.pubspecFile} not found');
  }

  // Parse pubspec.yaml
  final pubspecContent = await pubspecFile.readAsString();
  final pubspec = loadYaml(pubspecContent) as Map;

  // Extract dependencies
  final dependencies = _extractDependencies(pubspec);
  final devDependencies = _extractDevDependencies(pubspec);

  // Scan Dart files for imports
  final usageMap = await _scanDartFiles();

  // Analyze each dependency
  final results = <DependencyInfo>[];

  // Analyze regular dependencies
  for (final dep in dependencies.keys) {
    if (dep == AnalysisConfig.flutterSdk) continue; // Skip Flutter SDK

    final usage = usageMap[dep];

    final info = DependencyInfo(
      name: dep,
      version: dependencies[dep].toString(),
      section: DependencySection.dependencies,
      status: _determineDependencyStatus(dep, usage),
      usedInLib: usage?.usedInLib ?? false,
      usedInTest: usage?.usedInTest ?? false,
      usedInBin: usage?.usedInBin ?? false,
      usedInTool: usage?.usedInTool ?? false,
    );
    results.add(info);
  }

  // Analyze dev dependencies
  for (final dep in devDependencies.keys) {
    if (dep == AnalysisConfig.flutterSdk) continue; // Skip Flutter SDK

    final usage = usageMap[dep];
    final info = DependencyInfo(
      name: dep,
      version: devDependencies[dep].toString(),
      section: DependencySection.devDependencies,
      status: _determineDevDependencyStatus(dep, usage),
      usedInLib: usage?.usedInLib ?? false,
      usedInTest: usage?.usedInTest ?? false,
      usedInBin: usage?.usedInBin ?? false,
      usedInTool: usage?.usedInTool ?? false,
    );
    results.add(info);
  }

  // Check for duplicates
  final duplicates = _findDuplicates(dependencies, devDependencies, usageMap);

  return AnalysisResult(
    dependencies: results,
    duplicates: duplicates,
    totalScanned: results.length,
  );
}