mirror of
https://we.phorge.it/source/arcanist.git
synced 2024-11-22 14:52:40 +01:00
Improve declaration formatting linter rule for anonymous functions
Summary: Ref T8742. Anonymous functions should have a space after the `function` keyword. Additionally, ensure that there is a space before and after the `use` token. Test Plan: Modified existing test cases. Reviewers: epriestley, #blessed_reviewers Reviewed By: epriestley, #blessed_reviewers Subscribers: Korvin Maniphest Tasks: T8742 Differential Revision: https://secure.phabricator.com/D13804
This commit is contained in:
parent
c304c4e045
commit
9e65fc6516
9 changed files with 79 additions and 37 deletions
|
@ -21,7 +21,7 @@ sprintf('0%o', 0777 & $p);
|
||||||
|
|
||||||
$foo(&$myvar);
|
$foo(&$myvar);
|
||||||
|
|
||||||
array_walk(array(), function() use (&$x) {});
|
array_walk(array(), function () use (&$x) {});
|
||||||
MyClass::myfunc(array(&$x, &$y));
|
MyClass::myfunc(array(&$x, &$y));
|
||||||
~~~~~~~~~~
|
~~~~~~~~~~
|
||||||
error:2:7 XHP19
|
error:2:7 XHP19
|
||||||
|
|
|
@ -20,9 +20,10 @@ final class X {
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
f(function($x) {});
|
f(function ($x) {});
|
||||||
f(function($x ) {});
|
f(function ($x ) {});
|
||||||
f(function($x ) use ($z) {});
|
f(function ($x ) use ($z) {});
|
||||||
|
f(function ($x)use($z) {});
|
||||||
~~~~~~~~~~
|
~~~~~~~~~~
|
||||||
warning:4:14
|
warning:4:14
|
||||||
warning:5:11
|
warning:5:11
|
||||||
|
@ -31,8 +32,10 @@ error:10:13
|
||||||
warning:13:23
|
warning:13:23
|
||||||
warning:16:31
|
warning:16:31
|
||||||
warning:19:33
|
warning:19:33
|
||||||
warning:24:14
|
warning:24:15
|
||||||
warning:25:14
|
warning:25:15
|
||||||
|
warning:26:16
|
||||||
|
warning:26:19
|
||||||
~~~~~~~~~~
|
~~~~~~~~~~
|
||||||
<?php
|
<?php
|
||||||
|
|
||||||
|
@ -56,6 +59,7 @@ final class X {
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
f(function($x) {});
|
f(function ($x) {});
|
||||||
f(function($x) {});
|
f(function ($x) {});
|
||||||
f(function($x) use ($z) {});
|
f(function ($x) use ($z) {});
|
||||||
|
f(function ($x) use ($z) {});
|
||||||
|
|
|
@ -8,7 +8,7 @@ function outer() {
|
||||||
|
|
||||||
// Closures are allowed.
|
// Closures are allowed.
|
||||||
function my_func($foo) {
|
function my_func($foo) {
|
||||||
function() {};
|
function () {};
|
||||||
}
|
}
|
||||||
~~~~~~~~~~
|
~~~~~~~~~~
|
||||||
warning:5:5
|
warning:5:5
|
||||||
|
|
|
@ -21,7 +21,7 @@ final class Quack {
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
function() use ($this_is_a_closure) {};
|
function () use ($this_is_a_closure) {};
|
||||||
|
|
||||||
function f(&$YY) {}
|
function f(&$YY) {}
|
||||||
|
|
||||||
|
|
|
@ -2,9 +2,8 @@
|
||||||
|
|
||||||
namespace a;
|
namespace a;
|
||||||
use b, c;
|
use b, c;
|
||||||
f(function() {});
|
f(function () {});
|
||||||
g(function() use ($c) {});
|
g(function () use ($c) {});
|
||||||
h(function /* ! */ () use ($c) {});
|
|
||||||
static::m();
|
static::m();
|
||||||
1 ? 1 : 2;
|
1 ? 1 : 2;
|
||||||
1 ?: 2;
|
1 ?: 2;
|
||||||
|
@ -16,10 +15,9 @@ error:3:1
|
||||||
error:4:5
|
error:4:5
|
||||||
error:5:3
|
error:5:3
|
||||||
error:6:3
|
error:6:3
|
||||||
error:7:3
|
error:7:1
|
||||||
error:8:1
|
error:9:1
|
||||||
error:10:1
|
error:12:6
|
||||||
error:13:6
|
|
||||||
~~~~~~~~~~
|
~~~~~~~~~~
|
||||||
~~~~~~~~~~
|
~~~~~~~~~~
|
||||||
{
|
{
|
||||||
|
|
|
@ -90,13 +90,13 @@ function variable_variable() {
|
||||||
function closure1() {
|
function closure1() {
|
||||||
$ar = array();
|
$ar = array();
|
||||||
foreach ($ar as &$a) {}
|
foreach ($ar as &$a) {}
|
||||||
function($a) {
|
function ($a) {
|
||||||
$a++;
|
$a++;
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
function closure2() {
|
function closure2() {
|
||||||
function() {
|
function () {
|
||||||
$ar = array();
|
$ar = array();
|
||||||
foreach ($ar as &$a) {}
|
foreach ($ar as &$a) {}
|
||||||
};
|
};
|
||||||
|
@ -104,7 +104,7 @@ function closure2() {
|
||||||
}
|
}
|
||||||
|
|
||||||
function closure3() {
|
function closure3() {
|
||||||
function() {
|
function () {
|
||||||
$ar = array();
|
$ar = array();
|
||||||
foreach ($ar as &$a) {}
|
foreach ($ar as &$a) {}
|
||||||
$a++; // Reuse of $a
|
$a++; // Reuse of $a
|
||||||
|
@ -114,7 +114,7 @@ function closure3() {
|
||||||
function closure4() {
|
function closure4() {
|
||||||
$ar = array();
|
$ar = array();
|
||||||
foreach ($ar as &$a) {}
|
foreach ($ar as &$a) {}
|
||||||
function($a) {
|
function ($a) {
|
||||||
unset($a);
|
unset($a);
|
||||||
};
|
};
|
||||||
$a++; // Reuse of $a
|
$a++; // Reuse of $a
|
||||||
|
|
|
@ -65,7 +65,7 @@ switch ($x) {
|
||||||
}
|
}
|
||||||
case 4:
|
case 4:
|
||||||
function f() { throw new Exception(); }
|
function f() { throw new Exception(); }
|
||||||
g(function() { return; });
|
g(function () { return; });
|
||||||
final class C { public function m() { return; } }
|
final class C { public function m() { return; } }
|
||||||
interface I {}
|
interface I {}
|
||||||
case 5:
|
case 5:
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
<?php
|
<?php
|
||||||
|
|
||||||
function() use ($c) {
|
function () use ($c) {
|
||||||
$c++;
|
$c++;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -173,7 +173,7 @@ function catchy() {
|
||||||
}
|
}
|
||||||
|
|
||||||
function some_func($x, $y) {
|
function some_func($x, $y) {
|
||||||
$func = function($z) use ($x) {
|
$func = function ($z) use ($x) {
|
||||||
echo $x;
|
echo $x;
|
||||||
echo $y;
|
echo $y;
|
||||||
echo $z;
|
echo $z;
|
||||||
|
|
|
@ -32,6 +32,18 @@ final class ArcanistDeclarationParenthesesXHPASTLinterRule
|
||||||
$trailing = $last->getNonsemanticTokensBefore();
|
$trailing = $last->getNonsemanticTokensBefore();
|
||||||
$trailing_text = implode('', mpull($trailing, 'getValue'));
|
$trailing_text = implode('', mpull($trailing, 'getValue'));
|
||||||
|
|
||||||
|
if ($dec->getChildByIndex(2)->getTypeName() == 'n_EMPTY') {
|
||||||
|
// Anonymous functions.
|
||||||
|
if ($leading_text != ' ') {
|
||||||
|
$this->raiseLintAtOffset(
|
||||||
|
$first->getOffset() - strlen($leading_text),
|
||||||
|
pht(
|
||||||
|
'Convention: space before opening parenthesis in '.
|
||||||
|
'anonymous function declarations.'),
|
||||||
|
$leading_text,
|
||||||
|
' ');
|
||||||
|
}
|
||||||
|
} else {
|
||||||
if (preg_match('/^\s+$/', $leading_text)) {
|
if (preg_match('/^\s+$/', $leading_text)) {
|
||||||
$this->raiseLintAtOffset(
|
$this->raiseLintAtOffset(
|
||||||
$first->getOffset() - strlen($leading_text),
|
$first->getOffset() - strlen($leading_text),
|
||||||
|
@ -41,6 +53,7 @@ final class ArcanistDeclarationParenthesesXHPASTLinterRule
|
||||||
$leading_text,
|
$leading_text,
|
||||||
'');
|
'');
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
if (preg_match('/^\s+$/', $trailing_text)) {
|
if (preg_match('/^\s+$/', $trailing_text)) {
|
||||||
$this->raiseLintAtOffset(
|
$this->raiseLintAtOffset(
|
||||||
|
@ -51,6 +64,33 @@ final class ArcanistDeclarationParenthesesXHPASTLinterRule
|
||||||
$trailing_text,
|
$trailing_text,
|
||||||
'');
|
'');
|
||||||
}
|
}
|
||||||
|
|
||||||
|
$use_list = $dec->getChildByIndex(4);
|
||||||
|
if ($use_list->getTypeName() == 'n_EMPTY') {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
$use_token = $use_list->selectTokensOfType('T_USE');
|
||||||
|
|
||||||
|
foreach ($use_token as $use) {
|
||||||
|
$before = $use->getNonsemanticTokensBefore();
|
||||||
|
$after = $use->getNonsemanticTokensAfter();
|
||||||
|
|
||||||
|
if (!$before) {
|
||||||
|
$this->raiseLintAtOffset(
|
||||||
|
$use->getOffset(),
|
||||||
|
pht('Convention: space before `%s` token.', 'use'),
|
||||||
|
'',
|
||||||
|
' ');
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!$after) {
|
||||||
|
$this->raiseLintAtOffset(
|
||||||
|
$use->getOffset() + strlen($use->getValue()),
|
||||||
|
pht('Convention: space after `%s` token.', 'use'),
|
||||||
|
'',
|
||||||
|
' ');
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue