1
0
Fork 0
mirror of https://we.phorge.it/source/arcanist.git synced 2024-11-22 23:02:41 +01:00

Detect use of f()[0] in lint

Summary: XHPAST doesn't currently parse most PHP 5.4 stuff, but it does parse this. Warn about it.

Test Plan:
Unit tests, and:

   Error  (XHP35) Use Of PHP 5.4 Features
    The f()[...] syntax was not introduced until PHP 5.4, but this codebase
    targets an earlier version of PHP. You can rewrite this expression using
    idx().

             365   public function lintPHP54Features($root) {
             366
             367     if (false) {
    >>>      368       id()[0];
                            ^
             369     }
             370

Reviewers: alanh, vrana

Reviewed By: alanh

CC: aran

Differential Revision: https://secure.phabricator.com/D3291
This commit is contained in:
epriestley 2012-08-15 04:36:50 -07:00
parent ab602e3a52
commit a0d4430271
3 changed files with 28 additions and 0 deletions

View file

@ -92,6 +92,8 @@ class PhutilLintEngine extends ArcanistLintEngine {
=> ArcanistLintSeverity::SEVERITY_WARNING, => ArcanistLintSeverity::SEVERITY_WARNING,
ArcanistXHPASTLinter::LINT_PHP_53_FEATURES ArcanistXHPASTLinter::LINT_PHP_53_FEATURES
=> ArcanistLintSeverity::SEVERITY_ERROR, => ArcanistLintSeverity::SEVERITY_ERROR,
ArcanistXHPASTLinter::LINT_PHP_54_FEATURES
=> ArcanistLintSeverity::SEVERITY_ERROR,
ArcanistXHPASTLinter::LINT_COMMENT_SPACING ArcanistXHPASTLinter::LINT_COMMENT_SPACING
=> ArcanistLintSeverity::SEVERITY_ERROR, => ArcanistLintSeverity::SEVERITY_ERROR,
)); ));

View file

@ -58,6 +58,7 @@ final class ArcanistXHPASTLinter extends ArcanistLinter {
const LINT_REUSED_AS_ITERATOR = 32; const LINT_REUSED_AS_ITERATOR = 32;
const LINT_PHT_WITH_DYNAMIC_STRING = 33; const LINT_PHT_WITH_DYNAMIC_STRING = 33;
const LINT_COMMENT_SPACING = 34; const LINT_COMMENT_SPACING = 34;
const LINT_PHP_54_FEATURES = 35;
public function getLintNameMap() { public function getLintNameMap() {
@ -92,6 +93,7 @@ final class ArcanistXHPASTLinter extends ArcanistLinter {
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', self::LINT_PHP_53_FEATURES => 'Use Of PHP 5.3 Features',
self::LINT_PHP_54_FEATURES => 'Use Of PHP 5.4 Features',
self::LINT_REUSED_AS_ITERATOR => 'Variable Reused As Iterator', self::LINT_REUSED_AS_ITERATOR => 'Variable Reused As Iterator',
self::LINT_PHT_WITH_DYNAMIC_STRING => 'Use of pht() on Dynamic String', self::LINT_PHT_WITH_DYNAMIC_STRING => 'Use of pht() on Dynamic String',
self::LINT_COMMENT_SPACING => 'Comment Spaces', self::LINT_COMMENT_SPACING => 'Comment Spaces',
@ -138,6 +140,8 @@ final class ArcanistXHPASTLinter extends ArcanistLinter {
// a specific minimum version. // a specific minimum version.
self::LINT_PHP_53_FEATURES self::LINT_PHP_53_FEATURES
=> ArcanistLintSeverity::SEVERITY_DISABLED, => ArcanistLintSeverity::SEVERITY_DISABLED,
self::LINT_PHP_54_FEATURES
=> ArcanistLintSeverity::SEVERITY_DISABLED,
); );
} }
@ -210,6 +214,7 @@ final class ArcanistXHPASTLinter extends ArcanistLinter {
$this->lintRaggedClasstreeEdges($root); $this->lintRaggedClasstreeEdges($root);
$this->lintImplicitFallthrough($root); $this->lintImplicitFallthrough($root);
$this->lintPHP53Features($root); $this->lintPHP53Features($root);
$this->lintPHP54Features($root);
$this->lintPHT($root); $this->lintPHT($root);
} }
@ -357,6 +362,23 @@ final class ArcanistXHPASTLinter extends ArcanistLinter {
} }
public function lintPHP54Features($root) {
$indexes = $root->selectDescendantsOfType('n_INDEX_ACCESS');
foreach ($indexes as $index) {
$left = $index->getChildByIndex(0);
switch ($left->getTypeName()) {
case 'n_FUNCTION_CALL':
$this->raiseLintAtNode(
$index->getChildByIndex(1),
self::LINT_PHP_54_FEATURES,
"The f()[...] syntax was not introduced until PHP 5.4, but this ".
"codebase targets an earlier version of PHP. You can rewrite ".
"this expression using idx().");
break;
}
}
}
private function lintImplicitFallthrough($root) { private function lintImplicitFallthrough($root) {
$switches = $root->selectDescendantsOfType('n_SWITCH'); $switches = $root->selectDescendantsOfType('n_SWITCH');
foreach ($switches as $switch) { foreach ($switches as $switch) {

View file

@ -0,0 +1,4 @@
<?php
f()[0];
~~~~~~~~~~
disabled:2:5