Skip to content

Commit

Permalink
Extract deprecation handler to a private static function
Browse files Browse the repository at this point in the history
  • Loading branch information
greg0ire committed Dec 30, 2018
1 parent 14cd6d6 commit 5345897
Showing 1 changed file with 84 additions and 79 deletions.
163 changes: 84 additions & 79 deletions src/Symfony/Bridge/PhpUnit/DeprecationErrorHandler.php
Expand Up @@ -59,83 +59,7 @@ public static function register($mode = 0)

self::computeMode($mode);

$deprecationHandler = function ($type, $msg, $file, $line, $context = array()) {
$mode = self::$mode;
if ((E_USER_DEPRECATED !== $type && E_DEPRECATED !== $type) || self::MODE_DISABLED === $mode) {
$ErrorHandler = self::utilPrefix().'ErrorHandler';

return $ErrorHandler::handleError($type, $msg, $file, $line, $context);
}

$trace = debug_backtrace();
$group = 'other';
$isVendor = self::MODE_WEAK_VENDORS === $mode && self::inVendors($file);

$i = \count($trace);
while (1 < $i && (!isset($trace[--$i]['class']) || ('ReflectionMethod' === $trace[$i]['class'] || 0 === strpos($trace[$i]['class'], 'PHPUnit_') || 0 === strpos($trace[$i]['class'], 'PHPUnit\\')))) {
// No-op
}

if (isset($trace[$i]['object']) || isset($trace[$i]['class'])) {
if (isset($trace[$i]['class']) && 0 === strpos($trace[$i]['class'], 'Symfony\Bridge\PhpUnit\Legacy\SymfonyTestsListenerFor')) {
$parsedMsg = unserialize($msg);
$msg = $parsedMsg['deprecation'];
$class = $parsedMsg['class'];
$method = $parsedMsg['method'];
// If the deprecation has been triggered via
// \Symfony\Bridge\PhpUnit\Legacy\SymfonyTestsListenerTrait::endTest()
// then we need to use the serialized information to determine
// if the error has been triggered from vendor code.
$isVendor = self::MODE_WEAK_VENDORS === $mode && isset($parsedMsg['triggering_file']) && self::inVendors($parsedMsg['triggering_file']);
} else {
$class = isset($trace[$i]['object']) ? \get_class($trace[$i]['object']) : $trace[$i]['class'];
$method = $trace[$i]['function'];
}

$Test = self::utilPrefix().'Test';

if (0 !== error_reporting()) {
$group = 'unsilenced';
} elseif (0 === strpos($method, 'testLegacy')
|| 0 === strpos($method, 'provideLegacy')
|| 0 === strpos($method, 'getLegacy')
|| strpos($class, '\Legacy')
|| \in_array('legacy', $Test::getGroups($class, $method), true)
) {
$group = 'legacy';
} elseif ($isVendor) {
$group = 'remaining vendor';
} else {
$group = 'remaining';
}

if (isset($mode[0]) && '/' === $mode[0] && preg_match($mode, $msg)) {
$e = new \Exception($msg);
$r = new \ReflectionProperty($e, 'trace');
$r->setAccessible(true);
$r->setValue($e, \array_slice($trace, 1, $i));

echo "\n".ucfirst($group).' deprecation triggered by '.$class.'::'.$method.':';
echo "\n".$msg;
echo "\nStack trace:";
echo "\n".str_replace(' '.getcwd().\DIRECTORY_SEPARATOR, ' ', $e->getTraceAsString());
echo "\n";

exit(1);
}
if ('legacy' !== $group && self::MODE_WEAK !== $mode) {
$ref = &self::$deprecations[$group][$msg]['count'];
++$ref;
$ref = &self::$deprecations[$group][$msg][$class.'::'.$method];
++$ref;
}
} elseif (self::MODE_WEAK !== $mode) {
$ref = &self::$deprecations[$group][$msg]['count'];
++$ref;
}
++self::$deprecations[$group.'Count'];
};
$oldErrorHandler = set_error_handler($deprecationHandler);
$oldErrorHandler = set_error_handler(array(self::class, 'handleError'));

