Skip to content

Commit b46c4c9

Browse files
committed
BlockControlStructureSpacingSniff: Fixed false positives
1 parent cd0ad6f commit b46c4c9

File tree

5 files changed

+55
-22
lines changed

5 files changed

+55
-22
lines changed

SlevomatCodingStandard/Sniffs/ControlStructures/AbstractControlStructureSpacing.php

Lines changed: 21 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -107,36 +107,36 @@ protected function checkLinesBefore(File $phpcsFile, int $controlStructurePointe
107107
{
108108
$tokens = $phpcsFile->getTokens();
109109

110-
/** @var int $pointerBefore */
111-
$pointerBefore = TokenHelper::findPreviousExcluding($phpcsFile, T_WHITESPACE, $controlStructurePointer - 1);
110+
$nonWhitespacePointerBefore = TokenHelper::findPreviousExcluding($phpcsFile, T_WHITESPACE, $controlStructurePointer - 1);
111+
112112
$controlStructureStartPointer = $controlStructurePointer;
113+
$pointerBefore = $nonWhitespacePointerBefore;
113114

114-
if (
115-
in_array($tokens[$pointerBefore]['code'], Tokens::$commentTokens, true)
116-
&& $tokens[$pointerBefore]['line'] + 1 === $tokens[$controlStructurePointer]['line']
117-
) {
118-
$pointerBeforeComment = TokenHelper::findPreviousEffective($phpcsFile, $pointerBefore - 1);
119-
if ($tokens[$pointerBeforeComment]['line'] !== $tokens[$pointerBefore]['line']) {
120-
$controlStructureStartPointer = array_key_exists('comment_opener', $tokens[$pointerBefore])
121-
? $tokens[$pointerBefore]['comment_opener']
122-
: CommentHelper::getMultilineCommentStartPointer($phpcsFile, $pointerBefore);
123-
/** @var int $pointerBefore */
124-
$pointerBefore = TokenHelper::findPreviousExcluding($phpcsFile, T_WHITESPACE, $controlStructureStartPointer - 1);
125-
}
126-
}
115+
$pointerToCheckFirst = $pointerBefore;
116+
117+
if (in_array($tokens[$nonWhitespacePointerBefore]['code'], Tokens::$commentTokens, true)) {
118+
$effectivePointerBefore = TokenHelper::findPreviousEffective($phpcsFile, $pointerBefore - 1);
127119

128-
$pointerBeforeComment = $pointerBefore;
129-
if (in_array($tokens[$pointerBefore]['code'], Tokens::$commentTokens, true)) {
130-
$pointerBeforeComment = TokenHelper::findPreviousEffective($phpcsFile, $pointerBefore - 1);
120+
if ($tokens[$effectivePointerBefore]['line'] === $tokens[$nonWhitespacePointerBefore]['line']) {
121+
$pointerToCheckFirst = $effectivePointerBefore;
122+
} elseif ($tokens[$nonWhitespacePointerBefore]['line'] + 1 === $tokens[$controlStructurePointer]['line']) {
123+
if ($tokens[$effectivePointerBefore]['line'] !== $tokens[$nonWhitespacePointerBefore]['line']) {
124+
$controlStructureStartPointer = array_key_exists('comment_opener', $tokens[$nonWhitespacePointerBefore])
125+
? $tokens[$nonWhitespacePointerBefore]['comment_opener']
126+
: CommentHelper::getMultilineCommentStartPointer($phpcsFile, $nonWhitespacePointerBefore);
127+
$pointerBefore = TokenHelper::findPreviousExcluding($phpcsFile, T_WHITESPACE, $controlStructureStartPointer - 1);
128+
}
129+
$pointerToCheckFirst = $pointerBefore;
130+
}
131131
}
132132

133-
$isFirstControlStructure = in_array($tokens[$pointerBeforeComment]['code'], [T_OPEN_CURLY_BRACKET, T_COLON], true);
133+
$isFirstControlStructure = in_array($tokens[$pointerToCheckFirst]['code'], [T_OPEN_CURLY_BRACKET, T_COLON], true);
134134

135135
if (
136136
$isFirstControlStructure
137137
&& in_array($tokens[$controlStructurePointer]['code'], [T_CASE, T_DEFAULT], true)
138-
&& array_key_exists('scope_condition', $tokens[$pointerBeforeComment])
139-
&& in_array($tokens[$tokens[$pointerBeforeComment]['scope_condition']]['code'], [T_CASE, T_DEFAULT], true)
138+
&& array_key_exists('scope_condition', $tokens[$pointerBefore])
139+
&& in_array($tokens[$tokens[$pointerBefore]['scope_condition']]['code'], [T_CASE, T_DEFAULT], true)
140140
) {
141141
$isFirstControlStructure = false;
142142
}

tests/Sniffs/ControlStructures/BlockControlStructureSpacingSniffTest.php

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@ public function testDefaultSettingsErrors(): void
1818
{
1919
$report = self::checkFile(__DIR__ . '/data/blockControlStructureSpacingWithDefaultSettingsErrors.php');
2020

21-
self::assertSame(25, $report->getErrorCount());
21+
self::assertSame(26, $report->getErrorCount());
2222

2323
self::assertSniffError($report, 4, BlockControlStructureSpacingSniff::CODE_INCORRECT_LINES_COUNT_BEFORE_CONTROL_STRUCTURE, 'Expected 1 lines before "if", found 2.');
2424
self::assertSniffError($report, 4, BlockControlStructureSpacingSniff::CODE_INCORRECT_LINES_COUNT_AFTER_CONTROL_STRUCTURE, 'Expected 1 lines after "if", found 0.');
@@ -45,6 +45,7 @@ public function testDefaultSettingsErrors(): void
4545
self::assertSniffError($report, 81, BlockControlStructureSpacingSniff::CODE_INCORRECT_LINES_COUNT_BEFORE_CONTROL_STRUCTURE, 'Expected 1 lines before "if", found 2.');
4646
self::assertSniffError($report, 87, BlockControlStructureSpacingSniff::CODE_INCORRECT_LINES_COUNT_AFTER_CONTROL_STRUCTURE, 'Expected 1 lines after "if", found 0.');
4747
self::assertSniffError($report, 94, BlockControlStructureSpacingSniff::CODE_INCORRECT_LINES_COUNT_AFTER_CONTROL_STRUCTURE, 'Expected 1 lines after "if", found 2.');
48+
self::assertSniffError($report, 106, BlockControlStructureSpacingSniff::CODE_INCORRECT_LINES_COUNT_BEFORE_CONTROL_STRUCTURE, 'Expected 1 lines before "foreach", found 0.');
4849

4950
self::assertAllFixedInFile($report);
5051
}

tests/Sniffs/ControlStructures/data/blockControlStructureSpacingWithDefaultSettingsErrors.fixed.php

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -92,3 +92,14 @@ function () {
9292

9393
doSomething();
9494
};
95+
96+
function ($foo) {
97+
foreach ($foo as $bar) {
98+
// TODO lorem ipsum
99+
100+
/** @var string $baz */
101+
foreach ($bar as $baz) {
102+
echo $baz;
103+
}
104+
}
105+
};

tests/Sniffs/ControlStructures/data/blockControlStructureSpacingWithDefaultSettingsErrors.php

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -98,3 +98,13 @@ function () {
9898

9999
doSomething();
100100
};
101+
102+
function ($foo) {
103+
foreach ($foo as $bar) {
104+
// TODO lorem ipsum
105+
/** @var string $baz */
106+
foreach ($bar as $baz) {
107+
echo $baz;
108+
}
109+
}
110+
};

tests/Sniffs/ControlStructures/data/blockControlStructureSpacingWithDefaultSettingsNoErrors.php

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -79,6 +79,17 @@ function () {
7979
}
8080
};
8181

82+
function ($foo) {
83+
foreach ($foo as $bar) {
84+
// TODO lorem ipsum
85+
86+
/** @var string $baz */
87+
foreach ($bar as $baz) {
88+
echo $baz;
89+
}
90+
}
91+
};
92+
8293
switch ($foo) {
8394
case 'bar':
8495

0 commit comments

Comments
 (0)