Skip to content

Commit 603b06f

Browse files
committed
Adjust CallTo*StatementWithNoDiscardRule for pipe operator
1 parent fb2cc65 commit 603b06f

9 files changed

+125
-10
lines changed

src/Rules/Functions/CallToFunctionStatementWithNoDiscardRule.php

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,18 @@ public function processNode(Node $node, Scope $scope): array
4141
$funcCall = $funcCall->expr;
4242
}
4343

44+
if ($funcCall instanceof Node\Expr\BinaryOp\Pipe) {
45+
if ($funcCall->right instanceof Node\Expr\FuncCall) {
46+
if (!$funcCall->right->isFirstClassCallable()) {
47+
return [];
48+
}
49+
50+
$funcCall = new Node\Expr\FuncCall($funcCall->right->name, []);
51+
} elseif ($funcCall->right instanceof Node\Expr\ArrowFunction) {
52+
$funcCall = $funcCall->right->expr;
53+
}
54+
}
55+
4456
if (!$funcCall instanceof Node\Expr\FuncCall) {
4557
return [];
4658
}

src/Rules/Methods/CallToMethodStatementWithNoDiscardRule.php

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -42,6 +42,18 @@ public function processNode(Node $node, Scope $scope): array
4242
$methodCall = $methodCall->expr;
4343
}
4444

45+
if ($methodCall instanceof Node\Expr\BinaryOp\Pipe) {
46+
if ($methodCall->right instanceof Node\Expr\MethodCall || $methodCall->right instanceof Node\Expr\NullsafeMethodCall) {
47+
if (!$methodCall->right->isFirstClassCallable()) {
48+
return [];
49+
}
50+
51+
$methodCall = new Node\Expr\MethodCall($methodCall->right->var, $methodCall->right->name, []);
52+
} elseif ($methodCall->right instanceof Node\Expr\ArrowFunction) {
53+
$methodCall = $methodCall->right->expr;
54+
}
55+
}
56+
4557
if (!$methodCall instanceof Node\Expr\MethodCall
4658
&& !$methodCall instanceof Node\Expr\NullsafeMethodCall
4759
) {

src/Rules/Methods/CallToStaticMethodStatementWithNoDiscardRule.php

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -44,6 +44,19 @@ public function processNode(Node $node, Scope $scope): array
4444
$isInVoidCast = true;
4545
$methodCall = $methodCall->expr;
4646
}
47+
48+
if ($methodCall instanceof Node\Expr\BinaryOp\Pipe) {
49+
if ($methodCall->right instanceof Node\Expr\StaticCall) {
50+
if (!$methodCall->right->isFirstClassCallable()) {
51+
return [];
52+
}
53+
54+
$methodCall = new Node\Expr\StaticCall($methodCall->right->class, $methodCall->right->name, []);
55+
} elseif ($methodCall->right instanceof Node\Expr\ArrowFunction) {
56+
$methodCall = $methodCall->right->expr;
57+
}
58+
}
59+
4760
if (!$methodCall instanceof Node\Expr\StaticCall) {
4861
return [];
4962
}

tests/PHPStan/Rules/Functions/CallToFunctionStatementWithNoDiscardRuleTest.php

Lines changed: 17 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -36,7 +36,7 @@ public function testRule(): void
3636
30,
3737
],
3838
[
39-
'Call to callable Closure(): array on a separate line discards return value.',
39+
'Call to callable Closure(int): array on a separate line discards return value.',
4040
35,
4141
],
4242
[
@@ -55,6 +55,22 @@ public function testRule(): void
5555
'Call to callable \'FunctionCallStateme…\' in (void) cast but callable allows discarding return value.',
5656
59,
5757
],
58+
[
59+
'Call to function FunctionCallStatementResultDiscarded\withSideEffects() on a separate line discards return value.',
60+
61,
61+
],
62+
[
63+
'Call to function FunctionCallStatementResultDiscarded\canDiscard() in (void) cast but function allows discarding return value.',
64+
64,
65+
],
66+
[
67+
'Call to function FunctionCallStatementResultDiscarded\withSideEffects() on a separate line discards return value.',
68+
66,
69+
],
70+
[
71+
'Call to function FunctionCallStatementResultDiscarded\canDiscard() in (void) cast but function allows discarding return value.',
72+
69,
73+
],
5874
]);
5975
}
6076

tests/PHPStan/Rules/Functions/data/function-call-statement-result-discarded.php

Lines changed: 19 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -3,16 +3,16 @@
33
namespace FunctionCallStatementResultDiscarded;
44

