mirror of
https://we.phorge.it/source/arcanist.git
synced 2024-11-26 08:42:40 +01:00
Raise a lint error when code uses a PHP 5.3 feature in Phabricator
Summary: - Add a lint check for PHP 5.3 features (namespaces, anonymous functions). - Add unit tests. - Disable it by default. - Enable it for us. Test Plan: Ran unit tests. Reviewers: btrahan, edward Reviewed By: edward CC: aran, epriestley Maniphest Tasks: T962 Differential Revision: https://secure.phabricator.com/D1846
This commit is contained in:
parent
8f76800efc
commit
aecb8064a1
5 changed files with 74 additions and 0 deletions
|
@ -94,6 +94,8 @@ class PhutilLintEngine extends ArcanistLintEngine {
|
||||||
array(
|
array(
|
||||||
ArcanistXHPASTLinter::LINT_RAGGED_CLASSTREE_EDGE
|
ArcanistXHPASTLinter::LINT_RAGGED_CLASSTREE_EDGE
|
||||||
=> ArcanistLintSeverity::SEVERITY_WARNING,
|
=> ArcanistLintSeverity::SEVERITY_WARNING,
|
||||||
|
ArcanistXHPASTLinter::LINT_PHP_53_FEATURES
|
||||||
|
=> ArcanistLintSeverity::SEVERITY_ERROR,
|
||||||
));
|
));
|
||||||
$license_linter = new ArcanistApacheLicenseLinter();
|
$license_linter = new ArcanistApacheLicenseLinter();
|
||||||
$linters[] = $xhpast_linter;
|
$linters[] = $xhpast_linter;
|
||||||
|
|
|
@ -54,6 +54,7 @@ final class ArcanistXHPASTLinter extends ArcanistLinter {
|
||||||
const LINT_ARRAY_INDEX_SPACING = 28;
|
const LINT_ARRAY_INDEX_SPACING = 28;
|
||||||
const LINT_RAGGED_CLASSTREE_EDGE = 29;
|
const LINT_RAGGED_CLASSTREE_EDGE = 29;
|
||||||
const LINT_IMPLICIT_FALLTHROUGH = 30;
|
const LINT_IMPLICIT_FALLTHROUGH = 30;
|
||||||
|
const LINT_PHP_53_FEATURES = 31;
|
||||||
|
|
||||||
|
|
||||||
public function getLintNameMap() {
|
public function getLintNameMap() {
|
||||||
|
@ -87,6 +88,7 @@ final class ArcanistXHPASTLinter extends ArcanistLinter {
|
||||||
self::LINT_ARRAY_INDEX_SPACING => 'Spacing Before Array Index',
|
self::LINT_ARRAY_INDEX_SPACING => 'Spacing Before Array Index',
|
||||||
self::LINT_RAGGED_CLASSTREE_EDGE => 'Class Not abstract Or final',
|
self::LINT_RAGGED_CLASSTREE_EDGE => 'Class Not abstract Or final',
|
||||||
self::LINT_IMPLICIT_FALLTHROUGH => 'Implicit Fallthrough',
|
self::LINT_IMPLICIT_FALLTHROUGH => 'Implicit Fallthrough',
|
||||||
|
self::LINT_PHP_53_FEATURES => 'Use Of PHP 5.3 Features',
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -120,6 +122,11 @@ final class ArcanistXHPASTLinter extends ArcanistLinter {
|
||||||
// which isn't necessary in the general case.
|
// which isn't necessary in the general case.
|
||||||
self::LINT_RAGGED_CLASSTREE_EDGE
|
self::LINT_RAGGED_CLASSTREE_EDGE
|
||||||
=> ArcanistLintSeverity::SEVERITY_DISABLED,
|
=> ArcanistLintSeverity::SEVERITY_DISABLED,
|
||||||
|
|
||||||
|
// This is disabled by default because projects don't necessarily target
|
||||||
|
// a specific minimum version.
|
||||||
|
self::LINT_PHP_53_FEATURES
|
||||||
|
=> ArcanistLintSeverity::SEVERITY_DISABLED,
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -190,6 +197,56 @@ final class ArcanistXHPASTLinter extends ArcanistLinter {
|
||||||
$this->lintBraceFormatting($root);
|
$this->lintBraceFormatting($root);
|
||||||
$this->lintRaggedClasstreeEdges($root);
|
$this->lintRaggedClasstreeEdges($root);
|
||||||
$this->lintImplicitFallthrough($root);
|
$this->lintImplicitFallthrough($root);
|
||||||
|
$this->lintPHP53Features($root);
|
||||||
|
}
|
||||||
|
|
||||||
|
public function lintPHP53Features($root) {
|
||||||
|
|
||||||
|
$functions = $root->selectTokensOfType('T_FUNCTION');
|
||||||
|
foreach ($functions as $function) {
|
||||||
|
|
||||||
|
$next = $function->getNextToken();
|
||||||
|
while ($next) {
|
||||||
|
if ($next->isSemantic()) {
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
$next = $next->getNextToken();
|
||||||
|
}
|
||||||
|
|
||||||
|
if ($next) {
|
||||||
|
if ($next->getTypeName() == '(') {
|
||||||
|
$this->raiseLintAtToken(
|
||||||
|
$function,
|
||||||
|
self::LINT_PHP_53_FEATURES,
|
||||||
|
'This codebase targets PHP 5.2, but anonymous functions were '.
|
||||||
|
'not introduced until PHP 5.3.');
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
$namespaces = $root->selectTokensOfType('T_NAMESPACE');
|
||||||
|
foreach ($namespaces as $namespace) {
|
||||||
|
$this->raiseLintAtToken(
|
||||||
|
$namespace,
|
||||||
|
self::LINT_PHP_53_FEATURES,
|
||||||
|
'This codebase targets PHP 5.2, but namespaces were not introduced '.
|
||||||
|
'until PHP 5.3.');
|
||||||
|
}
|
||||||
|
|
||||||
|
// NOTE: This is only "use x;", in anonymous functions the node type is
|
||||||
|
// n_LEXICAL_VARIABLE_LIST even though both tokens are T_USE.
|
||||||
|
|
||||||
|
// TODO: We parse n_USE in a slightly crazy way right now; that would be
|
||||||
|
// a better selector once it's fixed.
|
||||||
|
|
||||||
|
$uses = $root->selectDescendantsOfType('n_USE_LIST');
|
||||||
|
foreach ($uses as $use) {
|
||||||
|
$this->raiseLintAtNode(
|
||||||
|
$use,
|
||||||
|
self::LINT_PHP_53_FEATURES,
|
||||||
|
'This codebase targets PHP 5.2, but namespaces were not introduced '.
|
||||||
|
'until PHP 5.3.');
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private function lintImplicitFallthrough($root) {
|
private function lintImplicitFallthrough($root) {
|
||||||
|
|
|
@ -61,6 +61,7 @@ warning:5:25
|
||||||
warning:8:11
|
warning:8:11
|
||||||
warning:12:10
|
warning:12:10
|
||||||
warning:12:13
|
warning:12:13
|
||||||
|
disabled:24:1
|
||||||
warning:26:13
|
warning:26:13
|
||||||
warning:30:3
|
warning:30:3
|
||||||
warning:31:3
|
warning:31:3
|
||||||
|
|
13
src/lint/linter/xhpast/__tests__/data/php53.lint-test
Normal file
13
src/lint/linter/xhpast/__tests__/data/php53.lint-test
Normal file
|
@ -0,0 +1,13 @@
|
||||||
|
<?php
|
||||||
|
|
||||||
|
namespace a;
|
||||||
|
use b, c;
|
||||||
|
f(function() {});
|
||||||
|
g(function() use ($c) {});
|
||||||
|
h(function /* ! */ () use ($c) {});
|
||||||
|
~~~~~~~~~~
|
||||||
|
disabled:3:1
|
||||||
|
disabled:4:5
|
||||||
|
disabled:5:3
|
||||||
|
disabled:6:3
|
||||||
|
disabled:7:3
|
|
@ -161,6 +161,7 @@ function arrow($o, $x) {
|
||||||
}
|
}
|
||||||
|
|
||||||
~~~~~~~~~~
|
~~~~~~~~~~
|
||||||
|
disabled:3:1
|
||||||
error:30:3
|
error:30:3
|
||||||
error:32:3
|
error:32:3
|
||||||
error:38:3
|
error:38:3
|
||||||
|
|
Loading…
Reference in a new issue