diff --git a/src/__phutil_library_map__.php b/src/__phutil_library_map__.php index 64dc1a44..9b12f49d 100644 --- a/src/__phutil_library_map__.php +++ b/src/__phutil_library_map__.php @@ -171,6 +171,7 @@ phutil_register_library_map(array( 'ArcanistNoLintLinterTestCase' => 'lint/linter/__tests__/ArcanistNoLintLinterTestCase.php', 'ArcanistNoParentScopeXHPASTLinterRule' => 'lint/linter/xhpast/rules/ArcanistNoParentScopeXHPASTLinterRule.php', 'ArcanistNoneLintRenderer' => 'lint/renderer/ArcanistNoneLintRenderer.php', + 'ArcanistObjectOperatorSpacingXHPASTLinterRule' => 'lint/linter/xhpast/rules/ArcanistObjectOperatorSpacingXHPASTLinterRule.php', 'ArcanistPEP8Linter' => 'lint/linter/ArcanistPEP8Linter.php', 'ArcanistPEP8LinterTestCase' => 'lint/linter/__tests__/ArcanistPEP8LinterTestCase.php', 'ArcanistPHPCloseTagXHPASTLinterRule' => 'lint/linter/xhpast/rules/ArcanistPHPCloseTagXHPASTLinterRule.php', @@ -445,6 +446,7 @@ phutil_register_library_map(array( 'ArcanistNoLintLinterTestCase' => 'ArcanistLinterTestCase', 'ArcanistNoParentScopeXHPASTLinterRule' => 'ArcanistXHPASTLinterRule', 'ArcanistNoneLintRenderer' => 'ArcanistLintRenderer', + 'ArcanistObjectOperatorSpacingXHPASTLinterRule' => 'ArcanistXHPASTLinterRule', 'ArcanistPEP8Linter' => 'ArcanistExternalLinter', 'ArcanistPEP8LinterTestCase' => 'ArcanistExternalLinterTestCase', 'ArcanistPHPCloseTagXHPASTLinterRule' => 'ArcanistXHPASTLinterRule', diff --git a/src/lint/linter/__tests__/xhpast/object-operating-spacing.lint-test b/src/lint/linter/__tests__/xhpast/object-operating-spacing.lint-test new file mode 100644 index 00000000..fd20b231 --- /dev/null +++ b/src/lint/linter/__tests__/xhpast/object-operating-spacing.lint-test @@ -0,0 +1,12 @@ + doSomething(); +id(new Something()) + ->doSomething(); +~~~~~~~~~~ +warning:2:3 +warning:2:6 +~~~~~~~~~~ +doSomething(); +id(new Something()) + ->doSomething(); diff --git a/src/lint/linter/xhpast/rules/ArcanistObjectOperatorSpacingXHPASTLinterRule.php b/src/lint/linter/xhpast/rules/ArcanistObjectOperatorSpacingXHPASTLinterRule.php new file mode 100644 index 00000000..8fb7f4a4 --- /dev/null +++ b/src/lint/linter/xhpast/rules/ArcanistObjectOperatorSpacingXHPASTLinterRule.php @@ -0,0 +1,47 @@ +selectTokensOfType('T_OBJECT_OPERATOR'); + + foreach ($operators as $operator) { + $before = $operator->getNonsemanticTokensBefore(); + $after = $operator->getNonsemanticTokensAfter(); + + if ($before) { + $value = implode('', mpull($before, 'getValue')); + + if (strpos($value, "\n") !== false) { + continue; + } + + $this->raiseLintAtOffset( + head($before)->getOffset(), + pht('There should be no whitespace before the object operator.'), + $value, + ''); + } + + if ($after) { + $this->raiseLintAtOffset( + head($after)->getOffset(), + pht('There should be no whitespace after the object operator.'), + implode('', mpull($before, 'getValue')), + ''); + } + } + } + +}