mirror of
https://we.phorge.it/source/arcanist.git
synced 2024-11-22 14:52:40 +01:00
Add a linter rule for array elements
Summary: Add a linter rule to ensure that array elements occupy a single line each. Test Plan: Added test cases. Reviewers: epriestley, #blessed_reviewers Reviewed By: epriestley, #blessed_reviewers Subscribers: Korvin Differential Revision: https://secure.phabricator.com/D13842
This commit is contained in:
parent
59698df856
commit
830bcbc2a5
3 changed files with 106 additions and 0 deletions
|
@ -15,6 +15,7 @@ phutil_register_library_map(array(
|
||||||
'ArcanistAnoidWorkflow' => 'workflow/ArcanistAnoidWorkflow.php',
|
'ArcanistAnoidWorkflow' => 'workflow/ArcanistAnoidWorkflow.php',
|
||||||
'ArcanistArrayIndexSpacingXHPASTLinterRule' => 'lint/linter/xhpast/rules/ArcanistArrayIndexSpacingXHPASTLinterRule.php',
|
'ArcanistArrayIndexSpacingXHPASTLinterRule' => 'lint/linter/xhpast/rules/ArcanistArrayIndexSpacingXHPASTLinterRule.php',
|
||||||
'ArcanistArraySeparatorXHPASTLinterRule' => 'lint/linter/xhpast/rules/ArcanistArraySeparatorXHPASTLinterRule.php',
|
'ArcanistArraySeparatorXHPASTLinterRule' => 'lint/linter/xhpast/rules/ArcanistArraySeparatorXHPASTLinterRule.php',
|
||||||
|
'ArcanistArrayValueXHPASTLinterRule' => 'lint/linter/xhpast/rules/ArcanistArrayValueXHPASTLinterRule.php',
|
||||||
'ArcanistBackoutWorkflow' => 'workflow/ArcanistBackoutWorkflow.php',
|
'ArcanistBackoutWorkflow' => 'workflow/ArcanistBackoutWorkflow.php',
|
||||||
'ArcanistBaseCommitParser' => 'parser/ArcanistBaseCommitParser.php',
|
'ArcanistBaseCommitParser' => 'parser/ArcanistBaseCommitParser.php',
|
||||||
'ArcanistBaseCommitParserTestCase' => 'parser/__tests__/ArcanistBaseCommitParserTestCase.php',
|
'ArcanistBaseCommitParserTestCase' => 'parser/__tests__/ArcanistBaseCommitParserTestCase.php',
|
||||||
|
@ -292,6 +293,7 @@ phutil_register_library_map(array(
|
||||||
'ArcanistAnoidWorkflow' => 'ArcanistWorkflow',
|
'ArcanistAnoidWorkflow' => 'ArcanistWorkflow',
|
||||||
'ArcanistArrayIndexSpacingXHPASTLinterRule' => 'ArcanistXHPASTLinterRule',
|
'ArcanistArrayIndexSpacingXHPASTLinterRule' => 'ArcanistXHPASTLinterRule',
|
||||||
'ArcanistArraySeparatorXHPASTLinterRule' => 'ArcanistXHPASTLinterRule',
|
'ArcanistArraySeparatorXHPASTLinterRule' => 'ArcanistXHPASTLinterRule',
|
||||||
|
'ArcanistArrayValueXHPASTLinterRule' => 'ArcanistXHPASTLinterRule',
|
||||||
'ArcanistBackoutWorkflow' => 'ArcanistWorkflow',
|
'ArcanistBackoutWorkflow' => 'ArcanistWorkflow',
|
||||||
'ArcanistBaseCommitParser' => 'Phobject',
|
'ArcanistBaseCommitParser' => 'Phobject',
|
||||||
'ArcanistBaseCommitParserTestCase' => 'PhutilTestCase',
|
'ArcanistBaseCommitParserTestCase' => 'PhutilTestCase',
|
||||||
|
|
48
src/lint/linter/__tests__/xhpast/array-value.lint-test
Normal file
48
src/lint/linter/__tests__/xhpast/array-value.lint-test
Normal file
|
@ -0,0 +1,48 @@
|
||||||
|
<?php
|
||||||
|
|
||||||
|
array(
|
||||||
|
1, 2, 3,
|
||||||
|
);
|
||||||
|
|
||||||
|
array(
|
||||||
|
'foo' => 'bar', 'bar' => 'baz',
|
||||||
|
);
|
||||||
|
|
||||||
|
array(
|
||||||
|
1, /* quack */ 2, /* quack */3,
|
||||||
|
);
|
||||||
|
|
||||||
|
array(
|
||||||
|
/* OPEN */ 1,
|
||||||
|
/* CLOSED */ 2,
|
||||||
|
);
|
||||||
|
~~~~~~~~~~
|
||||||
|
warning:4:5
|
||||||
|
warning:4:8
|
||||||
|
warning:8:18
|
||||||
|
warning:12:17
|
||||||
|
warning:12:32
|
||||||
|
~~~~~~~~~~
|
||||||
|
<?php
|
||||||
|
|
||||||
|
array(
|
||||||
|
1,
|
||||||
|
2,
|
||||||
|
3,
|
||||||
|
);
|
||||||
|
|
||||||
|
array(
|
||||||
|
'foo' => 'bar',
|
||||||
|
'bar' => 'baz',
|
||||||
|
);
|
||||||
|
|
||||||
|
array(
|
||||||
|
1, /* quack */
|
||||||
|
2, /* quack */
|
||||||
|
3,
|
||||||
|
);
|
||||||
|
|
||||||
|
array(
|
||||||
|
/* OPEN */ 1,
|
||||||
|
/* CLOSED */ 2,
|
||||||
|
);
|
|
@ -0,0 +1,56 @@
|
||||||
|
<?php
|
||||||
|
|
||||||
|
final class ArcanistArrayValueXHPASTLinterRule
|
||||||
|
extends ArcanistXHPASTLinterRule {
|
||||||
|
|
||||||
|
const ID = 76;
|
||||||
|
|
||||||
|
public function getLintName() {
|
||||||
|
return pht('Array Element');
|
||||||
|
}
|
||||||
|
|
||||||
|
public function getLintSeverity() {
|
||||||
|
return ArcanistLintSeverity::SEVERITY_WARNING;
|
||||||
|
}
|
||||||
|
|
||||||
|
public function process(XHPASTNode $root) {
|
||||||
|
$arrays = $root->selectDescendantsOfType('n_ARRAY_LITERAL');
|
||||||
|
|
||||||
|
foreach ($arrays as $array) {
|
||||||
|
$array_values = $array
|
||||||
|
->getChildOfType(0, 'n_ARRAY_VALUE_LIST')
|
||||||
|
->getChildrenOfType('n_ARRAY_VALUE');
|
||||||
|
|
||||||
|
if (!$array_values) {
|
||||||
|
// There is no need to check an empty array.
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
$multiline = $array->getLineNumber() != $array->getEndLineNumber();
|
||||||
|
|
||||||
|
if (!$multiline) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
foreach ($array_values as $value) {
|
||||||
|
list($before, $after) = $value->getSurroundingNonsemanticTokens();
|
||||||
|
|
||||||
|
if (strpos(implode('', mpull($before, 'getValue')), "\n") === false) {
|
||||||
|
if (last($before)->isAnyWhitespace()) {
|
||||||
|
$token = last($before);
|
||||||
|
$replacement = "\n".$value->getIndentation();
|
||||||
|
} else {
|
||||||
|
$token = head($value->getTokens());
|
||||||
|
$replacement = "\n".$value->getIndentation().$token->getValue();
|
||||||
|
}
|
||||||
|
|
||||||
|
$this->raiseLintAtToken(
|
||||||
|
$token,
|
||||||
|
pht('Array elements should each occupy a single line.'),
|
||||||
|
$replacement);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
Loading…
Reference in a new issue