Skip to content

Commit 7465e39

Browse files
committed
SlevomatCodingStandard.Classes.ClassMemberSpacing: Prevent deleting unexpected code/comments
1 parent 06b18b3 commit 7465e39

File tree

6 files changed

+78
-19
lines changed

6 files changed

+78
-19
lines changed

SlevomatCodingStandard/Sniffs/Classes/ClassMemberSpacingSniff.php

Lines changed: 22 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -63,7 +63,6 @@ public function process(File $phpcsFile, $classPointer): void
6363
$tokens = $phpcsFile->getTokens();
6464

6565
$memberPointer = null;
66-
$previousMemberPointer = null;
6766

6867
do {
6968
$previousMemberPointer = $memberPointer;
@@ -105,7 +104,7 @@ public function process(File $phpcsFile, $classPointer): void
105104
}
106105
}
107106

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

110109
$actualLinesCount = $tokens[$memberStartPointer]['line'] - $tokens[$previousMemberEndPointer]['line'] - 1;
111110

@@ -117,11 +116,24 @@ public function process(File $phpcsFile, $classPointer): void
117116
? 'Expected 1 blank line between class members, found %2$d.'
118117
: 'Expected %1$d blank lines between class members, found %2$d.';
119118

120-
$fix = $phpcsFile->addFixableError(
119+
$firstPointerOnMemberLine = TokenHelper::findFirstTokenOnLine($phpcsFile, $memberStartPointer);
120+
$nonWhitespaceBetweenMembersPointer = TokenHelper::findNextNonWhitespace(
121+
$phpcsFile,
122+
$previousMemberEndPointer + 1,
123+
$firstPointerOnMemberLine,
124+
);
125+
$errorParameters = [
121126
sprintf($errorMessage, $this->linesCountBetweenMembers, $actualLinesCount),
122127
$memberPointer,
123128
self::CODE_INCORRECT_COUNT_OF_BLANK_LINES_BETWEEN_MEMBERS,
124-
);
129+
];
130+
131+
if ($nonWhitespaceBetweenMembersPointer !== null) {
132+
$phpcsFile->addError(...$errorParameters);
133+
continue;
134+
}
135+
136+
$fix = $phpcsFile->addFixableError(...$errorParameters);
125137
if (!$fix) {
126138
continue;
127139
}
@@ -131,8 +143,6 @@ public function process(File $phpcsFile, $classPointer): void
131143
$this->linesCountBetweenMembers + ($hasCommentWithNewLineAfterPreviousMember ? 0 : 1),
132144
);
133145

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

138148
$phpcsFile->fixer->addContent($previousMemberEndPointer, $newLines);
@@ -192,24 +202,25 @@ private function findNextMember(File $phpcsFile, int $classPointer, int $previou
192202
return $memberPointer;
193203
}
194204

195-
private function getMemberStartPointer(File $phpcsFile, int $memberPointer): int
205+
private function getMemberStartPointer(File $phpcsFile, int $memberPointer, int $previousMemberEndPointer): int
196206
{
197207
$tokens = $phpcsFile->getTokens();
198208

199209
$memberFirstCodePointer = $this->getMemberFirstCodePointer($phpcsFile, $memberPointer);
200210

201211
do {
212+
if ($memberFirstCodePointer <= $previousMemberEndPointer) {
213+
return TokenHelper::findNextNonWhitespace($phpcsFile, $memberFirstCodePointer + 1);
214+
}
215+
202216
$pointerBefore = TokenHelper::findPreviousNonWhitespace($phpcsFile, $memberFirstCodePointer - 1);
203217

204218
if ($tokens[$pointerBefore]['code'] === T_ATTRIBUTE_END) {
205219
$memberFirstCodePointer = $tokens[$pointerBefore]['attribute_opener'];
206220
continue;
207221
}
208222

209-
if (
210-
in_array($tokens[$pointerBefore]['code'], Tokens::$commentTokens, true)
211-
&& $tokens[$pointerBefore]['line'] + 1 === $tokens[$memberFirstCodePointer]['line']
212-
) {
223+
if (in_array($tokens[$pointerBefore]['code'], Tokens::$commentTokens, true)) {
213224
$pointerBeforeComment = TokenHelper::findPreviousEffective($phpcsFile, $pointerBefore - 1);
214225
if ($tokens[$pointerBeforeComment]['line'] !== $tokens[$pointerBefore]['line']) {
215226
$memberFirstCodePointer = array_key_exists('comment_opener', $tokens[$pointerBefore])

tests/Sniffs/Classes/ClassMemberSpacingSniffTest.php

Lines changed: 17 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,21 @@ 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);
47+
}
48+
49+
public function testErrorsDuringLiveCoding(): void
50+
{
51+
$report = self::checkFile(__DIR__ . '/data/classMemberSpacingLiveCodingErrors.php');
52+
53+
self::assertSame(1, $report->getErrorCount());
54+
self::assertSame(0, $report->getFixableCount());
55+
56+
self::assertSniffError($report, 11, ClassMemberSpacingSniff::CODE_INCORRECT_COUNT_OF_BLANK_LINES_BETWEEN_MEMBERS);
4557
}
4658

4759
}

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

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

4343
final const THIRD = 'third';
4444

45-
readonly int $forth;
45+
readonly int $fourth;
46+
47+
/**
48+
* @return void
49+
*/
50+
51+
public function fifth()
52+
{
53+
}
4654

4755
}
4856

tests/Sniffs/Classes/data/classMemberSpacingErrors.php

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

4949

50-
readonly int $forth;
50+
readonly int $fourth;
51+
52+
53+
54+
/**
55+
* @return void
56+
*/
57+
58+
public function fifth()
59+
{
60+
}
5161

5262
}
5363

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
<?php // lint >= 99.0
2+
3+
class Test
4+
{
5+
6+
public const FOO = 'foo';
7+
8+
// Live coding/parse error.
9+
pub
10+
11+
public $bar;
12+
13+
}

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)