mirror of
https://we.phorge.it/source/arcanist.git
synced 2024-11-22 14:52:40 +01:00
Improve PHP compatibility linter
Summary: Ref T8674. Adds to `ArcanistPHPCompatibilityXHPASTLinterRule` such that an error is raised whenever `self` or `$this` is used in an anonymous closure prior to PHP 5.4. Test Plan: Added test cases. Reviewers: #blessed_reviewers, epriestley Reviewed By: #blessed_reviewers, epriestley Subscribers: Korvin Maniphest Tasks: T8674 Differential Revision: https://secure.phabricator.com/D13841
This commit is contained in:
parent
9e65fc6516
commit
f43b74c605
2 changed files with 63 additions and 0 deletions
|
@ -6,9 +6,26 @@ f()[0];
|
||||||
// The check above should be this, see T4334.
|
// The check above should be this, see T4334.
|
||||||
// $o->m()[0];
|
// $o->m()[0];
|
||||||
|
|
||||||
|
final class SomeClass extends Phobject {
|
||||||
|
public function someMethod() {
|
||||||
|
return function () {
|
||||||
|
$this->someOtherMethod();
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
public static function someStaticMethod() {
|
||||||
|
return function () {
|
||||||
|
self::someOtherMethod();
|
||||||
|
};
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
~~~~~~~~~~
|
~~~~~~~~~~
|
||||||
error:3:5
|
error:3:5
|
||||||
error:4:9
|
error:4:9
|
||||||
|
error:9:13
|
||||||
|
error:12:7
|
||||||
|
error:18:7
|
||||||
~~~~~~~~~~
|
~~~~~~~~~~
|
||||||
~~~~~~~~~~
|
~~~~~~~~~~
|
||||||
{
|
{
|
||||||
|
|
|
@ -402,6 +402,52 @@ final class ArcanistPHPCompatibilityXHPASTLinterRule
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
$closures = $this->getAnonymousClosures($root);
|
||||||
|
foreach ($closures as $closure) {
|
||||||
|
$static_accesses = $closure
|
||||||
|
->selectDescendantsOfType('n_CLASS_STATIC_ACCESS');
|
||||||
|
|
||||||
|
foreach ($static_accesses as $static_access) {
|
||||||
|
$class = $static_access->getChildByIndex(0);
|
||||||
|
|
||||||
|
if ($class->getTypeName() != 'n_CLASS_NAME') {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (strtolower($class->getConcreteString()) != 'self') {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
$this->raiseLintAtNode(
|
||||||
|
$class,
|
||||||
|
pht(
|
||||||
|
'The use of `%s` in an anonymous closure is not '.
|
||||||
|
'available before PHP 5.4.',
|
||||||
|
'self'));
|
||||||
|
}
|
||||||
|
|
||||||
|
$property_accesses = $closure
|
||||||
|
->selectDescendantsOfType('n_OBJECT_PROPERTY_ACCESS');
|
||||||
|
foreach ($property_accesses as $property_access) {
|
||||||
|
$variable = $property_access->getChildByIndex(0);
|
||||||
|
|
||||||
|
if ($variable->getTypeName() != 'n_VARIABLE') {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
if ($variable->getConcreteString() != '$this') {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
$this->raiseLintAtNode(
|
||||||
|
$variable,
|
||||||
|
pht(
|
||||||
|
'The use of `%s` in an anonymous closure is not '.
|
||||||
|
'available before PHP 5.4.',
|
||||||
|
'$this'));
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private function lintPHP54Incompatibilities(XHPASTNode $root) {
|
private function lintPHP54Incompatibilities(XHPASTNode $root) {
|
||||||
|
|
Loading…
Reference in a new issue