File tree Expand file tree Collapse file tree 4 files changed +97
-0
lines changed
tests/PHPStan/Rules/Comparison Expand file tree Collapse file tree 4 files changed +97
-0
lines changed Original file line number Diff line number Diff line change 11
11
- PHPStan\Rules\Cast\InvalidCastRule
12
12
- PHPStan\Rules\Cast\InvalidPartOfEncapsedStringRule
13
13
- PHPStan\Rules\Cast\PrintRule
14
+ - PHPStan\Rules\Comparison\UsageOfVoidMatchExpressionRule
14
15
- PHPStan\Rules\Functions\IncompatibleDefaultParameterTypeRule
15
16
- PHPStan\Rules\Generics\ClassAncestorsRule
16
17
- PHPStan\Rules\Generics\ClassTemplateTypeRule
Original file line number Diff line number Diff line change
1
+ <?php declare (strict_types = 1 );
2
+
3
+ namespace PHPStan \Rules \Comparison ;
4
+
5
+ use PhpParser \Node ;
6
+ use PHPStan \Analyser \Scope ;
7
+ use PHPStan \Rules \Rule ;
8
+ use PHPStan \Rules \RuleErrorBuilder ;
9
+ use PHPStan \Type \VoidType ;
10
+
11
+ /**
12
+ * @implements Rule<Node\Expr\Match_>
13
+ */
14
+ class UsageOfVoidMatchExpressionRule implements Rule
15
+ {
16
+
17
+ public function getNodeType (): string
18
+ {
19
+ return Node \Expr \Match_::class;
20
+ }
21
+
22
+ public function processNode (Node $ node , Scope $ scope ): array
23
+ {
24
+ $ matchResultType = $ scope ->getType ($ node );
25
+ if (
26
+ $ matchResultType instanceof VoidType
27
+ && !$ scope ->isInFirstLevelStatement ()
28
+ ) {
29
+ return [RuleErrorBuilder::message ('Result of match expression (void) is used. ' )->build ()];
30
+ }
31
+
32
+ return [];
33
+ }
34
+
35
+ }
Original file line number Diff line number Diff line change
1
+ <?php declare (strict_types = 1 );
2
+
3
+ namespace PHPStan \Rules \Comparison ;
4
+
5
+ use PHPStan \Rules \Rule ;
6
+ use PHPStan \Testing \RuleTestCase ;
7
+
8
+ /**
9
+ * @extends RuleTestCase<UsageOfVoidMatchExpressionRule>
10
+ */
11
+ class UsageOfVoidMatchExpressionRuleTest extends RuleTestCase
12
+ {
13
+
14
+ protected function getRule (): Rule
15
+ {
16
+ return new UsageOfVoidMatchExpressionRule ();
17
+ }
18
+
19
+ public function testRule (): void
20
+ {
21
+ if (PHP_VERSION_ID < 80000 && !self ::$ useStaticReflectionProvider ) {
22
+ $ this ->markTestSkipped ('Test requires PHP 8.0. ' );
23
+ }
24
+
25
+ $ this ->analyse ([__DIR__ . '/data/void-match.php ' ], [
26
+ [
27
+ 'Result of match expression (void) is used. ' ,
28
+ 21 ,
29
+ ],
30
+ ]);
31
+ }
32
+
33
+ }
Original file line number Diff line number Diff line change
1
+ <?php // lint >= 8.0
2
+
3
+ namespace VoidMatch ;
4
+
5
+ class Foo
6
+ {
7
+
8
+ public function doFoo (): void
9
+ {
10
+
11
+ }
12
+
13
+ public function doBar (int $ i ): void
14
+ {
15
+ match ($ i ) {
16
+ 1 => $ this ->doFoo (),
17
+ 2 => $ this ->doFoo (),
18
+ default => $ this ->doFoo (),
19
+ };
20
+
21
+ $ a = match ($ i ) {
22
+ 1 => $ this ->doFoo (),
23
+ 2 => $ this ->doFoo (),
24
+ default => $ this ->doFoo (),
25
+ };
26
+ }
27
+
28
+ }
You can’t perform that action at this time.
0 commit comments