analyze method
List<RootCauseCandidate>
analyze({
- required FlutterAnalysisResult result,
- required List<
PrioritizedGroup> prioritizedGroups, - 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;
}