mirror of
https://we.phorge.it/source/arcanist.git
synced 2025-02-16 16:58:38 +01:00
Tautological expression lint.
This commit is contained in:
parent
db9f629499
commit
4b51720ba1
4 changed files with 58 additions and 3 deletions
|
@ -6,7 +6,6 @@
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
phutil_require_module('arcanist', 'exception/usage');
|
|
||||||
phutil_require_module('arcanist', 'lint/linter/base');
|
phutil_require_module('arcanist', 'lint/linter/base');
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -39,6 +39,7 @@ class ArcanistXHPASTLinter extends ArcanistLinter {
|
||||||
const LINT_EXIT_EXPRESSION = 17;
|
const LINT_EXIT_EXPRESSION = 17;
|
||||||
const LINT_COMMENT_STYLE = 18;
|
const LINT_COMMENT_STYLE = 18;
|
||||||
const LINT_CLASS_FILENAME_MISMATCH = 19;
|
const LINT_CLASS_FILENAME_MISMATCH = 19;
|
||||||
|
const LINT_TAUTOLOGICAL_EXPRESSION = 20;
|
||||||
|
|
||||||
|
|
||||||
public function getLintNameMap() {
|
public function getLintNameMap() {
|
||||||
|
@ -62,6 +63,7 @@ class ArcanistXHPASTLinter extends ArcanistLinter {
|
||||||
self::LINT_EXIT_EXPRESSION => 'Exit Used as Expression',
|
self::LINT_EXIT_EXPRESSION => 'Exit Used as Expression',
|
||||||
self::LINT_COMMENT_STYLE => 'Comment Style',
|
self::LINT_COMMENT_STYLE => 'Comment Style',
|
||||||
self::LINT_CLASS_FILENAME_MISMATCH => 'Class-Filename Mismatch',
|
self::LINT_CLASS_FILENAME_MISMATCH => 'Class-Filename Mismatch',
|
||||||
|
self::LINT_TAUTOLOGICAL_EXPRESSION => 'Tautological Expression',
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -108,7 +110,7 @@ class ArcanistXHPASTLinter extends ArcanistLinter {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public function getXHPASTTreeForPath($path) {
|
public function getXHPASTTreeForPath($path) {
|
||||||
return idx($this->trees, $path);
|
return idx($this->trees, $path);
|
||||||
}
|
}
|
||||||
|
@ -136,6 +138,42 @@ class ArcanistXHPASTLinter extends ArcanistLinter {
|
||||||
$this->lintArrayIndexWhitespace($root);
|
$this->lintArrayIndexWhitespace($root);
|
||||||
$this->lintHashComments($root);
|
$this->lintHashComments($root);
|
||||||
$this->lintPrimaryDeclarationFilenameMatch($root);
|
$this->lintPrimaryDeclarationFilenameMatch($root);
|
||||||
|
$this->lintTautologicalExpressions($root);
|
||||||
|
}
|
||||||
|
|
||||||
|
private function lintTautologicalExpressions($root) {
|
||||||
|
$expressions = $root->selectDescendantsOfType('n_BINARY_EXPRESSION');
|
||||||
|
|
||||||
|
static $operators = array(
|
||||||
|
'-' => true,
|
||||||
|
'/' => true,
|
||||||
|
'-=' => true,
|
||||||
|
'/=' => true,
|
||||||
|
'<=' => true,
|
||||||
|
'<' => true,
|
||||||
|
'==' => true,
|
||||||
|
'===' => true,
|
||||||
|
'>=' => true,
|
||||||
|
'>' => true,
|
||||||
|
);
|
||||||
|
|
||||||
|
foreach ($expressions as $expr) {
|
||||||
|
$operator = $expr->getChildByIndex(1)->getConcreteString();
|
||||||
|
if (empty($operators[$operator])) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
$left = $expr->getChildByIndex(0)->getSemanticString();
|
||||||
|
$right = $expr->getChildByIndex(2)->getSemanticString();
|
||||||
|
|
||||||
|
if ($left == $right) {
|
||||||
|
$this->raiseLintAtNode(
|
||||||
|
$expr,
|
||||||
|
self::LINT_TAUTOLOGICAL_EXPRESSION,
|
||||||
|
'Both sides of this expression are identical, so it always '.
|
||||||
|
'evaluates to a constant.');
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
protected function lintHashComments($root) {
|
protected function lintHashComments($root) {
|
||||||
|
|
|
@ -0,0 +1,18 @@
|
||||||
|
<?php
|
||||||
|
|
||||||
|
if ($x == $x) {
|
||||||
|
}
|
||||||
|
|
||||||
|
if ($x->m(3) < $x->m(3)) {
|
||||||
|
}
|
||||||
|
|
||||||
|
if ($y[2] - $y[2]) {
|
||||||
|
}
|
||||||
|
|
||||||
|
if ($x == $y) {
|
||||||
|
}
|
||||||
|
|
||||||
|
~~~~~~~~~~
|
||||||
|
error:3:5
|
||||||
|
error:6:5
|
||||||
|
error:9:5
|
|
@ -166,7 +166,7 @@ EOTEXT
|
||||||
case self::SOURCE_LOCAL:
|
case self::SOURCE_LOCAL:
|
||||||
$repository_api = $this->getRepositoryAPI();
|
$repository_api = $this->getRepositoryAPI();
|
||||||
$parser = new ArcanistDiffParser();
|
$parser = new ArcanistDiffParser();
|
||||||
|
|
||||||
if ($repository_api instanceof ArcanistGitAPI) {
|
if ($repository_api instanceof ArcanistGitAPI) {
|
||||||
$this->parseGitRelativeCommit(
|
$this->parseGitRelativeCommit(
|
||||||
$repository_api,
|
$repository_api,
|
||||||
|
|
Loading…
Add table
Reference in a new issue