55
#[\NoDiscard]
6-
function withSideEffects(): array {
6+
function withSideEffects(int $i): array {
77
echo __FUNCTION__ . "\n";
88
return [1];
99
}
1010

11-
withSideEffects();
11+
withSideEffects(5);
1212

13-
(void)withSideEffects();
13+
(void)withSideEffects(5);
1414

15-
foreach (withSideEffects() as $num) {
15+
foreach (withSideEffects(5) as $num) {
1616
var_dump($num);
1717
}
1818

@@ -30,9 +30,9 @@ function differentCase(): array {
3030
$callable();
3131

3232
$firstClassCallable = withSideEffects(...);
33-
$firstClasCallableResult = $firstClassCallable();
33+
$firstClasCallableResult = $firstClassCallable(5);
3434

35-
$firstClassCallable();
35+
$firstClassCallable(5);
3636

3737
$closureWithNoDiscard = #[\NoDiscard] function () { return 1; };
3838
$a = $closureWithNoDiscard();
@@ -46,14 +46,24 @@ function differentCase(): array {
4646

4747
withSideEffects(...);
4848

49-
function canDiscard(): int
49+
function canDiscard(int $i): int
5050
{
5151
return 1;
5252
}
5353

54-
canDiscard();
55-
(void) canDiscard();
54+
canDiscard(5);
55+
(void) canDiscard(5);
5656

5757
$canDiscardCb = 'FunctionCallStatementResultDiscarded\\canDiscard';
5858
$canDiscardCb();
5959
(void) $canDiscardCb();
60+
61+
5 |> withSideEffects(...);
62+
5 |> canDiscard(...);
63+
(void) 5 |> withSideEffects(...);
64+
(void) 5 |> canDiscard(...);
65+
66+
5 |> fn ($x) => withSideEffects($x);
67+
5 |> fn ($x) => canDiscard($x);
68+
(void) 5 |> fn ($x) => withSideEffects($x);
69+
(void) 5 |> fn ($x) => canDiscard($x);

tests/PHPStan/Rules/Methods/CallToMethodStatementWithNoDiscardRuleTest.php

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,22 @@ public function testRule(): void
4040
'Call to method MethodCallStatementResultDiscarded\Foo::canDiscard() in (void) cast but method allows discarding return value.',
4141
45,
4242
],
43+
[
44+
'Call to method MethodCallStatementResultDiscarded\ClassWithInstanceSideEffects::instanceMethod() on a separate line discards return value.',
45+
47,
46+
],
47+
[
48+
'Call to method MethodCallStatementResultDiscarded\Foo::canDiscard() in (void) cast but method allows discarding return value.',
49+
50,
50+
],
51+
[
52+
'Call to method MethodCallStatementResultDiscarded\ClassWithInstanceSideEffects::instanceMethod() on a separate line discards return value.',
53+
52,
54+
],
55+
[
56+
'Call to method MethodCallStatementResultDiscarded\Foo::canDiscard() in (void) cast but method allows discarding return value.',
57+
55,
58+
],
4359
]);
4460
}
4561

tests/PHPStan/Rules/Methods/CallToStaticMethodStatementWithNoDiscardRuleTest.php

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,22 @@ public function testRule(): void
4141
'Call to static method StaticMethodCallStatementResultDiscarded\Foo::canDiscard() in (void) cast but method allows discarding return value.',
4242
41,
4343
],
44+
[
45+
'Call to static method StaticMethodCallStatementResultDiscarded\ClassWithStaticSideEffects::staticMethod() on a separate line discards return value.',
46+
43,
47+
],
48+
[
49+
'Call to static method StaticMethodCallStatementResultDiscarded\Foo::canDiscard() in (void) cast but method allows discarding return value.',
50+
46,
51+
],
52+
[
53+
'Call to static method StaticMethodCallStatementResultDiscarded\ClassWithStaticSideEffects::staticMethod() on a separate line discards return value.',
54+
48,
55+
],
56+
[
57+
'Call to static method StaticMethodCallStatementResultDiscarded\Foo::canDiscard() in (void) cast but method allows discarding return value.',
58+
51,
59+
],
4460
]);
4561
}
4662

tests/PHPStan/Rules/Methods/data/method-call-statement-result-discarded.php

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -43,3 +43,13 @@ public function canDiscard(): array {
4343
$foo = new Foo();
4444
$foo->canDiscard();
4545
(void) $foo->canDiscard();
46+
47+
5 |> $o->instanceMethod(...);
48+
5 |> $foo->canDiscard(...);
49+
(void) 5 |> $o->instanceMethod(...);
50+
(void) 5 |> $foo->canDiscard(...);
51+
52+
5 |> fn ($x) => $o->instanceMethod($x);
53+
5 |> fn ($x) => $foo->canDiscard($x);
54+
(void) 5 |> fn ($x) => $o->instanceMethod($x);
55+
(void) 5 |> fn ($x) => $foo->canDiscard($x);

tests/PHPStan/Rules/Methods/data/static-method-call-statement-result-discarded.php

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -39,3 +39,13 @@ public static function canDiscard(): array {
3939

4040
Foo::canDiscard();
4141
(void) Foo::canDiscard();
42+
43+
5 |> ClassWithStaticSideEffects::staticMethod(...);
44+
5 |> Foo::canDiscard(...);
45+
(void) 5 |> ClassWithStaticSideEffects::staticMethod(...);
46+
(void) 5 |> Foo::canDiscard(...);
47+
48+
5 |> fn ($x) => ClassWithStaticSideEffects::staticMethod($x);
49+
5 |> fn ($x) => Foo::canDiscard($x);
50+
(void) 5 |> fn ($x) => ClassWithStaticSideEffects::staticMethod($x);
51+
(void) 5 |> fn ($x) => Foo::canDiscard($x);

0 commit comments

Comments
 (0)