public function analyze(Registry $registryBefore, Registry $registryAfter) { $report = new Report(); $keysBefore = array_keys($registryBefore->data['trait']); $keysAfter = array_keys($registryAfter->data['trait']); $added = array_diff($keysAfter, $keysBefore); $removed = array_diff($keysBefore, $keysAfter); $toVerify = array_intersect($keysBefore, $keysAfter); foreach ($removed as $key) { $fileBefore = $registryBefore->mapping['trait'][$key]; $traitBefore = $registryBefore->data['trait'][$key]; $data = new TraitRemoved($fileBefore, $traitBefore); $report->addTrait($data); } foreach ($toVerify as $key) { $fileBefore = $registryBefore->mapping['trait'][$key]; /** @var \PhpParser\Node\Stmt\Class_ $traitBefore */ $traitBefore = $registryBefore->data['trait'][$key]; $fileAfter = $registryAfter->mapping['trait'][$key]; /** @var \PhpParser\Node\Stmt\Class_ $traitBefore */ $traitAfter = $registryAfter->data['trait'][$key]; // Leave non-strict comparison here if ($traitBefore != $traitAfter) { $analyzers = [new ClassMethodAnalyzer('trait', $fileBefore, $fileAfter), new PropertyAnalyzer('trait', $fileBefore, $fileAfter)]; foreach ($analyzers as $analyzer) { $internalReport = $analyzer->analyze($traitBefore, $traitAfter); $report->merge($internalReport); } } } foreach ($added as $key) { $fileAfter = $registryAfter->mapping['trait'][$key]; $traitAfter = $registryAfter->data['trait'][$key]; $data = new TraitAdded($fileAfter, $traitAfter); $report->addTrait($data); } return $report; }