From 3b44475ad527211ece00158730b4ec70f484c006 Mon Sep 17 00:00:00 2001 From: jrfnl Date: Fri, 1 Jul 2022 15:56:22 +0200 Subject: [PATCH] Generic/IncrementDecrementSpacing: handle more situations The `Generic.WhiteSpace.IncrementDecrementSpacing` sniff, so far, only handled incrementors/decrementors when they were directly before/after the variable they apply to. This commit enhances the sniff to also allow for finding superfluous whitespace when incrementing/decrementing a property or an array item. Includes unit tests. --- .../IncrementDecrementSpacingSniff.php | 8 +++-- .../IncrementDecrementSpacingUnitTest.inc | 20 +++++++++++ ...ncrementDecrementSpacingUnitTest.inc.fixed | 20 +++++++++++ .../IncrementDecrementSpacingUnitTest.php | 33 +++++++++++++------ 4 files changed, 69 insertions(+), 12 deletions(-) diff --git a/src/Standards/Generic/Sniffs/WhiteSpace/IncrementDecrementSpacingSniff.php b/src/Standards/Generic/Sniffs/WhiteSpace/IncrementDecrementSpacingSniff.php index bde065e1c2..95ba3d82c2 100644 --- a/src/Standards/Generic/Sniffs/WhiteSpace/IncrementDecrementSpacingSniff.php +++ b/src/Standards/Generic/Sniffs/WhiteSpace/IncrementDecrementSpacingSniff.php @@ -63,7 +63,8 @@ public function process(File $phpcsFile, $stackPtr) // Is this a pre-increment/decrement ? $nextNonEmpty = $phpcsFile->findNext(Tokens::$emptyTokens, ($stackPtr + 1), null, true); if ($nextNonEmpty !== false - && (($phpcsFile->tokenizerType === 'PHP' && $tokens[$nextNonEmpty]['code'] === T_VARIABLE) + && (($phpcsFile->tokenizerType === 'PHP' + && ($tokens[$nextNonEmpty]['code'] === T_VARIABLE || $tokens[$nextNonEmpty]['code'] === T_STRING)) || ($phpcsFile->tokenizerType === 'JS' && $tokens[$nextNonEmpty]['code'] === T_STRING)) ) { if ($nextNonEmpty === ($stackPtr + 1)) { @@ -116,7 +117,10 @@ public function process(File $phpcsFile, $stackPtr) // Is this a post-increment/decrement ? $prevNonEmpty = $phpcsFile->findPrevious(Tokens::$emptyTokens, ($stackPtr - 1), null, true); if ($prevNonEmpty !== false - && (($phpcsFile->tokenizerType === 'PHP' && $tokens[$prevNonEmpty]['code'] === T_VARIABLE) + && (($phpcsFile->tokenizerType === 'PHP' + && ($tokens[$prevNonEmpty]['code'] === T_VARIABLE + || $tokens[$prevNonEmpty]['code'] === T_STRING + || $tokens[$prevNonEmpty]['code'] === T_CLOSE_SQUARE_BRACKET)) || ($phpcsFile->tokenizerType === 'JS' && $tokens[$prevNonEmpty]['code'] === T_STRING)) ) { if ($prevNonEmpty === ($stackPtr - 1)) { diff --git a/src/Standards/Generic/Tests/WhiteSpace/IncrementDecrementSpacingUnitTest.inc b/src/Standards/Generic/Tests/WhiteSpace/IncrementDecrementSpacingUnitTest.inc index 22c611be92..b674466b1d 100644 --- a/src/Standards/Generic/Tests/WhiteSpace/IncrementDecrementSpacingUnitTest.inc +++ b/src/Standards/Generic/Tests/WhiteSpace/IncrementDecrementSpacingUnitTest.inc @@ -15,3 +15,23 @@ $i /*comment*/ --; $i++; $i ++; $i /*comment*/ ++; + +// Handle properties and array access too. +$i['key']++; +$i['key'] ++; +$i['key']['id']++; +$i['key']['id'] ++; + +$obj->prop++; +$obj->prop ++; +$obj?->prop ++; + +$obj->obj->prop++; +$obj->obj->prop ++; +$obj?->obj->prop ++; + +$obj->prop['key']++; +$obj->prop['key'] ++; + +--ClassName::$prop; +-- ClassName::$prop; diff --git a/src/Standards/Generic/Tests/WhiteSpace/IncrementDecrementSpacingUnitTest.inc.fixed b/src/Standards/Generic/Tests/WhiteSpace/IncrementDecrementSpacingUnitTest.inc.fixed index 7cf0ab81e9..1049e7e043 100644 --- a/src/Standards/Generic/Tests/WhiteSpace/IncrementDecrementSpacingUnitTest.inc.fixed +++ b/src/Standards/Generic/Tests/WhiteSpace/IncrementDecrementSpacingUnitTest.inc.fixed @@ -14,3 +14,23 @@ $i /*comment*/ --; $i++; $i++; $i /*comment*/ ++; + +// Handle properties and array access too. +$i['key']++; +$i['key']++; +$i['key']['id']++; +$i['key']['id']++; + +$obj->prop++; +$obj->prop++; +$obj?->prop++; + +$obj->obj->prop++; +$obj->obj->prop++; +$obj?->obj->prop++; + +$obj->prop['key']++; +$obj->prop['key']++; + +--ClassName::$prop; +--ClassName::$prop; diff --git a/src/Standards/Generic/Tests/WhiteSpace/IncrementDecrementSpacingUnitTest.php b/src/Standards/Generic/Tests/WhiteSpace/IncrementDecrementSpacingUnitTest.php index 1136bda4e9..9e7644f1f1 100644 --- a/src/Standards/Generic/Tests/WhiteSpace/IncrementDecrementSpacingUnitTest.php +++ b/src/Standards/Generic/Tests/WhiteSpace/IncrementDecrementSpacingUnitTest.php @@ -27,19 +27,32 @@ class IncrementDecrementSpacingUnitTest extends AbstractSniffUnitTest */ public function getErrorList($testFile='IncrementDecrementSpacingUnitTest.inc') { + $errors = [ + 5 => 1, + 6 => 1, + 8 => 1, + 10 => 1, + 13 => 1, + 14 => 1, + 16 => 1, + 17 => 1, + ]; + switch ($testFile) { case 'IncrementDecrementSpacingUnitTest.inc': + $errors[21] = 1; + $errors[23] = 1; + $errors[26] = 1; + $errors[27] = 1; + $errors[30] = 1; + $errors[31] = 1; + $errors[34] = 1; + $errors[37] = 1; + + return $errors; + case 'IncrementDecrementSpacingUnitTest.js': - return [ - 5 => 1, - 6 => 1, - 8 => 1, - 10 => 1, - 13 => 1, - 14 => 1, - 16 => 1, - 17 => 1, - ]; + return $errors; default: return [];