From 60be2e3b475af974e77f27ce856f5a390a0f2167 Mon Sep 17 00:00:00 2001 From: Klaus Purer Date: Sun, 1 Sep 2024 18:01:37 +0200 Subject: [PATCH 1/6] fix(ScopeKeywordSpacing): Check spaces after final keyword --- .../Squiz/Sniffs/WhiteSpace/ScopeKeywordSpacingSniff.php | 3 +-- .../Squiz/Tests/WhiteSpace/ScopeKeywordSpacingUnitTest.1.inc | 4 ++++ .../Tests/WhiteSpace/ScopeKeywordSpacingUnitTest.1.inc.fixed | 4 ++++ .../Squiz/Tests/WhiteSpace/ScopeKeywordSpacingUnitTest.php | 1 + 4 files changed, 10 insertions(+), 2 deletions(-) diff --git a/src/Standards/Squiz/Sniffs/WhiteSpace/ScopeKeywordSpacingSniff.php b/src/Standards/Squiz/Sniffs/WhiteSpace/ScopeKeywordSpacingSniff.php index 65cc13f91f..9ba69dcf14 100644 --- a/src/Standards/Squiz/Sniffs/WhiteSpace/ScopeKeywordSpacingSniff.php +++ b/src/Standards/Squiz/Sniffs/WhiteSpace/ScopeKeywordSpacingSniff.php @@ -24,8 +24,7 @@ class ScopeKeywordSpacingSniff implements Sniff */ public function register() { - $register = Tokens::$scopeModifiers; - $register[] = T_STATIC; + $register = Tokens::$methodPrefixes; $register[] = T_READONLY; return $register; diff --git a/src/Standards/Squiz/Tests/WhiteSpace/ScopeKeywordSpacingUnitTest.1.inc b/src/Standards/Squiz/Tests/WhiteSpace/ScopeKeywordSpacingUnitTest.1.inc index 1d3ccebc9f..49baf02c6e 100644 --- a/src/Standards/Squiz/Tests/WhiteSpace/ScopeKeywordSpacingUnitTest.1.inc +++ b/src/Standards/Squiz/Tests/WhiteSpace/ScopeKeywordSpacingUnitTest.1.inc @@ -147,3 +147,7 @@ readonly class ReadonlyClassTest {} // PHP 8.3 readonly anonymous classes. $anon = new readonly class {}; $anon = new readonly class {}; + +class FinalTest { + final public static function create(ContainerInterface $container) {} +} diff --git a/src/Standards/Squiz/Tests/WhiteSpace/ScopeKeywordSpacingUnitTest.1.inc.fixed b/src/Standards/Squiz/Tests/WhiteSpace/ScopeKeywordSpacingUnitTest.1.inc.fixed index d4e8a39e16..d820bcf1ea 100644 --- a/src/Standards/Squiz/Tests/WhiteSpace/ScopeKeywordSpacingUnitTest.1.inc.fixed +++ b/src/Standards/Squiz/Tests/WhiteSpace/ScopeKeywordSpacingUnitTest.1.inc.fixed @@ -141,3 +141,7 @@ readonly class ReadonlyClassTest {} // PHP 8.3 readonly anonymous classes. $anon = new readonly class {}; $anon = new readonly class {}; + +class FinalTest { + final public static function create(ContainerInterface $container) {} +} diff --git a/src/Standards/Squiz/Tests/WhiteSpace/ScopeKeywordSpacingUnitTest.php b/src/Standards/Squiz/Tests/WhiteSpace/ScopeKeywordSpacingUnitTest.php index cc58d4e797..ebd85ad4c5 100644 --- a/src/Standards/Squiz/Tests/WhiteSpace/ScopeKeywordSpacingUnitTest.php +++ b/src/Standards/Squiz/Tests/WhiteSpace/ScopeKeywordSpacingUnitTest.php @@ -58,6 +58,7 @@ public function getErrorList($testFile='') 140 => 3, 145 => 1, 149 => 1, + 152 => 1, ]; case 'ScopeKeywordSpacingUnitTest.3.inc': From 83ef2a02af424e4153e900140d10e7aa6bd3f897 Mon Sep 17 00:00:00 2001 From: Klaus Purer Date: Sat, 28 Dec 2024 18:29:33 +0100 Subject: [PATCH 2/6] Add more final keyword test cases --- .../WhiteSpace/ScopeKeywordSpacingUnitTest.1.inc | 11 +++++++++++ .../ScopeKeywordSpacingUnitTest.1.inc.fixed | 11 +++++++++++ .../Tests/WhiteSpace/ScopeKeywordSpacingUnitTest.php | 4 ++++ 3 files changed, 26 insertions(+) diff --git a/src/Standards/Squiz/Tests/WhiteSpace/ScopeKeywordSpacingUnitTest.1.inc b/src/Standards/Squiz/Tests/WhiteSpace/ScopeKeywordSpacingUnitTest.1.inc index 49baf02c6e..6b73222563 100644 --- a/src/Standards/Squiz/Tests/WhiteSpace/ScopeKeywordSpacingUnitTest.1.inc +++ b/src/Standards/Squiz/Tests/WhiteSpace/ScopeKeywordSpacingUnitTest.1.inc @@ -151,3 +151,14 @@ $anon = new readonly class {}; class FinalTest { final public static function create(ContainerInterface $container) {} } + +final class FinalTest2 { +} + +final abstract class FinalTest3 { +} + +class FinalTest4 { + final const X = "foo"; + final public const Y = "bar"; +} diff --git a/src/Standards/Squiz/Tests/WhiteSpace/ScopeKeywordSpacingUnitTest.1.inc.fixed b/src/Standards/Squiz/Tests/WhiteSpace/ScopeKeywordSpacingUnitTest.1.inc.fixed index d820bcf1ea..e01d039467 100644 --- a/src/Standards/Squiz/Tests/WhiteSpace/ScopeKeywordSpacingUnitTest.1.inc.fixed +++ b/src/Standards/Squiz/Tests/WhiteSpace/ScopeKeywordSpacingUnitTest.1.inc.fixed @@ -145,3 +145,14 @@ $anon = new readonly class {}; class FinalTest { final public static function create(ContainerInterface $container) {} } + +final class FinalTest2 { +} + +final abstract class FinalTest3 { +} + +class FinalTest4 { + final const X = "foo"; + final public const Y = "bar"; +} diff --git a/src/Standards/Squiz/Tests/WhiteSpace/ScopeKeywordSpacingUnitTest.php b/src/Standards/Squiz/Tests/WhiteSpace/ScopeKeywordSpacingUnitTest.php index ebd85ad4c5..3c162cfe3a 100644 --- a/src/Standards/Squiz/Tests/WhiteSpace/ScopeKeywordSpacingUnitTest.php +++ b/src/Standards/Squiz/Tests/WhiteSpace/ScopeKeywordSpacingUnitTest.php @@ -59,6 +59,10 @@ public function getErrorList($testFile='') 145 => 1, 149 => 1, 152 => 1, + 155 => 1, + 158 => 1, + 162 => 1, + 163 => 1, ]; case 'ScopeKeywordSpacingUnitTest.3.inc': From e751fb4284ff7e2ab732df5fdb905dabc2002bda Mon Sep 17 00:00:00 2001 From: Klaus Purer Date: Tue, 31 Dec 2024 11:50:22 +0100 Subject: [PATCH 3/6] Add better error codes --- .../WhiteSpace/ScopeKeywordSpacingSniff.php | 41 ++++++++++++++++++- 1 file changed, 40 insertions(+), 1 deletion(-) diff --git a/src/Standards/Squiz/Sniffs/WhiteSpace/ScopeKeywordSpacingSniff.php b/src/Standards/Squiz/Sniffs/WhiteSpace/ScopeKeywordSpacingSniff.php index 9ba69dcf14..eb8e8301a9 100644 --- a/src/Standards/Squiz/Sniffs/WhiteSpace/ScopeKeywordSpacingSniff.php +++ b/src/Standards/Squiz/Sniffs/WhiteSpace/ScopeKeywordSpacingSniff.php @@ -138,13 +138,52 @@ public function process(File $phpcsFile, $stackPtr) } if ($spacing !== 1) { + // Set a context error code by checking if this is a class property, + // method, closure or class declaration. + $ignoreTokens = (Tokens::$emptyTokens + Tokens::$methodPrefixes + [ + T_READONLY => T_READONLY, + // Ignore all the tokens in type hints. + T_STRING => T_STRING, + T_NULLABLE => T_NULLABLE, + T_BITWISE_AND => T_BITWISE_AND, + T_TYPE_INTERSECTION => T_TYPE_INTERSECTION, + T_TYPE_UNION => T_TYPE_UNION, + T_TYPE_OPEN_PARENTHESIS => T_TYPE_OPEN_PARENTHESIS, + T_TYPE_CLOSE_PARENTHESIS => T_TYPE_CLOSE_PARENTHESIS, + ]); + $targetContext = $phpcsFile->findNext($ignoreTokens, ($stackPtr + 1), null, true, null, true); + $errorCode = 'Incorrect'; + if (isset($tokens[$targetContext]['code']) === true) { + switch ($tokens[$targetContext]['code']) { + case T_VARIABLE: + $errorCode = 'Property'; + break; + + case T_FUNCTION: + $errorCode = 'Method'; + break; + + case T_CLOSURE: + $errorCode = 'Closure'; + break; + + case T_CLASS: + $errorCode = 'Class'; + break; + + case T_ANON_CLASS: + $errorCode = 'AnonymousClass'; + break; + }//end switch + }//end if + $error = 'Scope keyword "%s" must be followed by a single space; found %s'; $data = [ $tokens[$stackPtr]['content'], $spacing, ]; - $fix = $phpcsFile->addFixableError($error, $stackPtr, 'Incorrect', $data); + $fix = $phpcsFile->addFixableError($error, $stackPtr, $errorCode, $data); if ($fix === true) { if ($spacing === 0) { $phpcsFile->fixer->addContent($stackPtr, ' '); From 66bc2047197326140b0b0cc1b737d01e3ad89a30 Mon Sep 17 00:00:00 2001 From: Klaus Purer Date: Wed, 1 Jan 2025 17:43:37 +0100 Subject: [PATCH 4/6] Revert "Add better error codes" This reverts commit e751fb4284ff7e2ab732df5fdb905dabc2002bda. --- .../WhiteSpace/ScopeKeywordSpacingSniff.php | 41 +------------------ 1 file changed, 1 insertion(+), 40 deletions(-) diff --git a/src/Standards/Squiz/Sniffs/WhiteSpace/ScopeKeywordSpacingSniff.php b/src/Standards/Squiz/Sniffs/WhiteSpace/ScopeKeywordSpacingSniff.php index eb8e8301a9..9ba69dcf14 100644 --- a/src/Standards/Squiz/Sniffs/WhiteSpace/ScopeKeywordSpacingSniff.php +++ b/src/Standards/Squiz/Sniffs/WhiteSpace/ScopeKeywordSpacingSniff.php @@ -138,52 +138,13 @@ public function process(File $phpcsFile, $stackPtr) } if ($spacing !== 1) { - // Set a context error code by checking if this is a class property, - // method, closure or class declaration. - $ignoreTokens = (Tokens::$emptyTokens + Tokens::$methodPrefixes + [ - T_READONLY => T_READONLY, - // Ignore all the tokens in type hints. - T_STRING => T_STRING, - T_NULLABLE => T_NULLABLE, - T_BITWISE_AND => T_BITWISE_AND, - T_TYPE_INTERSECTION => T_TYPE_INTERSECTION, - T_TYPE_UNION => T_TYPE_UNION, - T_TYPE_OPEN_PARENTHESIS => T_TYPE_OPEN_PARENTHESIS, - T_TYPE_CLOSE_PARENTHESIS => T_TYPE_CLOSE_PARENTHESIS, - ]); - $targetContext = $phpcsFile->findNext($ignoreTokens, ($stackPtr + 1), null, true, null, true); - $errorCode = 'Incorrect'; - if (isset($tokens[$targetContext]['code']) === true) { - switch ($tokens[$targetContext]['code']) { - case T_VARIABLE: - $errorCode = 'Property'; - break; - - case T_FUNCTION: - $errorCode = 'Method'; - break; - - case T_CLOSURE: - $errorCode = 'Closure'; - break; - - case T_CLASS: - $errorCode = 'Class'; - break; - - case T_ANON_CLASS: - $errorCode = 'AnonymousClass'; - break; - }//end switch - }//end if - $error = 'Scope keyword "%s" must be followed by a single space; found %s'; $data = [ $tokens[$stackPtr]['content'], $spacing, ]; - $fix = $phpcsFile->addFixableError($error, $stackPtr, $errorCode, $data); + $fix = $phpcsFile->addFixableError($error, $stackPtr, 'Incorrect', $data); if ($fix === true) { if ($spacing === 0) { $phpcsFile->fixer->addContent($stackPtr, ' '); From 6bed8f0a5fb4fcd30bb01e50b51bb51c46d68d6f Mon Sep 17 00:00:00 2001 From: Klaus Purer Date: Wed, 1 Jan 2025 17:49:06 +0100 Subject: [PATCH 5/6] add abstract test case --- .../Squiz/Tests/WhiteSpace/ScopeKeywordSpacingUnitTest.1.inc | 4 ++++ .../Tests/WhiteSpace/ScopeKeywordSpacingUnitTest.1.inc.fixed | 4 ++++ .../Squiz/Tests/WhiteSpace/ScopeKeywordSpacingUnitTest.php | 2 ++ 3 files changed, 10 insertions(+) diff --git a/src/Standards/Squiz/Tests/WhiteSpace/ScopeKeywordSpacingUnitTest.1.inc b/src/Standards/Squiz/Tests/WhiteSpace/ScopeKeywordSpacingUnitTest.1.inc index 6b73222563..a0bd6386b3 100644 --- a/src/Standards/Squiz/Tests/WhiteSpace/ScopeKeywordSpacingUnitTest.1.inc +++ b/src/Standards/Squiz/Tests/WhiteSpace/ScopeKeywordSpacingUnitTest.1.inc @@ -162,3 +162,7 @@ class FinalTest4 { final const X = "foo"; final public const Y = "bar"; } + +abstract class AbstractTest { + abstract public function foo(); +} diff --git a/src/Standards/Squiz/Tests/WhiteSpace/ScopeKeywordSpacingUnitTest.1.inc.fixed b/src/Standards/Squiz/Tests/WhiteSpace/ScopeKeywordSpacingUnitTest.1.inc.fixed index e01d039467..d0df81b9ca 100644 --- a/src/Standards/Squiz/Tests/WhiteSpace/ScopeKeywordSpacingUnitTest.1.inc.fixed +++ b/src/Standards/Squiz/Tests/WhiteSpace/ScopeKeywordSpacingUnitTest.1.inc.fixed @@ -156,3 +156,7 @@ class FinalTest4 { final const X = "foo"; final public const Y = "bar"; } + +abstract class AbstractTest { + abstract public function foo(); +} diff --git a/src/Standards/Squiz/Tests/WhiteSpace/ScopeKeywordSpacingUnitTest.php b/src/Standards/Squiz/Tests/WhiteSpace/ScopeKeywordSpacingUnitTest.php index 3c162cfe3a..3773793e65 100644 --- a/src/Standards/Squiz/Tests/WhiteSpace/ScopeKeywordSpacingUnitTest.php +++ b/src/Standards/Squiz/Tests/WhiteSpace/ScopeKeywordSpacingUnitTest.php @@ -63,6 +63,8 @@ public function getErrorList($testFile='') 158 => 1, 162 => 1, 163 => 1, + 166 => 1, + 167 => 1, ]; case 'ScopeKeywordSpacingUnitTest.3.inc': From 6e7157fc4a6c9faddcdde9561c28ec1e773644ce Mon Sep 17 00:00:00 2001 From: jrfnl Date: Wed, 8 Jan 2025 11:41:07 +0100 Subject: [PATCH 6/6] Squiz/ScopeKeywordSpacing: add some tests which shouldn't throw errors Includes: * Making the spacing differences in the new tests a little more varied. * Changing an invalid modifier keyword combination to a valid one. --- .../WhiteSpace/ScopeKeywordSpacingUnitTest.1.inc | 16 ++++++++++++---- .../ScopeKeywordSpacingUnitTest.1.inc.fixed | 11 +++++++++-- 2 files changed, 21 insertions(+), 6 deletions(-) diff --git a/src/Standards/Squiz/Tests/WhiteSpace/ScopeKeywordSpacingUnitTest.1.inc b/src/Standards/Squiz/Tests/WhiteSpace/ScopeKeywordSpacingUnitTest.1.inc index a0bd6386b3..9f871c0e77 100644 --- a/src/Standards/Squiz/Tests/WhiteSpace/ScopeKeywordSpacingUnitTest.1.inc +++ b/src/Standards/Squiz/Tests/WhiteSpace/ScopeKeywordSpacingUnitTest.1.inc @@ -152,17 +152,25 @@ class FinalTest { final public static function create(ContainerInterface $container) {} } -final class FinalTest2 { +final class FinalTest2 { } -final abstract class FinalTest3 { -} +final + readonly class FinalTest3 {} class FinalTest4 { final const X = "foo"; - final public const Y = "bar"; + final public const Y = "bar"; } abstract class AbstractTest { abstract public function foo(); } + +final class FinalSpacingCorrect { + public final const SPACING_CORRECT = true; +} + +abstract class AbstractSpacingCorrect { + public abstract function spacingCorrect() {} +} diff --git a/src/Standards/Squiz/Tests/WhiteSpace/ScopeKeywordSpacingUnitTest.1.inc.fixed b/src/Standards/Squiz/Tests/WhiteSpace/ScopeKeywordSpacingUnitTest.1.inc.fixed index d0df81b9ca..bf284b6188 100644 --- a/src/Standards/Squiz/Tests/WhiteSpace/ScopeKeywordSpacingUnitTest.1.inc.fixed +++ b/src/Standards/Squiz/Tests/WhiteSpace/ScopeKeywordSpacingUnitTest.1.inc.fixed @@ -149,8 +149,7 @@ class FinalTest { final class FinalTest2 { } -final abstract class FinalTest3 { -} +final readonly class FinalTest3 {} class FinalTest4 { final const X = "foo"; @@ -160,3 +159,11 @@ class FinalTest4 { abstract class AbstractTest { abstract public function foo(); } + +final class FinalSpacingCorrect { + public final const SPACING_CORRECT = true; +} + +abstract class AbstractSpacingCorrect { + public abstract function spacingCorrect() {} +}