diff --git a/SlevomatCodingStandard/Sniffs/Classes/AbstractPropertyConstantAndEnumCaseSpacing.php b/SlevomatCodingStandard/Sniffs/Classes/AbstractPropertyConstantAndEnumCaseSpacing.php index 7fffec51e..dc975d185 100644 --- a/SlevomatCodingStandard/Sniffs/Classes/AbstractPropertyConstantAndEnumCaseSpacing.php +++ b/SlevomatCodingStandard/Sniffs/Classes/AbstractPropertyConstantAndEnumCaseSpacing.php @@ -10,6 +10,8 @@ use SlevomatCodingStandard\Helpers\TokenHelper; use function assert; use function in_array; +use function max; +use function min; use function str_repeat; use const T_ATTRIBUTE; use const T_COMMENT; @@ -28,6 +30,10 @@ abstract class AbstractPropertyConstantAndEnumCaseSpacing implements Sniff { + public int $minLinesCountBeforeMultiline = -1; + + public int $maxLinesCountBeforeMultiline = -1; + public int $minLinesCountBeforeWithComment = 1; public int $maxLinesCountBeforeWithComment = 1; @@ -46,6 +52,8 @@ abstract protected function addError(File $phpcsFile, int $pointer, int $min, in */ public function process(File $phpcsFile, $pointer): int { + $this->minLinesCountBeforeMultiline = SniffSettingsHelper::normalizeInteger($this->minLinesCountBeforeMultiline); + $this->maxLinesCountBeforeMultiline = SniffSettingsHelper::normalizeInteger($this->maxLinesCountBeforeMultiline); $this->minLinesCountBeforeWithComment = SniffSettingsHelper::normalizeInteger($this->minLinesCountBeforeWithComment); $this->maxLinesCountBeforeWithComment = SniffSettingsHelper::normalizeInteger($this->maxLinesCountBeforeWithComment); $this->minLinesCountBeforeWithoutComment = SniffSettingsHelper::normalizeInteger($this->minLinesCountBeforeWithoutComment); @@ -89,6 +97,21 @@ public function process(File $phpcsFile, $pointer): int $maxExpectedLines = $this->maxLinesCountBeforeWithoutComment; } + if ( + $this->minLinesCountBeforeMultiline !== -1 + && $tokens[$pointer]['line'] !== $tokens[$endPointer]['line'] + ) { + $minExpectedLines = max($minExpectedLines, $this->minLinesCountBeforeMultiline); + $maxExpectedLines = max($minExpectedLines, $maxExpectedLines); + } + + if ( + $this->maxLinesCountBeforeMultiline !== -1 + && $tokens[$pointer]['line'] !== $tokens[$endPointer]['line'] + ) { + $maxExpectedLines = max($minExpectedLines, min($maxExpectedLines, $this->maxLinesCountBeforeMultiline)); + } + if ($linesBetween >= $minExpectedLines && $linesBetween <= $maxExpectedLines) { return $firstOnLinePointer; } diff --git a/tests/Sniffs/Classes/ConstantSpacingSniffTest.php b/tests/Sniffs/Classes/ConstantSpacingSniffTest.php index 8407445f3..0ed0ef7bd 100644 --- a/tests/Sniffs/Classes/ConstantSpacingSniffTest.php +++ b/tests/Sniffs/Classes/ConstantSpacingSniffTest.php @@ -44,6 +44,22 @@ public function testErrorsWithModifiedLinesCount(): void self::assertSniffError($report, 26, ConstantSpacingSniff::CODE_INCORRECT_COUNT_OF_BLANK_LINES_AFTER_CONSTANT); } + public function testErrorsBasedOnMultiline(): void + { + $report = self::checkFile(__DIR__ . '/data/constantSpacingMultilineErrors.php', [ + 'minLinesCountBeforeMultiline' => 1, + 'minLinesCountBeforeWithComment' => 2, + 'maxLinesCountBeforeWithComment' => 2, + ]); + + self::assertSame(2, $report->getErrorCount()); + + self::assertSniffError($report, 4, ConstantSpacingSniff::CODE_INCORRECT_COUNT_OF_BLANK_LINES_AFTER_CONSTANT); + self::assertSniffError($report, 9, ConstantSpacingSniff::CODE_INCORRECT_COUNT_OF_BLANK_LINES_AFTER_CONSTANT); + + self::assertAllFixedInFile($report); + } + public function testInGlobalNamespaceNoErrors(): void { $report = self::checkFile(__DIR__ . '/data/constantSpacingInGlobalNamespaceNoErrors.php'); diff --git a/tests/Sniffs/Classes/data/constantSpacingMultilineErrors.fixed.php b/tests/Sniffs/Classes/data/constantSpacingMultilineErrors.fixed.php new file mode 100644 index 000000000..e52cfd3eb --- /dev/null +++ b/tests/Sniffs/Classes/data/constantSpacingMultilineErrors.fixed.php @@ -0,0 +1,23 @@ += 8.2 + +abstract class Foo { + const ItemsA = [ + 'A', + 'B', + 'C', + ]; + + const ItemsB = [ + 'A', + 'B', + 'C', + ]; + + + /** @var array */ + const ItemsC = [ + 'A', + 'B', + 'C', + ]; +} diff --git a/tests/Sniffs/Classes/data/constantSpacingMultilineErrors.php b/tests/Sniffs/Classes/data/constantSpacingMultilineErrors.php new file mode 100644 index 000000000..234d804cd --- /dev/null +++ b/tests/Sniffs/Classes/data/constantSpacingMultilineErrors.php @@ -0,0 +1,20 @@ += 8.2 + +abstract class Foo { + const ItemsA = [ + 'A', + 'B', + 'C', + ]; + const ItemsB = [ + 'A', + 'B', + 'C', + ]; + /** @var array */ + const ItemsC = [ + 'A', + 'B', + 'C', + ]; +}