PHPSemVerChecker\Comparator\Signature::analyze PHP Метод

analyze() публичный статический Метод

public static analyze ( array $parametersA, array $parametersB ) : array
$parametersA array
$parametersB array
Результат array
    public static function analyze(array $parametersA, array $parametersB)
    {
        $changes = ['parameter_added' => false, 'parameter_removed' => false, 'parameter_renamed' => false, 'parameter_typing_added' => false, 'parameter_typing_removed' => false, 'parameter_default_added' => false, 'parameter_default_removed' => false, 'parameter_default_value_changed' => false];
        $lengthA = count($parametersA);
        $lengthB = count($parametersB);
        // TODO([email protected]): This is only true if newer params do not have defaults
        if ($lengthA < $lengthB) {
            $changes['parameter_added'] = true;
        } elseif ($lengthA > $lengthB) {
            $changes['parameter_removed'] = true;
        }
        $iterations = min($lengthA, $lengthB);
        for ($i = 0; $i < $iterations; ++$i) {
            // Name checking
            if ($parametersA[$i]->name !== $parametersB[$i]->name) {
                $changes['parameter_renamed'] = true;
            }
            // Type checking
            if (Type::get($parametersA[$i]->type) !== Type::get($parametersB[$i]->type)) {
                //				if ($paramsA[$i]->default !== null && $paramsB[$i]->default !== null) {
                //					$changes['parameter_default_value_changed'] = true;
                if ($parametersA[$i]->type !== null) {
                    $changes['parameter_typing_removed'] = true;
                }
                if ($parametersB[$i]->type !== null) {
                    $changes['parameter_typing_added'] = true;
                }
            }
            // Default checking
            if ($parametersA[$i]->default === null && $parametersB[$i]->default === null) {
                // Do nothing
            } elseif ($parametersA[$i]->default !== null && $parametersB[$i]->default === null) {
                $changes['parameter_default_removed'] = true;
            } elseif ($parametersA[$i]->default === null && $parametersB[$i]->default !== null) {
                $changes['parameter_default_added'] = true;
                // TODO([email protected]): Not all nodes have a value property
            } elseif (!Node::isEqual($parametersA[$i]->default, $parametersB[$i]->default)) {
                $changes['parameter_default_value_changed'] = true;
            }
        }
        return $changes;
    }

Usage Example

Пример #1
0
 /**
  * @param \PHPSemVerChecker\Registry\Registry $registryBefore
  * @param \PHPSemVerChecker\Registry\Registry $registryAfter
  * @return \PHPSemVerChecker\Report\Report
  */
 public function analyze(Registry $registryBefore, Registry $registryAfter)
 {
     $report = new Report();
     $keysBefore = array_keys($registryBefore->data['function']);
     $keysAfter = array_keys($registryAfter->data['function']);
     $added = array_diff($keysAfter, $keysBefore);
     $removed = array_diff($keysBefore, $keysAfter);
     $toVerify = array_intersect($keysBefore, $keysAfter);
     foreach ($removed as $key) {
         $fileBefore = $registryBefore->mapping['function'][$key];
         $functionBefore = $registryBefore->data['function'][$key];
         $data = new FunctionRemoved($fileBefore, $functionBefore);
         $report->addFunction($data);
     }
     foreach ($toVerify as $key) {
         $fileBefore = $registryBefore->mapping['function'][$key];
         $functionBefore = $registryBefore->data['function'][$key];
         $fileAfter = $registryAfter->mapping['function'][$key];
         $functionAfter = $registryAfter->data['function'][$key];
         // Leave non-strict comparison here
         if ($functionBefore != $functionAfter) {
             $paramsBefore = $functionBefore->params;
             $paramsAfter = $functionAfter->params;
             $signatureResult = Signature::analyze($paramsBefore, $paramsAfter);
             $changes = ['parameter_added' => FunctionParameterAdded::class, 'parameter_removed' => FunctionParameterRemoved::class, 'parameter_renamed' => FunctionParameterNameChanged::class, 'parameter_typing_added' => FunctionParameterTypingAdded::class, 'parameter_typing_removed' => FunctionParameterTypingRemoved::class, 'parameter_default_added' => FunctionParameterDefaultAdded::class, 'parameter_default_removed' => FunctionParameterDefaultRemoved::class, 'parameter_default_value_changed' => FunctionParameterDefaultValueChanged::class];
             foreach ($changes as $changeType => $class) {
                 if (!$signatureResult[$changeType]) {
                     continue;
                 }
                 if (is_a($class, FunctionOperationUnary::class, true)) {
                     $data = new $class($fileAfter, $functionAfter);
                 } else {
                     $data = new $class($fileBefore, $functionBefore, $fileAfter, $functionAfter);
                 }
                 $report->addFunction($data);
             }
             // Difference in source code
             if (!Implementation::isSame($functionBefore->stmts, $functionAfter->stmts)) {
                 $data = new FunctionImplementationChanged($fileBefore, $functionBefore, $fileAfter, $functionAfter);
                 $report->addFunction($data);
             }
         }
     }
     foreach ($added as $key) {
         $fileAfter = $registryAfter->mapping['function'][$key];
         $functionAfter = $registryAfter->data['function'][$key];
         $data = new FunctionAdded($fileAfter, $functionAfter);
         $report->addFunction($data);
     }
     return $report;
 }
All Usage Examples Of PHPSemVerChecker\Comparator\Signature::analyze
Signature