if (null !== $oldErrorHandler) {
restore_error_handler();
Expand All @@ -145,15 +69,15 @@ public static function register($mode = 0)
}
} else {
self::$isRegistered = true;
register_shutdown_function(function () use ($deprecationHandler) {
register_shutdown_function(function () {
$mode = self::$mode;
if (isset($mode[0]) && '/' === $mode[0]) {
return;
}
$currErrorHandler = set_error_handler('var_dump');
restore_error_handler();

if ($currErrorHandler !== $deprecationHandler) {
if ($currErrorHandler !== array(self::class, 'handleError')) {
echo "\n", self::colorize('THE ERROR HANDLER HAS CHANGED!', true, $mode), "\n";
}

Expand Down Expand Up @@ -382,4 +306,85 @@ private static function utilPrefix()

return self::$utilPrefix = (class_exists('PHPUnit_Util_ErrorHandler') ? 'PHPUnit_Util_' : 'PHPUnit\Util\\');
}

/**
* @internal
*/
public static function handleError($type, $msg, $file, $line, $context = array())
{
$mode = self::$mode;
if ((E_USER_DEPRECATED !== $type && E_DEPRECATED !== $type) || self::MODE_DISABLED === $mode) {
$ErrorHandler = self::utilPrefix().'ErrorHandler';

return $ErrorHandler::handleError($type, $msg, $file, $line, $context);
}

$trace = debug_backtrace();
$group = 'other';
$isVendor = self::MODE_WEAK_VENDORS === $mode && self::inVendors($file);

$i = \count($trace);
while (1 < $i && (!isset($trace[--$i]['class']) || ('ReflectionMethod' === $trace[$i]['class'] || 0 === strpos($trace[$i]['class'], 'PHPUnit_') || 0 === strpos($trace[$i]['class'], 'PHPUnit\\')))) {
// No-op
}

if (isset($trace[$i]['object']) || isset($trace[$i]['class'])) {
if (isset($trace[$i]['class']) && 0 === strpos($trace[$i]['class'], 'Symfony\Bridge\PhpUnit\Legacy\SymfonyTestsListenerFor')) {
$parsedMsg = unserialize($msg);
$msg = $parsedMsg['deprecation'];
$class = $parsedMsg['class'];
$method = $parsedMsg['method'];
// If the deprecation has been triggered via
// \Symfony\Bridge\PhpUnit\Legacy\SymfonyTestsListenerTrait::endTest()
// then we need to use the serialized information to determine
// if the error has been triggered from vendor code.
$isVendor = self::MODE_WEAK_VENDORS === $mode && isset($parsedMsg['triggering_file']) && self::inVendors($parsedMsg['triggering_file']);
} else {
$class = isset($trace[$i]['object']) ? \get_class($trace[$i]['object']) : $trace[$i]['class'];
$method = $trace[$i]['function'];
}

$Test = self::utilPrefix().'Test';

if (0 !== error_reporting()) {
$group = 'unsilenced';
} elseif (0 === strpos($method, 'testLegacy')
|| 0 === strpos($method, 'provideLegacy')
|| 0 === strpos($method, 'getLegacy')
|| strpos($class, '\Legacy')
|| \in_array('legacy', $Test::getGroups($class, $method), true)
) {
$group = 'legacy';
} elseif ($isVendor) {
$group = 'remaining vendor';
} else {
$group = 'remaining';
}

if (isset($mode[0]) && '/' === $mode[0] && preg_match($mode, $msg)) {
$e = new \Exception($msg);
$r = new \ReflectionProperty($e, 'trace');
$r->setAccessible(true);
$r->setValue($e, \array_slice($trace, 1, $i));

echo "\n".ucfirst($group).' deprecation triggered by '.$class.'::'.$method.':';
echo "\n".$msg;
echo "\nStack trace:";
echo "\n".str_replace(' '.getcwd().\DIRECTORY_SEPARATOR, ' ', $e->getTraceAsString());
echo "\n";

exit(1);
}
if ('legacy' !== $group && self::MODE_WEAK !== $mode) {
$ref = &self::$deprecations[$group][$msg]['count'];
++$ref;
$ref = &self::$deprecations[$group][$msg][$class.'::'.$method];
++$ref;
}
} elseif (self::MODE_WEAK !== $mode) {
$ref = &self::$deprecations[$group][$msg]['count'];
++$ref;
}
++self::$deprecations[$group.'Count'];
}
}

0 comments on commit 5345897

Please sign in to comment.