Skip to content

Commit ad01519

Browse files
committed
SlevomatCodingStandard.Classes.ClassStructure: Support for "invoke method" group
1 parent 3449da1 commit ad01519

File tree

6 files changed

+25
-4
lines changed

6 files changed

+25
-4
lines changed

SlevomatCodingStandard/Sniffs/Classes/ClassStructureSniff.php

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -60,6 +60,7 @@ class ClassStructureSniff implements Sniff
6060
private const GROUP_CONSTRUCTOR = 'constructor';
6161
private const GROUP_STATIC_CONSTRUCTORS = 'static constructors';
6262
private const GROUP_DESTRUCTOR = 'destructor';
63+
private const GROUP_INVOKE_METHOD = 'invoke method';
6364
private const GROUP_MAGIC_METHODS = 'magic methods';
6465
private const GROUP_PUBLIC_METHODS = 'public methods';
6566
private const GROUP_PUBLIC_ABSTRACT_METHODS = 'public abstract methods';
@@ -174,7 +175,7 @@ class ClassStructureSniff implements Sniff
174175
'__serialize' => self::GROUP_MAGIC_METHODS,
175176
'__unserialize' => self::GROUP_MAGIC_METHODS,
176177
'__tostring' => self::GROUP_MAGIC_METHODS,
177-
'__invoke' => self::GROUP_MAGIC_METHODS,
178+
'__invoke' => self::GROUP_INVOKE_METHOD,
178179
'__set_state' => self::GROUP_MAGIC_METHODS,
179180
'__clone' => self::GROUP_MAGIC_METHODS,
180181
'__debuginfo' => self::GROUP_MAGIC_METHODS,
@@ -217,6 +218,11 @@ public function process(File $phpcsFile, $pointer): int
217218

218219
[$groupFirstMemberPointer, $groupLastMemberPointer, $group] = $nextGroup;
219220

221+
// Use "magic methods" group for __invoke() when "invoke" group is not explicitly defined
222+
if ($group === self::GROUP_INVOKE_METHOD && !array_key_exists($group, $groupsOrder)) {
223+
$group = self::GROUP_MAGIC_METHODS;
224+
}
225+
220226
if ($groupsOrder[$group] >= ($groupsOrder[$expectedGroup] ?? 0)) {
221227
$groupsFirstMembers[$group] = $groupFirstMemberPointer;
222228
$expectedGroup = $group;
@@ -594,6 +600,7 @@ private function getNormalizedGroups(): array
594600
if (
595601
!in_array($groupOrShortcut, $supportedGroups, true)
596602
&& !array_key_exists($groupOrShortcut, self::SHORTCUTS)
603+
&& $groupOrShortcut !== self::GROUP_INVOKE_METHOD
597604
) {
598605
throw new UnsupportedClassGroupException($groupOrShortcut);
599606
}
@@ -606,7 +613,7 @@ private function getNormalizedGroups(): array
606613

607614
$normalizedGroups = [];
608615
foreach ($normalizedGroupsWithShortcuts as $groupOrShortcut => $groupOrder) {
609-
if (in_array($groupOrShortcut, $supportedGroups, true)) {
616+
if (in_array($groupOrShortcut, $supportedGroups, true) || $groupOrShortcut === self::GROUP_INVOKE_METHOD) {
610617
$normalizedGroups[$groupOrShortcut] = $groupOrder;
611618
} else {
612619
foreach ($this->unpackShortcut($groupOrShortcut, $supportedGroups) as $group) {

doc/classes.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -51,7 +51,7 @@ uses,
5151
enum cases,
5252
public constants, protected constants, private constants,
5353
public properties, public static properties, protected properties, protected static properties, private properties, private static properties,
54-
constructor, static constructors, destructor, magic methods,
54+
constructor, static constructors, destructor, magic methods, invoke method
5555
public methods, protected methods, private methods,
5656
public final methods, public static final methods, protected final methods, protected static final methods,
5757
public abstract methods, public static abstract methods, protected abstract methods, protected static abstract methods,

tests/Sniffs/Classes/ClassStructureSniffTest.php

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@ class ClassStructureSniffTest extends TestCase
1818
'public abstract methods, public methods, protected abstract methods, protected methods, private methods',
1919
'constructor, destructor',
2020
'static constructors',
21+
'invoke method',
2122
'methods',
2223
'public final methods',
2324
'public static final methods',
@@ -92,7 +93,7 @@ public function testErrorsWithDifferentRules(): void
9293
['groups' => self::DIFFERENT_RULES],
9394
);
9495

95-
self::assertSame(16, $report->getErrorCount());
96+
self::assertSame(17, $report->getErrorCount());
9697

9798
self::assertSniffError($report, 6, ClassStructureSniff::CODE_INCORRECT_GROUP_ORDER);
9899
self::assertSniffError($report, 12, ClassStructureSniff::CODE_INCORRECT_GROUP_ORDER);
@@ -111,6 +112,7 @@ public function testErrorsWithDifferentRules(): void
111112
self::assertSniffError($report, 114, ClassStructureSniff::CODE_INCORRECT_GROUP_ORDER);
112113
self::assertSniffError($report, 118, ClassStructureSniff::CODE_INCORRECT_GROUP_ORDER);
113114
self::assertSniffError($report, 122, ClassStructureSniff::CODE_INCORRECT_GROUP_ORDER);
115+
self::assertSniffError($report, 126, ClassStructureSniff::CODE_INCORRECT_GROUP_ORDER);
114116

115117
self::assertAllFixedInFile($report);
116118
}

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

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -107,6 +107,10 @@ public static function staticConstructor() : self
107107
{
108108
}
109109

110+
public function __invoke()
111+
{
112+
}
113+
110114
public final function publicFinal()
111115
{
112116
}

tests/Sniffs/Classes/data/classStructureSniffErrorsWithDifferentRules.php

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -123,4 +123,8 @@ public final function publicFinal()
123123
{
124124
}
125125

126+
public function __invoke()
127+
{
128+
}
129+
126130
}

tests/Sniffs/Classes/data/classStructureSniffNoErrors.php

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -158,6 +158,10 @@ private function __call($name, $arguments)
158158
{
159159
}
160160

161+
public function __invoke()
162+
{
163+
}
164+
161165
public function __get($name)
162166
{
163167
}

0 commit comments

Comments
 (0)