From 4cdc608eeb1fe6a035d82bac9390380c848c3cc8 Mon Sep 17 00:00:00 2001 From: Klaus Purer Date: Sat, 20 Apr 2024 18:57:42 +0200 Subject: [PATCH] feat(MultiLineFunctionDeclaration): Add new sniff for multi-line function declarations and trailing commas --- .../Functions/FunctionDeclarationSniff.php | 2 +- .../MultiLineFunctionDeclarationSniff.php | 125 ++++++++++++++++++ .../Functions/MultiLineTrailingCommaSniff.php | 82 ------------ coder_sniffer/Drupal/ruleset.xml | 18 --- .../MultiLineFunctionDeclarationUnitTest.inc | 44 ++++++ ...iLineFunctionDeclarationUnitTest.inc.fixed | 48 +++++++ ... MultiLineFunctionDeclarationUnitTest.php} | 8 +- .../MultiLineTrailingCommaUnitTest.inc | 23 ---- .../MultiLineTrailingCommaUnitTestinc.fixed | 23 ---- 9 files changed, 223 insertions(+), 150 deletions(-) create mode 100644 coder_sniffer/Drupal/Sniffs/Functions/MultiLineFunctionDeclarationSniff.php delete mode 100644 coder_sniffer/Drupal/Sniffs/Functions/MultiLineTrailingCommaSniff.php create mode 100644 tests/Drupal/Functions/MultiLineFunctionDeclarationUnitTest.inc create mode 100644 tests/Drupal/Functions/MultiLineFunctionDeclarationUnitTest.inc.fixed rename tests/Drupal/Functions/{MultiLineTrailingCommaUnitTest.php => MultiLineFunctionDeclarationUnitTest.php} (89%) delete mode 100644 tests/Drupal/Functions/MultiLineTrailingCommaUnitTest.inc delete mode 100644 tests/Drupal/Functions/MultiLineTrailingCommaUnitTestinc.fixed diff --git a/coder_sniffer/Drupal/Sniffs/Functions/FunctionDeclarationSniff.php b/coder_sniffer/Drupal/Sniffs/Functions/FunctionDeclarationSniff.php index b4cdcdd0..923ff9fe 100644 --- a/coder_sniffer/Drupal/Sniffs/Functions/FunctionDeclarationSniff.php +++ b/coder_sniffer/Drupal/Sniffs/Functions/FunctionDeclarationSniff.php @@ -17,7 +17,7 @@ * before the opening parenthesis. * * @deprecated in Coder 8.x, will be removed in Coder 9.x. - * Squiz.Functions.MultiLineFunctionDeclaration is used instead, see ruleset.xml. + * MultiLineFunctionDeclarationSniff is used instead. * * @category PHP * @package PHP_CodeSniffer diff --git a/coder_sniffer/Drupal/Sniffs/Functions/MultiLineFunctionDeclarationSniff.php b/coder_sniffer/Drupal/Sniffs/Functions/MultiLineFunctionDeclarationSniff.php new file mode 100644 index 00000000..1c03cf80 --- /dev/null +++ b/coder_sniffer/Drupal/Sniffs/Functions/MultiLineFunctionDeclarationSniff.php @@ -0,0 +1,125 @@ +> $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> $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> $tokens The stack of tokens that make up + * the file. + * + * @return void + */ + public function processMultiLineDeclaration($phpcsFile, $stackPtr, $tokens) + { + // We do everything the parent sniff does, and a bit more. + parent::processMultiLineDeclaration($phpcsFile, $stackPtr, $tokens); + + // 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 diff --git a/coder_sniffer/Drupal/Sniffs/Functions/MultiLineTrailingCommaSniff.php b/coder_sniffer/Drupal/Sniffs/Functions/MultiLineTrailingCommaSniff.php deleted file mode 100644 index 805996fb..00000000 --- a/coder_sniffer/Drupal/Sniffs/Functions/MultiLineTrailingCommaSniff.php +++ /dev/null @@ -1,82 +0,0 @@ - - */ - public function register() - { - if (version_compare(PHP_VERSION, '8.0.0') < 0) { - return []; - } - - return [ - T_FUNCTION, - T_CLOSURE, - ]; - - }//end register() - - - /** - * Processes this test, when one of its tokens is encountered. - * - * @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. - * - * @return void - */ - public function process(File $phpcsFile, $stackPtr) - { - $tokens = $phpcsFile->getTokens(); - - $function = $tokens[$stackPtr]; - if ($tokens[$function['parenthesis_opener']]['line'] === $tokens[$function['parenthesis_closer']]['line']) { - return; - } - - $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 process() - - -}//end class diff --git a/coder_sniffer/Drupal/ruleset.xml b/coder_sniffer/Drupal/ruleset.xml index 99baff4e..73bb669d 100644 --- a/coder_sniffer/Drupal/ruleset.xml +++ b/coder_sniffer/Drupal/ruleset.xml @@ -53,11 +53,6 @@ 0 - - - - - @@ -255,19 +250,6 @@ 0 - - - - - - - - 0 - - - 0 - - diff --git a/tests/Drupal/Functions/MultiLineFunctionDeclarationUnitTest.inc b/tests/Drupal/Functions/MultiLineFunctionDeclarationUnitTest.inc new file mode 100644 index 00000000..956ec5b2 --- /dev/null +++ b/tests/Drupal/Functions/MultiLineFunctionDeclarationUnitTest.inc @@ -0,0 +1,44 @@ + NULL, + 'group' => NULL, + ]): void { + } + +} diff --git a/tests/Drupal/Functions/MultiLineFunctionDeclarationUnitTest.inc.fixed b/tests/Drupal/Functions/MultiLineFunctionDeclarationUnitTest.inc.fixed new file mode 100644 index 00000000..e0deaa99 --- /dev/null +++ b/tests/Drupal/Functions/MultiLineFunctionDeclarationUnitTest.inc.fixed @@ -0,0 +1,48 @@ + NULL, + 'group' => NULL, + ], + ): void { + } + +} diff --git a/tests/Drupal/Functions/MultiLineTrailingCommaUnitTest.php b/tests/Drupal/Functions/MultiLineFunctionDeclarationUnitTest.php similarity index 89% rename from tests/Drupal/Functions/MultiLineTrailingCommaUnitTest.php rename to tests/Drupal/Functions/MultiLineFunctionDeclarationUnitTest.php index 0ad7cfc9..fa49aa50 100644 --- a/tests/Drupal/Functions/MultiLineTrailingCommaUnitTest.php +++ b/tests/Drupal/Functions/MultiLineFunctionDeclarationUnitTest.php @@ -4,7 +4,7 @@ use Drupal\Test\CoderSniffUnitTest; -class MultiLineTrailingCommaUnitTest extends CoderSniffUnitTest +class MultiLineFunctionDeclarationUnitTest extends CoderSniffUnitTest { @@ -21,8 +21,10 @@ class MultiLineTrailingCommaUnitTest extends CoderSniffUnitTest protected function getErrorList(string $testFile): array { return [ - 8 => 1, - 17 => 1, + 13 => 1, + 22 => 1, + 38 => 3, + 41 => 2, ]; }//end getErrorList() diff --git a/tests/Drupal/Functions/MultiLineTrailingCommaUnitTest.inc b/tests/Drupal/Functions/MultiLineTrailingCommaUnitTest.inc deleted file mode 100644 index 09dac066..00000000 --- a/tests/Drupal/Functions/MultiLineTrailingCommaUnitTest.inc +++ /dev/null @@ -1,23 +0,0 @@ -