From a756f5b8a59e960a961210ae2027adfefc066fcb Mon Sep 17 00:00:00 2001 From: Nicolas Grekas Date: Thu, 12 Feb 2015 09:13:06 +0100 Subject: [PATCH] [Debug] generalize deprecated interfaces tracking --- .../Component/Debug/DebugClassLoader.php | 17 +++++++------ .../Debug/Tests/DebugClassLoaderTest.php | 24 +++++++++++++++++++ src/Symfony/Component/Debug/composer.json | 2 +- 3 files changed, 35 insertions(+), 8 deletions(-) diff --git a/src/Symfony/Component/Debug/DebugClassLoader.php b/src/Symfony/Component/Debug/DebugClassLoader.php index eb751bf9cd..7554581f21 100644 --- a/src/Symfony/Component/Debug/DebugClassLoader.php +++ b/src/Symfony/Component/Debug/DebugClassLoader.php @@ -179,16 +179,19 @@ class DebugClassLoader if (preg_match('#\n \* @deprecated (.*?)\r?\n \*(?: @|/$)#s', $refl->getDocComment(), $notice)) { self::$deprecated[$name] = preg_replace('#\s*\r?\n \* +#', ' ', $notice[1]); - } elseif (0 !== strpos($name, 'Symfony\\')) { + } else { + $len = 1 + (strpos($name, '\\', 1 + strpos($name, '\\')) ?: strpos($name, '_')); $parent = $refl->getParentClass(); - if ($parent && isset(self::$deprecated[$parent->name])) { - trigger_error(sprintf('The %s class extends %s that is deprecated %s', $name, $parent->name, self::$deprecated[$parent->name]), E_USER_DEPRECATED); - } + if (!$parent || $len < 2 || strncmp($name, $parent, $len)) { + if ($parent && isset(self::$deprecated[$parent->name]) && ($len < 2 || strncmp($name, $parent->name, $len))) { + trigger_error(sprintf('The %s class extends %s that is deprecated %s', $name, $parent->name, self::$deprecated[$parent->name]), E_USER_DEPRECATED); + } - foreach ($refl->getInterfaceNames() as $interface) { - if (isset(self::$deprecated[$interface]) && !($parent && $parent->implementsInterface($interface))) { - trigger_error(sprintf('The %s %s %s that is deprecated %s', $name, $refl->isInterface() ? 'interface extends' : 'class implements', $interface, self::$deprecated[$interface]), E_USER_DEPRECATED); + foreach ($refl->getInterfaceNames() as $interface) { + if (isset(self::$deprecated[$interface]) && ($len < 2 || strncmp($name, $interface, $len)) && !($parent && $parent->implementsInterface($interface))) { + trigger_error(sprintf('The %s %s %s that is deprecated %s', $name, $refl->isInterface() ? 'interface extends' : 'class implements', $interface, self::$deprecated[$interface]), E_USER_DEPRECATED); + } } } } diff --git a/src/Symfony/Component/Debug/Tests/DebugClassLoaderTest.php b/src/Symfony/Component/Debug/Tests/DebugClassLoaderTest.php index 04c0d6f566..cf1b5730f2 100644 --- a/src/Symfony/Component/Debug/Tests/DebugClassLoaderTest.php +++ b/src/Symfony/Component/Debug/Tests/DebugClassLoaderTest.php @@ -186,6 +186,28 @@ class DebugClassLoaderTest extends \PHPUnit_Framework_TestCase array('DeprecatedParentClass', 'DeprecatedClass', 'extends'), ); } + + public function testDeprecatedSuperInSameNamespace() + { + set_error_handler('var_dump', 0); + $e = error_reporting(0); + trigger_error('', E_USER_NOTICE); + + class_exists(__NAMESPACE__.'\Fixtures\ExtendsDeprecatedParent', true); + + error_reporting($e); + restore_error_handler(); + + $lastError = error_get_last(); + unset($lastError['file'], $lastError['line']); + + $xError = array( + 'type' => E_USER_NOTICE, + 'message' => '', + ); + + $this->assertSame($xError, $lastError); + } } class ClassLoader @@ -217,6 +239,8 @@ class ClassLoader return __DIR__.'/Fixtures/notPsr0Bis.php'; } elseif (__NAMESPACE__.'\Fixtures\DeprecatedInterface' === $class) { return __DIR__.'/Fixtures/DeprecatedInterface.php'; + } elseif (__NAMESPACE__.'\Fixtures\ExtendsDeprecatedParent' === $class) { + eval('namespace '.__NAMESPACE__.'\Fixtures; class ExtendsDeprecatedParent extends DeprecatedClass {}'); } elseif ('Test\\'.__NAMESPACE__.'\DeprecatedParentClass' === $class) { eval('namespace Test\\'.__NAMESPACE__.'; class DeprecatedParentClass extends \\'.__NAMESPACE__.'\Fixtures\DeprecatedClass {}'); } elseif ('Test\\'.__NAMESPACE__.'\DeprecatedInterfaceClass' === $class) { diff --git a/src/Symfony/Component/Debug/composer.json b/src/Symfony/Component/Debug/composer.json index 2e2c784926..42dc36518d 100644 --- a/src/Symfony/Component/Debug/composer.json +++ b/src/Symfony/Component/Debug/composer.json @@ -23,7 +23,7 @@ "symfony/http-kernel": ">=2.3,<2.3.24|~2.4.0|>=2.5,<2.5.9|>=2.6,<2.6.2" }, "require-dev": { - "symfony/class-loader": "~2.2", + "symfony/class-loader": "~2.2|~3.0.0", "symfony/http-kernel": "~2.3.24|~2.5.9|~2.6,>=2.6.2|~3.0.0", "symfony/http-foundation": "~2.1|~3.0.0" },