diff --git a/PhpCollective/Sniffs/AbstractSniffs/AbstractSniff.php b/PhpCollective/Sniffs/AbstractSniffs/AbstractSniff.php index d86f780..9e250cd 100644 --- a/PhpCollective/Sniffs/AbstractSniffs/AbstractSniff.php +++ b/PhpCollective/Sniffs/AbstractSniffs/AbstractSniff.php @@ -135,8 +135,9 @@ protected function getClassName(File $phpcsFile): string $fileName = $phpcsFile->getFilename(); $fileNameParts = explode(DIRECTORY_SEPARATOR, $fileName); $directoryPosition = array_search('src', $fileNameParts, true); - if (!$directoryPosition) { - $directoryPosition = array_search('tests', $fileNameParts, true) + 1; + if ($directoryPosition === false) { + $testsPosition = array_search('tests', $fileNameParts, true); + $directoryPosition = $testsPosition === false ? 0 : $testsPosition + 1; } $classNameParts = array_slice($fileNameParts, $directoryPosition + 1); $className = implode('\\', $classNameParts); diff --git a/PhpCollective/Sniffs/Classes/EnumCaseCasingSniff.php b/PhpCollective/Sniffs/Classes/EnumCaseCasingSniff.php index b60147f..ce840ff 100644 --- a/PhpCollective/Sniffs/Classes/EnumCaseCasingSniff.php +++ b/PhpCollective/Sniffs/Classes/EnumCaseCasingSniff.php @@ -55,7 +55,7 @@ public function process(File $phpcsFile, $stackPtr): void } $result = mb_strtolower($content); - $result = ucfirst($result); + $result = mb_strtoupper(mb_substr($result, 0, 1)) . mb_substr($result, 1); if ($result === $content) { return; diff --git a/PhpCollective/Sniffs/ControlStructures/NoInlineAssignmentSniff.php b/PhpCollective/Sniffs/ControlStructures/NoInlineAssignmentSniff.php index 5088512..e8652d3 100644 --- a/PhpCollective/Sniffs/ControlStructures/NoInlineAssignmentSniff.php +++ b/PhpCollective/Sniffs/ControlStructures/NoInlineAssignmentSniff.php @@ -37,8 +37,8 @@ public function process(File $phpcsFile, $stackPtr): void return; } - $openingBraceIndex = (int)$phpcsFile->findNext(Tokens::$emptyTokens, ($stackPtr + 1), null, true); - if (!$openingBraceIndex) { + $openingBraceIndex = $phpcsFile->findNext(Tokens::$emptyTokens, $stackPtr + 1, null, true); + if ($openingBraceIndex === false) { return; } if (empty($tokens[$openingBraceIndex]['parenthesis_closer'])) { @@ -113,8 +113,8 @@ protected function checkMethodCalls(File $phpcsFile, int $stackPtr): void { $tokens = $phpcsFile->getTokens(); - $openingBraceIndex = $phpcsFile->findNext(T_OPEN_PARENTHESIS, ($stackPtr + 1), $stackPtr + 4); - if (!$openingBraceIndex) { + $openingBraceIndex = $phpcsFile->findNext(T_OPEN_PARENTHESIS, $stackPtr + 1, $stackPtr + 4); + if ($openingBraceIndex === false) { return; } if (empty($tokens[$openingBraceIndex]['parenthesis_closer'])) { diff --git a/PhpCollective/Sniffs/PHP/NoIsNullSniff.php b/PhpCollective/Sniffs/PHP/NoIsNullSniff.php index c7e9aa0..44545a2 100644 --- a/PhpCollective/Sniffs/PHP/NoIsNullSniff.php +++ b/PhpCollective/Sniffs/PHP/NoIsNullSniff.php @@ -100,11 +100,11 @@ public function process(File $phpcsFile, $stackPtr): void } if ($trailingComparison) { - $possibleEndIndex = $this->findUnnecessaryLeadingComparisonStart($phpcsFile, $endIndex); - if ($possibleEndIndex !== null) { - $endIndex = $possibleEndIndex; + $trailingResult = $this->findUnnecessaryTrailingComparisonEnd($phpcsFile, $endIndex); + if ($trailingResult !== null) { + $endIndex = $trailingResult['index']; $trailingComparison = false; - if ($tokens[$endIndex]['code'] === T_FALSE) { + if ($trailingResult['negated']) { $negated = !$negated; } } @@ -189,13 +189,13 @@ protected function findUnnecessaryLeadingComparisonStart(File $phpcsFile, int $i { $tokens = $phpcsFile->getTokens(); - $previous = (int)$phpcsFile->findPrevious(T_WHITESPACE, ($index - 1), null, true); - if (!$previous || !in_array($tokens[$previous]['code'], [T_IS_IDENTICAL, T_IS_NOT_IDENTICAL])) { + $previous = $phpcsFile->findPrevious(T_WHITESPACE, $index - 1, null, true); + if ($previous === false || !in_array($tokens[$previous]['code'], [T_IS_IDENTICAL, T_IS_NOT_IDENTICAL], true)) { return null; } - $previous = (int)$phpcsFile->findPrevious(T_WHITESPACE, ($previous - 1), null, true); - if (!$previous || !in_array($tokens[$previous]['code'], [T_TRUE, T_FALSE])) { + $previous = $phpcsFile->findPrevious(T_WHITESPACE, $previous - 1, null, true); + if ($previous === false || !in_array($tokens[$previous]['code'], [T_TRUE, T_FALSE], true)) { return null; } @@ -206,23 +206,34 @@ protected function findUnnecessaryLeadingComparisonStart(File $phpcsFile, int $i * @param \PHP_CodeSniffer\Files\File $phpcsFile * @param int $index * - * @return int|null + * @return array{index: int, negated: bool}|null */ - protected function findUnnecessaryTrailingComparisonEnd(File $phpcsFile, int $index): ?int + protected function findUnnecessaryTrailingComparisonEnd(File $phpcsFile, int $index): ?array { $tokens = $phpcsFile->getTokens(); - $next = (int)$phpcsFile->findNext(T_WHITESPACE, ($index + 1), null, true); - if (!$next || !in_array($tokens[$next]['code'], [T_IS_IDENTICAL, T_IS_NOT_IDENTICAL])) { + $operatorIndex = $phpcsFile->findNext(T_WHITESPACE, $index + 1, null, true); + if ($operatorIndex === false || !in_array($tokens[$operatorIndex]['code'], [T_IS_IDENTICAL, T_IS_NOT_IDENTICAL], true)) { return null; } - $next = (int)$phpcsFile->findPrevious(T_WHITESPACE, ($next - 1), null, true); - if (!$next || !in_array($tokens[$next]['code'], [T_TRUE, T_FALSE])) { + $isNotIdentical = $tokens[$operatorIndex]['code'] === T_IS_NOT_IDENTICAL; + + $valueIndex = $phpcsFile->findNext(T_WHITESPACE, $operatorIndex + 1, null, true); + if ($valueIndex === false || !in_array($tokens[$valueIndex]['code'], [T_TRUE, T_FALSE], true)) { return null; } - return $next; + $isFalse = $tokens[$valueIndex]['code'] === T_FALSE; + + // Determine if negation is needed: + // === true -> no negation + // === false -> negate + // !== true -> negate + // !== false -> no negation (double negation) + $negated = $isNotIdentical !== $isFalse; + + return ['index' => $valueIndex, 'negated' => $negated]; } /** diff --git a/PhpCollective/Sniffs/PHP/PhpSapiConstantSniff.php b/PhpCollective/Sniffs/PHP/PhpSapiConstantSniff.php index 5144cf9..09782fe 100644 --- a/PhpCollective/Sniffs/PHP/PhpSapiConstantSniff.php +++ b/PhpCollective/Sniffs/PHP/PhpSapiConstantSniff.php @@ -42,18 +42,18 @@ public function process(File $phpcsFile, $stackPtr): void return; } - $previous = (int)$phpcsFile->findPrevious(T_WHITESPACE, ($stackPtr - 1), null, true); - if (!$previous || in_array($tokens[$previous]['code'], $wrongTokens)) { + $previous = $phpcsFile->findPrevious(T_WHITESPACE, $stackPtr - 1, null, true); + if ($previous === false || in_array($tokens[$previous]['code'], $wrongTokens, true)) { return; } - $openingBrace = (int)$phpcsFile->findNext(T_WHITESPACE, ($stackPtr + 1), null, true); - if (!$openingBrace || $tokens[$openingBrace]['type'] !== 'T_OPEN_PARENTHESIS') { + $openingBrace = $phpcsFile->findNext(T_WHITESPACE, $stackPtr + 1, null, true); + if ($openingBrace === false || $tokens[$openingBrace]['type'] !== 'T_OPEN_PARENTHESIS') { return; } - $closingBrace = (int)$phpcsFile->findNext(T_WHITESPACE, ($openingBrace + 1), null, true); - if (!$closingBrace || $tokens[$closingBrace]['type'] !== 'T_CLOSE_PARENTHESIS') { + $closingBrace = $phpcsFile->findNext(T_WHITESPACE, $openingBrace + 1, null, true); + if ($closingBrace === false || $tokens[$closingBrace]['type'] !== 'T_CLOSE_PARENTHESIS') { return; } diff --git a/PhpCollective/Sniffs/PHP/PreferCastOverFunctionSniff.php b/PhpCollective/Sniffs/PHP/PreferCastOverFunctionSniff.php index 2ae7799..de974c8 100644 --- a/PhpCollective/Sniffs/PHP/PreferCastOverFunctionSniff.php +++ b/PhpCollective/Sniffs/PHP/PreferCastOverFunctionSniff.php @@ -48,13 +48,13 @@ public function process(File $phpcsFile, $stackPtr): void return; } - $previous = (int)$phpcsFile->findPrevious(T_WHITESPACE, ($stackPtr - 1), null, true); - if (!$previous || in_array($tokens[$previous]['code'], $wrongTokens)) { + $previous = $phpcsFile->findPrevious(T_WHITESPACE, $stackPtr - 1, null, true); + if ($previous === false || in_array($tokens[$previous]['code'], $wrongTokens, true)) { return; } - $openingBraceIndex = (int)$phpcsFile->findNext(T_WHITESPACE, ($stackPtr + 1), null, true); - if (!$openingBraceIndex || $tokens[$openingBraceIndex]['type'] !== 'T_OPEN_PARENTHESIS') { + $openingBraceIndex = $phpcsFile->findNext(T_WHITESPACE, $stackPtr + 1, null, true); + if ($openingBraceIndex === false || $tokens[$openingBraceIndex]['type'] !== 'T_OPEN_PARENTHESIS') { return; } diff --git a/tests/PhpCollective/Sniffs/PHP/NoIsNullSniffTest.php b/tests/PhpCollective/Sniffs/PHP/NoIsNullSniffTest.php new file mode 100644 index 0000000..7153fbd --- /dev/null +++ b/tests/PhpCollective/Sniffs/PHP/NoIsNullSniffTest.php @@ -0,0 +1,30 @@ +assertSnifferFindsFixableErrors(new NoIsNullSniff(), 8, 8); + } + + /** + * @return void + */ + public function testNoIsNullFixer(): void + { + $this->assertSnifferCanFixErrors(new NoIsNullSniff(), 8); + } +} diff --git a/tests/_data/NoIsNull/after.php b/tests/_data/NoIsNull/after.php new file mode 100644 index 0000000..2f08720 --- /dev/null +++ b/tests/_data/NoIsNull/after.php @@ -0,0 +1,70 @@ +