From 38cd7c8cb7541bd6c01c545e1d6b8b2a564b9f34 Mon Sep 17 00:00:00 2001 From: Vivien DE BONA Date: Thu, 25 Sep 2025 15:12:26 +0200 Subject: [PATCH] SlevomatCodingStandard.Classes.ClassStructure: Support for suffix filtering --- .../Sniffs/Classes/ClassStructureSniff.php | 6 ++++++ doc/classes.md | 5 +++++ tests/Sniffs/Classes/ClassStructureSniffTest.php | 8 +++++--- .../classStructureErrorsWithMethodGroupRules.fixed.php | 5 +++++ .../data/classStructureErrorsWithMethodGroupRules.php | 5 +++++ .../data/classStructureNoErrorsWithMethodGroupRules.php | 5 +++++ 6 files changed, 31 insertions(+), 3 deletions(-) diff --git a/SlevomatCodingStandard/Sniffs/Classes/ClassStructureSniff.php b/SlevomatCodingStandard/Sniffs/Classes/ClassStructureSniff.php index 12936932f..cfa2e2512 100644 --- a/SlevomatCodingStandard/Sniffs/Classes/ClassStructureSniff.php +++ b/SlevomatCodingStandard/Sniffs/Classes/ClassStructureSniff.php @@ -427,6 +427,12 @@ private function resolveMethodGroup(File $phpcsFile, int $pointer, string $metho if ($method === $methodNamePrefix || !StringHelper::startsWith($method, $methodNamePrefix)) { continue; } + } elseif (StringHelper::startsWith($requiredName, '*')) { + $methodNameSuffix = substr($requiredName, 1); + + if ($method === $methodNameSuffix || !StringHelper::endsWith($method, $methodNameSuffix)) { + continue; + } } elseif ($method !== $requiredName) { continue; } diff --git a/doc/classes.md b/doc/classes.md index 5f64a4ff1..e6c4c8aff 100644 --- a/doc/classes.md +++ b/doc/classes.md @@ -46,6 +46,7 @@ Sniff provides the following settings: * `groups`: order of groups. Use multiple groups in one `` to not differentiate among them. You can use specific groups or shortcuts. * `methodGroups`: custom method groups. Define a custom group for special methods based on their name, annotation, or attribute. + * You can use a `*` as prefix or suffix to filter methods name as seen in the example below. **List of supported groups**: uses, @@ -68,6 +69,7 @@ constants, properties, static properties, methods, all public methods, all prote + @@ -96,6 +98,9 @@ constants, properties, static properties, methods, all public methods, all prote + + + diff --git a/tests/Sniffs/Classes/ClassStructureSniffTest.php b/tests/Sniffs/Classes/ClassStructureSniffTest.php index 67006b08e..ec5938502 100644 --- a/tests/Sniffs/Classes/ClassStructureSniffTest.php +++ b/tests/Sniffs/Classes/ClassStructureSniffTest.php @@ -33,6 +33,7 @@ class ClassStructureSniffTest extends TestCase 'phpunit after class' => 'tearDownAfterClass, @afterClass, #PHPUnit\Framework\Attributes\AfterClass', 'phpunit before' => 'setUp, @before, #PHPUnit\Framework\Attributes\Before', 'phpunit after' => 'tearDown, @after, #PHPUnit\Framework\Attributes\After', + 'phpunit data provider' => '*DataProvider', ]; private const METHOD_GROUP_RULES = [ @@ -67,6 +68,7 @@ class ClassStructureSniffTest extends TestCase 'protected static abstract methods', 'private methods', 'private static methods', + 'phpunit data provider', ]; public function testNoErrors(): void @@ -220,9 +222,9 @@ public function testErrorsWithMethodGroupRules(): void self::assertSniffError($report, 33, ClassStructureSniff::CODE_INCORRECT_GROUP_ORDER); self::assertSniffError($report, 44, ClassStructureSniff::CODE_INCORRECT_GROUP_ORDER); self::assertSniffError($report, 48, ClassStructureSniff::CODE_INCORRECT_GROUP_ORDER); - self::assertSniffError($report, 67, ClassStructureSniff::CODE_INCORRECT_GROUP_ORDER); - self::assertSniffError($report, 71, ClassStructureSniff::CODE_INCORRECT_GROUP_ORDER); - self::assertSniffError($report, 75, ClassStructureSniff::CODE_INCORRECT_GROUP_ORDER); + self::assertSniffError($report, 72, ClassStructureSniff::CODE_INCORRECT_GROUP_ORDER); + self::assertSniffError($report, 76, ClassStructureSniff::CODE_INCORRECT_GROUP_ORDER); + self::assertSniffError($report, 80, ClassStructureSniff::CODE_INCORRECT_GROUP_ORDER); self::assertAllFixedInFile($report); } diff --git a/tests/Sniffs/Classes/data/classStructureErrorsWithMethodGroupRules.fixed.php b/tests/Sniffs/Classes/data/classStructureErrorsWithMethodGroupRules.fixed.php index 95877a431..4b7c98ec2 100644 --- a/tests/Sniffs/Classes/data/classStructureErrorsWithMethodGroupRules.fixed.php +++ b/tests/Sniffs/Classes/data/classStructureErrorsWithMethodGroupRules.fixed.php @@ -75,4 +75,9 @@ protected function ipsum() private function dolor() { } + + public static function fooDataProvider(): \Generator + { + yield 'foo' => ['bar']; + } } diff --git a/tests/Sniffs/Classes/data/classStructureErrorsWithMethodGroupRules.php b/tests/Sniffs/Classes/data/classStructureErrorsWithMethodGroupRules.php index fc773914a..97a2c6c22 100644 --- a/tests/Sniffs/Classes/data/classStructureErrorsWithMethodGroupRules.php +++ b/tests/Sniffs/Classes/data/classStructureErrorsWithMethodGroupRules.php @@ -60,6 +60,11 @@ private function dolor() { } + public static function fooDataProvider(): \Generator + { + yield 'foo' => ['bar']; + } + /** * @after */ diff --git a/tests/Sniffs/Classes/data/classStructureNoErrorsWithMethodGroupRules.php b/tests/Sniffs/Classes/data/classStructureNoErrorsWithMethodGroupRules.php index 8ae9022c5..a518eaca9 100644 --- a/tests/Sniffs/Classes/data/classStructureNoErrorsWithMethodGroupRules.php +++ b/tests/Sniffs/Classes/data/classStructureNoErrorsWithMethodGroupRules.php @@ -75,4 +75,9 @@ protected function ipsum() private function dolor() { } + + public static function fooDataProvider(): \Generator + { + yield 'foo' => ['bar']; + } }