Page Menu
Home
Phabricator
Search
Configure Global Search
Log In
Files
F13996175
D9314.id22095.diff
No One
Temporary
Actions
View File
Edit File
Delete File
View Transforms
Subscribe
Mute Notifications
Award Token
Flag For Later
Size
5 KB
Referenced Files
None
Subscribers
None
D9314.id22095.diff
View Options
diff --git a/src/lint/linter/ArcanistXHPASTLinter.php b/src/lint/linter/ArcanistXHPASTLinter.php
--- a/src/lint/linter/ArcanistXHPASTLinter.php
+++ b/src/lint/linter/ArcanistXHPASTLinter.php
@@ -46,6 +46,7 @@
const LINT_DOUBLE_QUOTE = 41;
const LINT_ELSEIF_USAGE = 42;
const LINT_SEMICOLON_SPACING = 43;
+ const LINT_CONCATENATION_OPERATOR = 44;
private $naminghook;
private $switchhook;
@@ -105,6 +106,7 @@
self::LINT_DOUBLE_QUOTE => 'Unnecessary Double Quotes',
self::LINT_ELSEIF_USAGE => 'ElseIf Usage',
self::LINT_SEMICOLON_SPACING => 'Semicolon Spacing',
+ self::LINT_CONCATENATION_OPERATOR => 'Concatenation Spacing',
);
}
@@ -141,6 +143,7 @@
self::LINT_DOUBLE_QUOTE => $advice,
self::LINT_ELSEIF_USAGE => $advice,
self::LINT_SEMICOLON_SPACING => $advice,
+ self::LINT_CONCATENATION_OPERATOR => $warning,
// This is disabled by default because it implies a very strict policy
// which isn't necessary in the general case.
@@ -184,7 +187,7 @@
}
public function getCacheVersion() {
- $version = '4';
+ $version = '5';
$path = xhpast_get_binary_path();
if (Filesystem::pathExists($path)) {
$version .= '-'.md5_file($path);
@@ -257,6 +260,8 @@
'lintStrings' => self::LINT_DOUBLE_QUOTE,
'lintElseIfStatements' => self::LINT_ELSEIF_USAGE,
'lintSemicolons' => self::LINT_SEMICOLON_SPACING,
+ 'lintSpaceAroundConcatenationOperators' =>
+ self::LINT_CONCATENATION_OPERATOR,
);
foreach ($method_codes as $method => $codes) {
@@ -1882,10 +1887,6 @@
}
protected function lintSpaceAroundBinaryOperators(XHPASTNode $root) {
-
- // NOTE: '.' is parsed as n_CONCATENATION_LIST, not n_BINARY_EXPRESSION,
- // so we don't select it here.
-
$expressions = $root->selectDescendantsOfType('n_BINARY_EXPRESSION');
foreach ($expressions as $expression) {
$operator = $expression->getChildByIndex(1);
@@ -1918,7 +1919,6 @@
case ')':
case 'T_WHITESPACE':
break;
- break;
default:
$this->raiseLintAtToken(
$token,
@@ -1929,11 +1929,65 @@
}
}
- // TODO: Spacing around ".".
+ $tokens = $root->selectTokensOfType('T_DOUBLE_ARROW');
+ foreach ($tokens as $token) {
+ $prev = $token->getPrevToken();
+ $next = $token->getNextToken();
+
+ $prev_type = $prev->getTypeName();
+ $next_type = $next->getTypeName();
+
+ $prev_space = ($prev_type == 'T_WHITESPACE');
+ $next_space = ($next_type == 'T_WHITESPACE');
+
+ $replace = null;
+ if (!$prev_space && !$next_space) {
+ $replace = ' => ';
+ } else if ($prev_space && !$next_space) {
+ $replace = '=> ';
+ } else if (!$prev_space && $next_space) {
+ $replace = ' =>';
+ }
+
+ if ($replace !== null) {
+ $this->raiseLintAtToken(
+ $token,
+ self::LINT_BINARY_EXPRESSION_SPACING,
+ 'Convention: double arrow should be surrounded by whitespace.',
+ $replace);
+ }
+ }
+
// TODO: Spacing around default parameter assignment in function/method
// declarations (which is not n_BINARY_EXPRESSION).
}
+ protected function lintSpaceAroundConcatenationOperators(XHPASTNode $root) {
+ $tokens = $root->selectTokensOfType('.');
+ foreach ($tokens as $token) {
+ $prev = $token->getPrevToken();
+ $next = $token->getNextToken();
+
+ foreach (array('prev' => $prev, 'next' => $next) as $wtoken) {
+ if ($wtoken->getTypeName() != 'T_WHITESPACE') {
+ continue;
+ }
+
+ $value = $wtoken->getValue();
+ if (strpos($value, "\n") !== false) {
+ // If the whitespace has a newline, it's conventional.
+ continue;
+ }
+
+ $this->raiseLintAtToken(
+ $wtoken,
+ self::LINT_BINARY_EXPRESSION_SPACING,
+ 'Convention: no spaces around "." (string concatenation) operator.',
+ '');
+ }
+ }
+ }
+
protected function lintDynamicDefines(XHPASTNode $root) {
$calls = $root->selectDescendantsOfType('n_FUNCTION_CALL');
foreach ($calls as $call) {
diff --git a/src/lint/linter/__tests__/xhpast/space-around-more-operators.lint-test b/src/lint/linter/__tests__/xhpast/space-around-more-operators.lint-test
new file mode 100644
--- /dev/null
+++ b/src/lint/linter/__tests__/xhpast/space-around-more-operators.lint-test
@@ -0,0 +1,56 @@
+<?php
+$a.$b;
+$a . $b;
+$a. $b;
+$a .$b;
+$a.
+$b;
+
+array($x => $y);
+array($x=>$y);
+array($x =>$y);
+array($x=> $y);
+
+array(
+ $x => $y,
+);
+array(
+ $x =>
+ $y,
+);
+array(
+ $x=>$y,
+);
+~~~~~~~~~~
+warning:3:3
+warning:3:5
+warning:4:4
+warning:5:3
+warning:10:9
+warning:11:10
+warning:12:9
+warning:22:5
+~~~~~~~~~~
+<?php
+$a.$b;
+$a.$b;
+$a.$b;
+$a.$b;
+$a.
+$b;
+
+array($x => $y);
+array($x => $y);
+array($x => $y);
+array($x => $y);
+
+array(
+ $x => $y,
+);
+array(
+ $x =>
+ $y,
+);
+array(
+ $x => $y,
+);
File Metadata
Details
Attached
Mime Type
text/plain
Expires
Thu, Oct 24, 6:39 PM (2 w, 5 d ago)
Storage Engine
blob
Storage Format
Encrypted (AES-256-CBC)
Storage Handle
6733866
Default Alt Text
D9314.id22095.diff (5 KB)
Attached To
Mode
D9314: Add lint rules for `=>` (fat arrow) and `.` (string concatenation)
Attached
Detach File
Event Timeline
Log In to Comment