diff --git a/PhpCollective/Sniffs/Operators/OperatorSpacingSniff.php b/PhpCollective/Sniffs/Operators/OperatorSpacingSniff.php new file mode 100644 index 0000000..071ff70 --- /dev/null +++ b/PhpCollective/Sniffs/Operators/OperatorSpacingSniff.php @@ -0,0 +1,34 @@ +getTokens(); + $before = $phpcsFile->findPrevious(Tokens::$emptyTokens, $stackPtr - 1, null, true); + $after = $phpcsFile->findNext(Tokens::$emptyTokens, $stackPtr + 1, null, true); + + if ($before === false || $after === false) { + return; + } + + $newline = $tokens[$before]['line'] !== $tokens[$stackPtr]['line'] + || $tokens[$after]['line'] !== $tokens[$stackPtr]['line']; + $spacing = false; + for ($i = $before + 1; $i < $after; $i++) { + if ($tokens[$i]['code'] === T_WHITESPACE) { + $spacing = true; + + break; + } + } + if (!$newline && !$spacing) { + return; + } + + $message = 'Expected no whitespace around the catch type separator'; + if ($newline) { + $phpcsFile->addError($message, $stackPtr, 'SpacesAround'); + + return; + } + + $fix = $phpcsFile->addFixableError($message, $stackPtr, 'SpacesAround'); + if ($fix) { + $phpcsFile->fixer->beginChangeset(); + for ($i = $before + 1; $i < $after; $i++) { + if ($i !== $stackPtr && $tokens[$i]['code'] === T_WHITESPACE) { + $phpcsFile->fixer->replaceToken($i, ''); + } + } + $phpcsFile->fixer->endChangeset(); + } + } + + public static function isCatchTypeSeparator(File $phpcsFile, int $stackPtr): bool + { + $tokens = $phpcsFile->getTokens(); + if ($tokens[$stackPtr]['code'] !== T_BITWISE_OR || empty($tokens[$stackPtr]['nested_parenthesis'])) { + return false; + } + + $openers = array_keys($tokens[$stackPtr]['nested_parenthesis']); + $opener = end($openers); + + return isset($tokens[$opener]['parenthesis_owner']) + && $tokens[$tokens[$opener]['parenthesis_owner']]['code'] === T_CATCH; + } +} diff --git a/PhpCollective/ruleset.xml b/PhpCollective/ruleset.xml index e5a84ee..fa271fd 100644 --- a/PhpCollective/ruleset.xml +++ b/PhpCollective/ruleset.xml @@ -237,6 +237,7 @@ +