Skip to content

Commit 2fa539a

Browse files
committed
Bleeding edge - check existing classes in @param-closure-this
1 parent b04b3bf commit 2fa539a

5 files changed

+104
-4
lines changed

src/Rules/FunctionDefinitionCheck.php

+9-4
Original file line numberDiff line numberDiff line change
@@ -584,15 +584,20 @@ private function getParameterReferencedClasses(ParameterReflection $parameter):
584584
return $parameter->getNativeType()->getReferencedClasses();
585585
}
586586

587-
$outTypeClasses = [];
588-
if ($parameter->getOutType() !== null && $this->absentTypeChecks) {
589-
$outTypeClasses = $parameter->getOutType()->getReferencedClasses();
587+
$moreClasses = [];
588+
if ($this->absentTypeChecks) {
589+
if ($parameter->getOutType() !== null) {
590+
$moreClasses = array_merge($moreClasses, $parameter->getOutType()->getReferencedClasses());
591+
}
592+
if ($parameter->getClosureThisType() !== null) {
593+
$moreClasses = array_merge($moreClasses, $parameter->getClosureThisType()->getReferencedClasses());
594+
}
590595
}
591596

592597
return array_merge(
593598
$parameter->getNativeType()->getReferencedClasses(),
594599
$parameter->getPhpDocType()->getReferencedClasses(),
595-
$outTypeClasses,
600+
$moreClasses,
596601
);
597602
}
598603

tests/PHPStan/Rules/Functions/ExistingClassesInTypehintsRuleTest.php

+18
Original file line numberDiff line numberDiff line change
@@ -470,4 +470,22 @@ public function testParamOutClasses(): void
470470
]);
471471
}
472472

473+
public function testParamClosureThisClasses(): void
474+
{
475+
$this->analyse([__DIR__ . '/data/param-closure-this-classes.php'], [
476+
[
477+
'Parameter $a of method ParamClosureThisClasses\Bar::doFoo() has invalid type ParamClosureThisClasses\Nonexistent.',
478+
24,
479+
],
480+
[
481+
'Parameter $b of method ParamClosureThisClasses\Bar::doFoo() has invalid type ParamClosureThisClasses\FooTrait.',
482+
25,
483+
],
484+
[
485+
'Class ParamClosureThisClasses\Foo referenced with incorrect case: ParamClosureThisClasses\fOO.',
486+
26,
487+
],
488+
]);
489+
}
490+
473491
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
<?php
2+
3+
namespace ParamClosureThisClassesFunctions;
4+
5+
trait FooTrait
6+
{
7+
8+
}
9+
10+
class Foo
11+
{
12+
13+
}
14+
15+
/**
16+
* @param-closure-this Nonexistent $a
17+
* @param-closure-this FooTrait $b
18+
* @param-closure-this fOO $c
19+
*/
20+
function doFoo(
21+
callable $a,
22+
callable $b,
23+
callable $c
24+
): void
25+
{
26+
27+
}

tests/PHPStan/Rules/Methods/ExistingClassesInTypehintsRuleTest.php

+18
Original file line numberDiff line numberDiff line change
@@ -490,4 +490,22 @@ public function testParamOutClasses(): void
490490
]);
491491
}
492492

493+
public function testParamClosureThisClasses(): void
494+
{
495+
$this->analyse([__DIR__ . '/data/param-closure-this-classes.php'], [
496+
[
497+
'Parameter $a of method ParamClosureThisClasses\Bar::doFoo() has invalid type ParamClosureThisClasses\Nonexistent.',
498+
24,
499+
],
500+
[
501+
'Parameter $b of method ParamClosureThisClasses\Bar::doFoo() has invalid type ParamClosureThisClasses\FooTrait.',
502+
25,
503+
],
504+
[
505+
'Class ParamClosureThisClasses\Foo referenced with incorrect case: ParamClosureThisClasses\fOO.',
506+
26,
507+
],
508+
]);
509+
}
510+
493511
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
<?php
2+
3+
namespace ParamClosureThisClasses;
4+
5+
trait FooTrait
6+
{
7+
8+
}
9+
10+
class Foo
11+
{
12+
13+
}
14+
15+
class Bar
16+
{
17+
18+
/**
19+
* @param-closure-this Nonexistent $a
20+
* @param-closure-this FooTrait $b
21+
* @param-closure-this fOO $c
22+
*/
23+
public function doFoo(
24+
callable $a,
25+
callable $b,
26+
callable $c
27+
): void
28+
{
29+
30+
}
31+
32+
}

0 commit comments

Comments
 (0)