Skip to content

Commit 6f4683d

Browse files
committed
SlevomatCodingStandard.Classes.ClassMemberSpacing: Stop deleting unexpected code
1 parent 06b18b3 commit 6f4683d

File tree

5 files changed

+57
-21
lines changed

5 files changed

+57
-21
lines changed

SlevomatCodingStandard/Sniffs/Classes/ClassMemberSpacingSniff.php

Lines changed: 24 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -15,16 +15,15 @@
1515
use SlevomatCodingStandard\Helpers\TokenHelper;
1616
use SlevomatCodingStandard\Helpers\UseStatementHelper;
1717
use function array_key_exists;
18+
use function array_merge;
1819
use function in_array;
1920
use function sprintf;
2021
use function str_repeat;
21-
use const T_ABSTRACT;
2222
use const T_AS;
2323
use const T_ATTRIBUTE_END;
2424
use const T_CLOSE_CURLY_BRACKET;
2525
use const T_CONST;
2626
use const T_ENUM_CASE;
27-
use const T_FINAL;
2827
use const T_FUNCTION;
2928
use const T_OPEN_CURLY_BRACKET;
3029
use const T_PRIVATE;
@@ -63,7 +62,6 @@ public function process(File $phpcsFile, $classPointer): void
6362
$tokens = $phpcsFile->getTokens();
6463

6564
$memberPointer = null;
66-
$previousMemberPointer = null;
6765

6866
do {
6967
$previousMemberPointer = $memberPointer;
@@ -105,7 +103,7 @@ public function process(File $phpcsFile, $classPointer): void
105103
}
106104
}
107105

108-
$memberStartPointer = $this->getMemberStartPointer($phpcsFile, $memberPointer);
106+
$memberStartPointer = $this->getMemberStartPointer($phpcsFile, $memberPointer, $previousMemberEndPointer);
109107

110108
$actualLinesCount = $tokens[$memberStartPointer]['line'] - $tokens[$previousMemberEndPointer]['line'] - 1;
111109

@@ -117,10 +115,20 @@ public function process(File $phpcsFile, $classPointer): void
117115
? 'Expected 1 blank line between class members, found %2$d.'
118116
: 'Expected %1$d blank lines between class members, found %2$d.';
119117

