analyze method

Future<AnalysisResult> analyze()

Analyze dependencies in the current project

Implementation

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

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

  // Parse pubspec.yaml
  final String pubspecContent = await pubspecFile.readAsString();
  final Map pubspec = Map<dynamic, dynamic>.from(
      loadYaml(pubspecContent) ?? <dynamic, dynamic>{});

  // Extract dependencies
  final Map<String, dynamic> dependencies = _extractDependencies(pubspec);
  final Map<String, dynamic> devDependencies =
      _extractDevDependencies(pubspec);

  // Scan Dart files for imports
  final Map<String, PackageUsage> usageMap = await _scanDartFiles();

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

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

    final PackageUsage? usage = usageMap[dep];

    final DependencyInfo 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 String dep in devDependencies.keys) {
    if (dep == AnalysisConfig.flutterSdk) continue; // Skip Flutter SDK

    final PackageUsage? usage = usageMap[dep];
    final DependencyInfo 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 List<DuplicateDependency> duplicates =
      _findDuplicates(dependencies, devDependencies, usageMap);

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