From 5f4e968cb94cd1df5757f94e59fa890ae7e38542 Mon Sep 17 00:00:00 2001 From: Peter Rehm Date: Sat, 9 Jan 2016 17:31:38 +0100 Subject: [PATCH] Fixed erroneous deprecation notice for extended Interfaces --- .../Component/Debug/DebugClassLoader.php | 19 ++++++++++++++- .../Debug/Tests/DebugClassLoaderTest.php | 24 +++++++++++++++++++ .../Tests/Fixtures/NonDeprecatedInterface.php | 7 ++++++ 3 files changed, 49 insertions(+), 1 deletion(-) create mode 100644 src/Symfony/Component/Debug/Tests/Fixtures/NonDeprecatedInterface.php diff --git a/src/Symfony/Component/Debug/DebugClassLoader.php b/src/Symfony/Component/Debug/DebugClassLoader.php index 95ccc8798e8c1..a67c4eae7b5ff 100644 --- a/src/Symfony/Component/Debug/DebugClassLoader.php +++ b/src/Symfony/Component/Debug/DebugClassLoader.php @@ -200,8 +200,25 @@ public function loadClass($class) @trigger_error(sprintf('The %s class extends %s that is deprecated %s', $name, $parent->name, self::$deprecated[$parent->name]), E_USER_DEPRECATED); } + $parentInterfaces = array(); + $deprecatedInterfaces = array(); + if ($parent) { + foreach ($parent->getInterfaceNames() as $interface) { + $parentInterfaces[$interface] = 1; + } + } + foreach ($refl->getInterfaceNames() as $interface) { - if (isset(self::$deprecated[$interface]) && strncmp($ns, $interface, $len) && !($parent && $parent->implementsInterface($interface))) { + if (isset(self::$deprecated[$interface]) && strncmp($ns, $interface, $len)) { + $deprecatedInterfaces[] = $interface; + } + foreach (class_implements($interface) as $interface) { + $parentInterfaces[$interface] = 1; + } + } + + foreach ($deprecatedInterfaces as $interface) { + if (!isset($parentInterfaces[$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 1516dbedf9a00..8c267139515d1 100644 --- a/src/Symfony/Component/Debug/Tests/DebugClassLoaderTest.php +++ b/src/Symfony/Component/Debug/Tests/DebugClassLoaderTest.php @@ -203,6 +203,28 @@ public function provideDeprecatedSuper() ); } + public function testInterfaceExtendsDeprecatedInterface() + { + set_error_handler('var_dump', 0); + $e = error_reporting(0); + trigger_error('', E_USER_NOTICE); + + class_exists('Test\\'.__NAMESPACE__.'\\NonDeprecatedInterfaceClass', 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); + } + public function testDeprecatedSuperInSameNamespace() { set_error_handler('var_dump', 0); @@ -289,6 +311,8 @@ public function findFile($class) eval('namespace Test\\'.__NAMESPACE__.'; class DeprecatedParentClass extends \\'.__NAMESPACE__.'\Fixtures\DeprecatedClass {}'); } elseif ('Test\\'.__NAMESPACE__.'\DeprecatedInterfaceClass' === $class) { eval('namespace Test\\'.__NAMESPACE__.'; class DeprecatedInterfaceClass implements \\'.__NAMESPACE__.'\Fixtures\DeprecatedInterface {}'); + } elseif ('Test\\'.__NAMESPACE__.'\NonDeprecatedInterfaceClass' === $class) { + eval('namespace Test\\'.__NAMESPACE__.'; class NonDeprecatedInterfaceClass implements \\'.__NAMESPACE__.'\Fixtures\NonDeprecatedInterface {}'); } elseif ('Test\\'.__NAMESPACE__.'\Float' === $class) { eval('namespace Test\\'.__NAMESPACE__.'; class Float {}'); } diff --git a/src/Symfony/Component/Debug/Tests/Fixtures/NonDeprecatedInterface.php b/src/Symfony/Component/Debug/Tests/Fixtures/NonDeprecatedInterface.php new file mode 100644 index 0000000000000..a4179a577f9bf --- /dev/null +++ b/src/Symfony/Component/Debug/Tests/Fixtures/NonDeprecatedInterface.php @@ -0,0 +1,7 @@ +