analyze method

List<RootCauseCandidate> analyze({
  1. required FlutterAnalysisResult result,
  2. required List<PrioritizedGroup> prioritizedGroups,
  3. required List<EvidenceItem> environmentEvidence,
})

Produces a sorted list of RootCauseCandidate objects.

Sorted by priority first (critical → unknown), then occurrenceCount desc.

Each FlutterIssue is attributed to at most one candidate — the total across all candidates never exceeds result.allIssues.length.

Implementation

List<RootCauseCandidate> analyze({
  required FlutterAnalysisResult result,
  required List<PrioritizedGroup> prioritizedGroups,
  required List<EvidenceItem> environmentEvidence,
}) {
  final candidates = <RootCauseCandidate>[];
  // Track which rules have already been processed to avoid double-counting.
  final processedRules = <String>{};

  // ── CRITICAL clusters ─────────────────────────────────────────────
  _clusterUndefinedSymbols(result, prioritizedGroups, environmentEvidence,
      candidates, processedRules);
  _clusterTypeErrors(result, prioritizedGroups, environmentEvidence,
      candidates, processedRules);

  // ── HIGH clusters ──────────────────────────────────────────────────
  _clusterBuildContext(result, prioritizedGroups, environmentEvidence,
      candidates, processedRules);
  _clusterNullSafety(result, prioritizedGroups, environmentEvidence,
      candidates, processedRules);

  // ── MEDIUM clusters ────────────────────────────────────────────────
  _clusterDeprecatedApis(result, prioritizedGroups, environmentEvidence,
      candidates, processedRules);
  _clusterMissingDependencies(result, prioritizedGroups, environmentEvidence,
      candidates, processedRules);
  _clusterUnusedCode(result, prioritizedGroups, environmentEvidence,
      candidates, processedRules);

  // ── LOW clusters ───────────────────────────────────────────────────
  _clusterPerformanceHints(result, prioritizedGroups, environmentEvidence,
      candidates, processedRules);
  _clusterSizedBox(result, prioritizedGroups, environmentEvidence, candidates,
      processedRules);
  _clusterUnusedImports(result, prioritizedGroups, environmentEvidence,
      candidates, processedRules);
  _clusterDebugStatements(result, prioritizedGroups, environmentEvidence,
      candidates, processedRules);
  _clusterControlFlowStyle(result, prioritizedGroups, environmentEvidence,
      candidates, processedRules);
  _clusterNamingStyle(result, prioritizedGroups, environmentEvidence,
      candidates, processedRules);

  // Sort: priority asc, then occurrenceCount desc.
  candidates.sort((a, b) {
    final byPriority = a.priority.sortOrder.compareTo(b.priority.sortOrder);
    if (byPriority != 0) return byPriority;
    return b.occurrenceCount.compareTo(a.occurrenceCount);
  });

  return candidates;
}