mirror of
https://we.phorge.it/source/arcanist.git
synced 2024-11-26 00:32:41 +01:00
Add a linter rule for parentheses being used with PHP language constructs
Summary: Fixes T5648. Test Plan: Added some test cases. Reviewers: epriestley, #blessed_reviewers Reviewed By: epriestley, #blessed_reviewers Subscribers: epriestley, Korvin Maniphest Tasks: T5648 Differential Revision: https://secure.phabricator.com/D10122
This commit is contained in:
parent
26b71baf09
commit
f6e26a7133
3 changed files with 84 additions and 2 deletions
|
@ -45,6 +45,7 @@ final class ArcanistXHPASTLinter extends ArcanistBaseXHPASTLinter {
|
|||
const LINT_SEMICOLON_SPACING = 43;
|
||||
const LINT_CONCATENATION_OPERATOR = 44;
|
||||
const LINT_PHP_COMPATIBILITY = 45;
|
||||
const LINT_LANGUAGE_CONSTRUCT_PAREN = 46;
|
||||
|
||||
private $naminghook;
|
||||
private $switchhook;
|
||||
|
@ -101,6 +102,7 @@ final class ArcanistXHPASTLinter extends ArcanistBaseXHPASTLinter {
|
|||
self::LINT_SEMICOLON_SPACING => 'Semicolon Spacing',
|
||||
self::LINT_CONCATENATION_OPERATOR => 'Concatenation Spacing',
|
||||
self::LINT_PHP_COMPATIBILITY => 'PHP Compatibility',
|
||||
self::LINT_LANGUAGE_CONSTRUCT_PAREN => 'Language Construct Parentheses',
|
||||
);
|
||||
}
|
||||
|
||||
|
@ -138,6 +140,7 @@ final class ArcanistXHPASTLinter extends ArcanistBaseXHPASTLinter {
|
|||
self::LINT_ELSEIF_USAGE => $advice,
|
||||
self::LINT_SEMICOLON_SPACING => $advice,
|
||||
self::LINT_CONCATENATION_OPERATOR => $warning,
|
||||
self::LINT_LANGUAGE_CONSTRUCT_PAREN => $warning,
|
||||
);
|
||||
}
|
||||
|
||||
|
@ -187,7 +190,7 @@ final class ArcanistXHPASTLinter extends ArcanistBaseXHPASTLinter {
|
|||
|
||||
public function getVersion() {
|
||||
// The version number should be incremented whenever a new rule is added.
|
||||
return '7';
|
||||
return '8';
|
||||
}
|
||||
|
||||
protected function resolveFuture($path, Future $future) {
|
||||
|
@ -255,6 +258,7 @@ final class ArcanistXHPASTLinter extends ArcanistBaseXHPASTLinter {
|
|||
'lintSpaceAroundConcatenationOperators' =>
|
||||
self::LINT_CONCATENATION_OPERATOR,
|
||||
'lintPHPCompatibility' => self::LINT_PHP_COMPATIBILITY,
|
||||
'lintLanguageConstructParentheses' => self::LINT_LANGUAGE_CONSTRUCT_PAREN,
|
||||
);
|
||||
|
||||
foreach ($method_codes as $method => $codes) {
|
||||
|
@ -2521,6 +2525,36 @@ final class ArcanistXHPASTLinter extends ArcanistBaseXHPASTLinter {
|
|||
}
|
||||
}
|
||||
|
||||
protected function lintLanguageConstructParentheses(XHPASTNode $root) {
|
||||
$nodes = $root->selectDescendantsOfTypes(array(
|
||||
'n_INCLUDE_FILE',
|
||||
'n_ECHO_LIST',
|
||||
));
|
||||
|
||||
foreach ($nodes as $node) {
|
||||
$child = head($node->getChildren());
|
||||
|
||||
if ($child->getTypeName() === 'n_PARENTHETICAL_EXPRESSION') {
|
||||
list($before, $after) = $child->getSurroundingNonsemanticTokens();
|
||||
|
||||
$replace = preg_replace(
|
||||
'/^\((.*)\)$/',
|
||||
'$1',
|
||||
$child->getConcreteString());
|
||||
|
||||
if (!$before) {
|
||||
$replace = ' '.$replace;
|
||||
}
|
||||
|
||||
$this->raiseLintAtNode(
|
||||
$child,
|
||||
self::LINT_LANGUAGE_CONSTRUCT_PAREN,
|
||||
pht('Language constructs do not require parentheses.'),
|
||||
$replace);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public function getSuperGlobalNames() {
|
||||
return array(
|
||||
'$GLOBALS',
|
||||
|
|
|
@ -0,0 +1,48 @@
|
|||
<?php
|
||||
include 'foo.php';
|
||||
include_once 'foo.php';
|
||||
require 'foo.php';
|
||||
require_once 'foo.php';
|
||||
echo 'foo';
|
||||
|
||||
include('bar.php');
|
||||
include_once('bar.php');
|
||||
require('bar.php');
|
||||
require_once('bar.php');
|
||||
echo('bar');
|
||||
|
||||
include ('baz.php');
|
||||
include_once ('baz.php');
|
||||
require ('baz.php');
|
||||
require_once ('baz.php');
|
||||
echo ('baz');
|
||||
~~~~~~~~~~
|
||||
warning:8:8
|
||||
warning:9:13
|
||||
warning:10:8
|
||||
warning:11:13
|
||||
warning:12:5
|
||||
warning:14:9
|
||||
warning:15:14
|
||||
warning:16:9
|
||||
warning:17:14
|
||||
warning:18:6
|
||||
~~~~~~~~~~
|
||||
<?php
|
||||
include 'foo.php';
|
||||
include_once 'foo.php';
|
||||
require 'foo.php';
|
||||
require_once 'foo.php';
|
||||
echo 'foo';
|
||||
|
||||
include 'bar.php';
|
||||
include_once 'bar.php';
|
||||
require 'bar.php';
|
||||
require_once 'bar.php';
|
||||
echo 'bar';
|
||||
|
||||
include 'baz.php';
|
||||
include_once 'baz.php';
|
||||
require 'baz.php';
|
||||
require_once 'baz.php';
|
||||
echo 'baz';
|
|
@ -141,7 +141,7 @@ abstract class P {
|
|||
|
||||
function x() {
|
||||
$lib = $_SERVER['PHP_ROOT'].'/lib/titan/display/read/init.php';
|
||||
require_once($lib);
|
||||
require_once $lib;
|
||||
f(((($lib)))); // Tests for paren expressions.
|
||||
f(((($lub))));
|
||||
}
|
||||
|
|
Loading…
Reference in a new issue