120-
$fix = $phpcsFile->addFixableError(
118+
$firstPointerOnMemberLine = TokenHelper::findFirstTokenOnLine($phpcsFile, $memberStartPointer);
119+
$nonWhitespaceBetweenMembersPointer = TokenHelper::findNextNonWhitespace(
120+
$phpcsFile,
121+
$previousMemberEndPointer + 1,
122+
$firstPointerOnMemberLine,
123+
);
124+
125+
$fix = $phpcsFile->addError(
121126
sprintf($errorMessage, $this->linesCountBetweenMembers, $actualLinesCount),
122127
$memberPointer,
123128
self::CODE_INCORRECT_COUNT_OF_BLANK_LINES_BETWEEN_MEMBERS,
129+
[],
130+
0,
131+
$nonWhitespaceBetweenMembersPointer === null,
124132
);
125133
if (!$fix) {
126134
continue;
@@ -131,8 +139,6 @@ public function process(File $phpcsFile, $classPointer): void
131139
$this->linesCountBetweenMembers + ($hasCommentWithNewLineAfterPreviousMember ? 0 : 1),
132140
);
133141

134-
$firstPointerOnMemberLine = TokenHelper::findFirstTokenOnLine($phpcsFile, $memberStartPointer);
135-
136142
$phpcsFile->fixer->beginChangeset();
137143

138144
$phpcsFile->fixer->addContent($previousMemberEndPointer, $newLines);
@@ -192,24 +198,25 @@ private function findNextMember(File $phpcsFile, int $classPointer, int $previou
192198
return $memberPointer;
193199
}
194200

195-
private function getMemberStartPointer(File $phpcsFile, int $memberPointer): int
201+
private function getMemberStartPointer(File $phpcsFile, int $memberPointer, int $previousMemberEndPointer): int
196202
{
197203
$tokens = $phpcsFile->getTokens();
198204

199205
$memberFirstCodePointer = $this->getMemberFirstCodePointer($phpcsFile, $memberPointer);
200206

201207
do {
208+
if ($memberFirstCodePointer <= $previousMemberEndPointer) {
209+
return TokenHelper::findNextNonWhitespace($phpcsFile, $memberFirstCodePointer + 1);
210+
}
211+
202212
$pointerBefore = TokenHelper::findPreviousNonWhitespace($phpcsFile, $memberFirstCodePointer - 1);
203213

204214
if ($tokens[$pointerBefore]['code'] === T_ATTRIBUTE_END) {
205215
$memberFirstCodePointer = $tokens[$pointerBefore]['attribute_opener'];
206216
continue;
207217
}
208218

209-
if (
210-
in_array($tokens[$pointerBefore]['code'], Tokens::$commentTokens, true)
211-
&& $tokens[$pointerBefore]['line'] + 1 === $tokens[$memberFirstCodePointer]['line']
212-
) {
219+
if (in_array($tokens[$pointerBefore]['code'], Tokens::$commentTokens, true)) {
213220
$pointerBeforeComment = TokenHelper::findPreviousEffective($phpcsFile, $pointerBefore - 1);
214221
if ($tokens[$pointerBeforeComment]['line'] !== $tokens[$pointerBefore]['line']) {
215222
$memberFirstCodePointer = array_key_exists('comment_opener', $tokens[$pointerBefore])
@@ -240,7 +247,11 @@ private function getMemberFirstCodePointer(File $phpcsFile, int $memberPointer):
240247
/** @var int $firstCodePointer */
241248
$firstCodePointer = TokenHelper::findPrevious(
242249
$phpcsFile,
243-
[T_VAR, T_PUBLIC, T_PROTECTED, T_PRIVATE, T_ABSTRACT, T_FINAL, T_SEMICOLON, T_CLOSE_CURLY_BRACKET],
250+
array_merge(
251+
Tokens::$methodPrefixes,
252+
TokenHelper::$propertyModifiersTokenCodes,
253+
[T_SEMICOLON, T_CLOSE_CURLY_BRACKET],
254+
),
244255
$firstCodePointer - 1,
245256
);
246257

tests/Sniffs/Classes/ClassMemberSpacingSniffTest.php

Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@ public function testErrors(): void
1717
{
1818
$report = self::checkFile(__DIR__ . '/data/classMemberSpacingErrors.php');
1919

20-
self::assertSame(9, $report->getErrorCount());
20+
self::assertSame(10, $report->getErrorCount());
2121

2222
self::assertSniffError($report, 15, ClassMemberSpacingSniff::CODE_INCORRECT_COUNT_OF_BLANK_LINES_BETWEEN_MEMBERS);
2323
self::assertSniffError($report, 21, ClassMemberSpacingSniff::CODE_INCORRECT_COUNT_OF_BLANK_LINES_BETWEEN_MEMBERS);
@@ -26,8 +26,9 @@ public function testErrors(): void
2626
self::assertSniffError($report, 44, ClassMemberSpacingSniff::CODE_INCORRECT_COUNT_OF_BLANK_LINES_BETWEEN_MEMBERS);
2727
self::assertSniffError($report, 47, ClassMemberSpacingSniff::CODE_INCORRECT_COUNT_OF_BLANK_LINES_BETWEEN_MEMBERS);
2828
self::assertSniffError($report, 50, ClassMemberSpacingSniff::CODE_INCORRECT_COUNT_OF_BLANK_LINES_BETWEEN_MEMBERS);
29-
self::assertSniffError($report, 60, ClassMemberSpacingSniff::CODE_INCORRECT_COUNT_OF_BLANK_LINES_BETWEEN_MEMBERS);
30-
self::assertSniffError($report, 69, ClassMemberSpacingSniff::CODE_INCORRECT_COUNT_OF_BLANK_LINES_BETWEEN_MEMBERS);
29+
self::assertSniffError($report, 58, ClassMemberSpacingSniff::CODE_INCORRECT_COUNT_OF_BLANK_LINES_BETWEEN_MEMBERS);
30+
self::assertSniffError($report, 70, ClassMemberSpacingSniff::CODE_INCORRECT_COUNT_OF_BLANK_LINES_BETWEEN_MEMBERS);
31+
self::assertSniffError($report, 79, ClassMemberSpacingSniff::CODE_INCORRECT_COUNT_OF_BLANK_LINES_BETWEEN_MEMBERS);
3132

3233
self::assertAllFixedInFile($report);
3334
}
@@ -38,10 +39,11 @@ public function testErrorsWithModifiedLinesCount(): void
3839
'linesCountBetweenMembers' => 2,
3940
]);
4041

41-
self::assertSame(2, $report->getErrorCount());
42+
self::assertSame(3, $report->getErrorCount());
4243

4344
self::assertSniffError($report, 21, ClassMemberSpacingSniff::CODE_INCORRECT_COUNT_OF_BLANK_LINES_BETWEEN_MEMBERS);
44-
self::assertSniffError($report, 69, ClassMemberSpacingSniff::CODE_INCORRECT_COUNT_OF_BLANK_LINES_BETWEEN_MEMBERS);
45+
self::assertSniffError($report, 58, ClassMemberSpacingSniff::CODE_INCORRECT_COUNT_OF_BLANK_LINES_BETWEEN_MEMBERS);
46+
self::assertSniffError($report, 79, ClassMemberSpacingSniff::CODE_INCORRECT_COUNT_OF_BLANK_LINES_BETWEEN_MEMBERS);
4547
}
4648

4749
}

tests/Sniffs/Classes/data/classMemberSpacingErrors.fixed.php

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -42,8 +42,16 @@ public function third()
4242

4343
final const THIRD = 'third';
4444

45-
readonly int $forth;
45+
readonly int $fourth;
4646

47+
/**
48+
* @return void
49+
*/
50+
51+
public function fifth()
52+
{
53+
54+
}
4755
}
4856

4957
enum Gender: string

tests/Sniffs/Classes/data/classMemberSpacingErrors.php

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -47,8 +47,18 @@ public function third()
4747
final const THIRD = 'third';
4848

4949

50-
readonly int $forth;
50+
readonly int $fourth;
5151

52+
53+
54+
/**
55+
* @return void
56+
*/
57+
58+
public function fifth()
59+
{
60+
61+
}
5262
}
5363

5464
enum Gender: string

tests/Sniffs/Classes/data/classMemberSpacingNoErrors.php

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -94,7 +94,7 @@ abstract public function thirdWithAttributeAndDocDomment();
9494
*
9595
* @var string
9696
*/
97-
protected $forth;
97+
protected $fourth;
9898
// @codingStandardsIgnoreEnd
9999

100100
#[SomeAttribute]
@@ -124,6 +124,11 @@ public function withAnonymous($parameter)
124124
};
125125
}
126126

127+
/**
128+
* @var string
129+
*/
130+
131+
protected $fifth;
127132
}
128133

129134
enum Gender: string

0 commit comments

Comments
 (0)