-
Notifications
You must be signed in to change notification settings - Fork 50
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
feat(MultiLineFunctionDeclaration): Add new sniff for multi-line func…
…tion declarations and trailing commas (#3440603)
- Loading branch information
Showing
9 changed files
with
321 additions
and
22 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
129 changes: 129 additions & 0 deletions
129
coder_sniffer/Drupal/Sniffs/Functions/MultiLineFunctionDeclarationSniff.php
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,129 @@ | ||
<?php | ||
/** | ||
* \Drupal\Sniffs\Functions\MultiLineFunctionDeclarationSniff | ||
* | ||
* @category PHP | ||
* @package PHP_CodeSniffer | ||
* @link http://pear.php.net/package/PHP_CodeSniffer | ||
*/ | ||
|
||
namespace Drupal\Sniffs\Functions; | ||
|
||
use PHP_CodeSniffer\Standards\Generic\Sniffs\Functions\OpeningFunctionBraceKernighanRitchieSniff; | ||
use PHP_CodeSniffer\Standards\PEAR\Sniffs\Functions\FunctionDeclarationSniff as PearFunctionDeclarationSniff; | ||
use PHP_CodeSniffer\Standards\Squiz\Sniffs\Functions\MultiLineFunctionDeclarationSniff as SquizFunctionDeclarationSniff; | ||
use PHP_CodeSniffer\Util\Tokens; | ||
|
||
/** | ||
* Multi-line function declarations need to have a trailing comma on the last | ||
* parameter. Modified from Squiz, whenever there is a function declaration | ||
* closing parenthesis on a new line we treat it as multi-line. | ||
* | ||
* @category PHP | ||
* @package PHP_CodeSniffer | ||
* @link http://pear.php.net/package/PHP_CodeSniffer | ||
*/ | ||
class MultiLineFunctionDeclarationSniff extends SquizFunctionDeclarationSniff | ||
{ | ||
|
||
|
||
/** | ||
* The number of spaces code should be indented. | ||
* | ||
* @var integer | ||
*/ | ||
public $indent = 2; | ||
|
||
|
||
/** | ||
* Processes single-line declarations. | ||
* | ||
* Just uses the Generic Kernighan Ritchie sniff. | ||
* | ||
* @param \PHP_CodeSniffer\Files\File $phpcsFile The file being scanned. | ||
* @param int $stackPtr The position of the current token | ||
* in the stack passed in $tokens. | ||
* @param array<int, array<string, mixed>> $tokens The stack of tokens that make up | ||
* the file. | ||
* | ||
* @return void | ||
*/ | ||
public function processSingleLineDeclaration($phpcsFile, $stackPtr, $tokens) | ||
{ | ||
$sniff = new OpeningFunctionBraceKernighanRitchieSniff(); | ||
$sniff->checkClosures = true; | ||
$sniff->process($phpcsFile, $stackPtr); | ||
|
||
}//end processSingleLineDeclaration() | ||
|
||
|
||
/** | ||
* Determine if this is a multi-line function declaration. | ||
* | ||
* @param \PHP_CodeSniffer\Files\File $phpcsFile The file being scanned. | ||
* @param int $stackPtr The position of the current token | ||
* in the stack passed in $tokens. | ||
* @param int $openBracket The position of the opening bracket | ||
* in the stack passed in $tokens. | ||
* @param array<int, array<string, mixed>> $tokens The stack of tokens that make up | ||
* the file. | ||
* | ||
* @return bool | ||
*/ | ||
public function isMultiLineDeclaration($phpcsFile, $stackPtr, $openBracket, $tokens) | ||
{ | ||
$function = $tokens[$stackPtr]; | ||
if ($tokens[$function['parenthesis_opener']]['line'] === $tokens[$function['parenthesis_closer']]['line']) { | ||
return false; | ||
} | ||
|
||
return true; | ||
|
||
}//end isMultiLineDeclaration() | ||
|
||
|
||
/** | ||
* Processes multi-line declarations. | ||
* | ||
* @param \PHP_CodeSniffer\Files\File $phpcsFile The file being scanned. | ||
* @param int $stackPtr The position of the current token | ||
* in the stack passed in $tokens. | ||
* @param array<int, array<string, mixed>> $tokens The stack of tokens that make up | ||
* the file. | ||
* | ||
* @return void | ||
*/ | ||
public function processMultiLineDeclaration($phpcsFile, $stackPtr, $tokens) | ||
{ | ||
// We do everything the grandparent sniff does, and a bit more. | ||
PearFunctionDeclarationSniff::processMultiLineDeclaration($phpcsFile, $stackPtr, $tokens); | ||
|
||
$openBracket = $tokens[$stackPtr]['parenthesis_opener']; | ||
$this->processBracket($phpcsFile, $openBracket, $tokens, 'function'); | ||
|
||
// Trailing commas on the last function parameter are only possible in | ||
// PHP 8.0+. | ||
if (version_compare(PHP_VERSION, '8.0.0') < 0) { | ||
return; | ||
} | ||
|
||
$function = $tokens[$stackPtr]; | ||
|
||
$lastTrailingComma = $phpcsFile->findPrevious( | ||
Tokens::$emptyTokens, | ||
($function['parenthesis_closer'] - 1), | ||
$function['parenthesis_opener'], | ||
true | ||
); | ||
if ($tokens[$lastTrailingComma]['code'] !== T_COMMA) { | ||
$error = 'Multi-line function declarations must have a trailing comma after the last parameter'; | ||
$fix = $phpcsFile->addFixableError($error, $lastTrailingComma, 'MissingTrailingComma'); | ||
if ($fix === true) { | ||
$phpcsFile->fixer->addContent($lastTrailingComma, ','); | ||
} | ||
} | ||
|
||
}//end processMultiLineDeclaration() | ||
|
||
|
||
}//end class |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
51 changes: 51 additions & 0 deletions
51
tests/Drupal/Functions/MultiLineFunctionDeclarationUnitTest.inc
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,51 @@ | ||
<?php | ||
|
||
/** | ||
* @file | ||
* Some description. | ||
*/ | ||
|
||
/** | ||
* Test. | ||
*/ | ||
function missing_trailing_comma( | ||
$a, | ||
$b | ||
) { | ||
|
||
} | ||
|
||
$foo = 1; | ||
$bar = 2; | ||
$x = function ( | ||
$a, | ||
$b | ||
) use ( | ||
$foo, | ||
$bar | ||
) { | ||
|
||
}; | ||
|
||
/** | ||
* | ||
*/ | ||
class Test { | ||
|
||
/** | ||
* Test. | ||
*/ | ||
public function lookupSource(string $key, string $migrationNames = '', array $options = [ | ||
'all' => NULL, | ||
'group' => NULL, | ||
]): void { | ||
} | ||
|
||
} | ||
|
||
$x = function ( | ||
$a, | ||
$b, | ||
) use ($foo, $bar) { | ||
|
||
}; |
55 changes: 55 additions & 0 deletions
55
tests/Drupal/Functions/MultiLineFunctionDeclarationUnitTest.inc.fixed
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,55 @@ | ||
<?php | ||
|
||
/** | ||
* @file | ||
* Some description. | ||
*/ | ||
|
||
/** | ||
* Test. | ||
*/ | ||
function missing_trailing_comma( | ||
$a, | ||
$b, | ||
) { | ||
|
||
} | ||
|
||
$foo = 1; | ||
$bar = 2; | ||
$x = function ( | ||
$a, | ||
$b, | ||
) use ( | ||
$foo, | ||
$bar | ||
) { | ||
|
||
}; | ||
|
||
/** | ||
* | ||
*/ | ||
class Test { | ||
|
||
/** | ||
* Test. | ||
*/ | ||
public function lookupSource( | ||
string $key, | ||
string $migrationNames = '', | ||
array $options = [ | ||
'all' => NULL, | ||
'group' => NULL, | ||
], | ||
): void { | ||
} | ||
|
||
} | ||
|
||
$x = function ( | ||
$a, | ||
$b, | ||
) use ($foo, $bar) { | ||
|
||
}; |
66 changes: 66 additions & 0 deletions
66
tests/Drupal/Functions/MultiLineFunctionDeclarationUnitTest.php
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,66 @@ | ||
<?php | ||
|
||
namespace Drupal\Test\Functions; | ||
|
||
use Drupal\Test\CoderSniffUnitTest; | ||
|
||
class MultiLineFunctionDeclarationUnitTest extends CoderSniffUnitTest | ||
{ | ||
|
||
|
||
/** | ||
* Returns the lines where errors should occur. | ||
* | ||
* The key of the array should represent the line number and the value | ||
* should represent the number of errors that should occur on that line. | ||
* | ||
* @param string $testFile The name of the file being tested. | ||
* | ||
* @return array<int, int> | ||
*/ | ||
protected function getErrorList(string $testFile): array | ||
{ | ||
return [ | ||
13 => 1, | ||
22 => 1, | ||
38 => 3, | ||
41 => 2, | ||
]; | ||
|
||
}//end getErrorList() | ||
|
||
|
||
/** | ||
* Returns the lines where warnings should occur. | ||
* | ||
* The key of the array should represent the line number and the value | ||
* should represent the number of warnings that should occur on that line. | ||
* | ||
* @param string $testFile The name of the file being tested. | ||
* | ||
* @return array<int, int> | ||
*/ | ||
protected function getWarningList(string $testFile): array | ||
{ | ||
return []; | ||
|
||
}//end getWarningList() | ||
|
||
|
||
/** | ||
* Skip this test on PHP versions lower than 8 because the syntax is not allowed there. | ||
* | ||
* @return bool | ||
*/ | ||
protected function shouldSkipTest() | ||
{ | ||
if (version_compare(PHP_VERSION, '8.0.0') < 0) { | ||
return true; | ||
} | ||
|
||
return false; | ||
|
||
}//end shouldSkipTest() | ||
|
||
|
||
}//end class |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -911,7 +911,7 @@ class ScopeKeyword { | |
*/ | ||
function test29( | ||
int $a, | ||
string $b | ||
string $b, | ||
) { | ||
echo "Hello"; | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters