8000 feature #13665 [Debug] generalize deprecated interfaces tracking (nic… · symfony/symfony@74bdb8f · GitHub
[go: up one dir, main page]

Skip to content

Commit 74bdb8f

Browse files
committed
feature #13665 [Debug] generalize deprecated interfaces tracking (nicolas-grekas)
This PR was merged into the 2.7 branch. Discussion ---------- [Debug] generalize deprecated interfaces tracking | Q | A | ------------- | --- | Bug fix? | no | New feature? | yes | BC breaks? | no | Deprecations? | no | Tests pass? | yes | Fixed tickets | #13544 | License | MIT | Doc PR | - Commits ------- a756f5b [Debug] generalize deprecated interfaces tracking
2 parents d61ffa9 + a756f5b commit 74bdb8f

File tree

3 files changed

+35
-8
lines changed

3 files changed

+35
-8
lines changed

src/Symfony/Component/Debug/DebugClassLoader.php

Lines changed: 10 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -179,16 +179,19 @@ public function loadClass($class)
179179

180180
if (preg_match('#\n \* @deprecated (.*?)\r?\n \*(?: @|/$)#s', $refl->getDocComment(), $notice)) {
181181
self::$deprecated[$name] = preg_replace('#\s*\r?\n \* +#', ' ', $notice[1]);
182-
} elseif (0 !== strpos($name, 'Symfony\\')) {
182+
} else {
183+
$len = 1 + (strpos($name, '\\', 1 + strpos($name, '\\')) ?: strpos($name, '_'));
183184
$parent = $refl->getParentClass();
184185

185-
if ($parent && isset(self::$deprecated[$parent->name])) {
186-
trigger_error(sprintf('The %s class extends %s that is deprecated %s', $name, $parent->name, self::$deprecated[$parent->name]), E_USER_DEPRECATED);
187-
}
186+
if (!$parent || $len < 2 || strncmp($name, $parent, $len)) {
187+
if ($parent && isset(self::$deprecated[$parent->name]) && ($len < 2 || strncmp($name, $parent->name, $len))) {
188+
trigger_error(sprintf('The %s class extends %s that is deprecated %s', $name, $parent->name, self::$deprecated[$parent->name]), E_USER_DEPRECATED);
189+
}
188190

189-
foreach ($refl->getInterfaceNames() as $interface) {
190-
if (isset(self::$deprecated[$interface]) && !($parent && $parent->implementsInterface($interface))) {
191-
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);
191+
foreach ($refl->getInterfaceNames() as $interface) {
192+
if (isset(self::$deprecated[$interface]) && ($len < 2 || strncmp($name, $interface, $len)) && !($parent && $parent->implementsInterface($interface))) {
193+
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);
194+
}
192195
}
193196
}
194197
}

src/Symfony/Component/Debug/Tests/DebugClassLoaderTest.php

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -186,6 +186,28 @@ public function provideDeprecatedSuper()
186186
array('DeprecatedParentClass', 'DeprecatedClass', 'extends'),
187187
);
188188
}
189+
190+
public function testDeprecatedSuperInSameNamespace()
191+
{
192+
set_error_handler('var_dump', 0);
193+
$e = error_reporting(0);
194+
trigger_error('', E_USER_NOTICE);
195+
196+
class_exists(__NAMESPACE__.'\Fixtures\ExtendsDeprecatedParent', true);
197+
198+
error_reporting($e);
199+
restore_error_handler();
200+
201+
$lastError = error_get_last();
202+
unset($lastError['file'], $lastError['line']);
203+
204+
$xError = array(
205+
'type' => E_USER_NOTICE,
206+
'message' => '',
207+
);
208+
209+
$this->assertSame($xError, $lastError);
210+
}
189211
}
190212

191213
class ClassLoader
@@ -217,6 +239,8 @@ public function findFile($class)
217239
return __DIR__.'/Fixtures/notPsr0Bis.php';
218240
} elseif (__NAMESPACE__.'\Fixtures\DeprecatedInterface' === $class) {
219241
return __DIR__.'/Fixtures/DeprecatedInterface.php';
242+
} elseif (__NAMESPACE__.'\Fixtures\ExtendsDeprecatedParent' === $class) {
243+
eval('namespace '.__NAMESPACE__.'\Fixtures; class ExtendsDeprecatedParent extends DeprecatedClass {}');
220244
} elseif ('Test\\'.__NAMESPACE__.'\DeprecatedParentClass' === $class) {
221245
eval('namespace Test\\'.__NAMESPACE__.'; class DeprecatedParentClass extends \\'.__NAMESPACE__.'\Fixtures\DeprecatedClass {}');
222246
} elseif ('Test\\'.__NAMESPACE__.'\DeprecatedInterfaceClass' === $class) {

src/Symfony/Component/Debug/composer.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,7 @@
2323
"symfony/http-kernel": ">=2.3,<2.3.24|~2.4.0|>=2.5,<2.5.9|>=2.6,<2.6.2"
2424
},
2525
"require-dev": {
26-
"symfony/class-loader": "~2.2",
26+
"symfony/class-loader": "~2.2|~3.0.0",
2727
"symfony/http-kernel": "~2.3.24|~2.5.9|~2.6,>=2.6.2|~3.0.0",
2828
"symfony/http-foundation": "~2.1|~3.0.0"
2929
},

0 commit comments

Comments
 (0)
0