Skip to content

Commit 3559a4a

Browse files
committed
AssertRuleHelper - InitializerExprTypeResolver does not have support for resolving method call types, use Scope instead
1 parent 33359be commit 3559a4a

File tree

5 files changed

+37
-12
lines changed

5 files changed

+37
-12
lines changed

src/Rules/PhpDoc/AssertRuleHelper.php

Lines changed: 1 addition & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -11,8 +11,6 @@
1111
use PHPStan\PhpDoc\Tag\AssertTag;
1212
use PHPStan\Reflection\ExtendedMethodReflection;
1313
use PHPStan\Reflection\FunctionReflection;
14-
use PHPStan\Reflection\InitializerExprContext;
15-
use PHPStan\Reflection\InitializerExprTypeResolver;
1614
use PHPStan\Reflection\ParametersAcceptor;
1715
use PHPStan\Reflection\ReflectionProvider;
1816
use PHPStan\Rules\ClassNameCheck;
@@ -35,7 +33,6 @@ final class AssertRuleHelper
3533
{
3634

3735
public function __construct(
38-
private InitializerExprTypeResolver $initializerExprTypeResolver,
3936
private ReflectionProvider $reflectionProvider,
4037
private UnresolvableTypeHelper $unresolvableTypeHelper,
4138
private ClassNameCheck $classCheck,
@@ -69,8 +66,6 @@ public function check(
6966
$parametersByName['this'] = new ObjectType($class->getName(), classReflection: $class);
7067
}
7168

72-
$context = InitializerExprContext::createEmpty();
73-
7469
$errors = [];
7570
foreach ($reflection->getAsserts()->getAll() as $assert) {
7671
$parameterName = substr($assert->getParameter()->getParameterName(), 1);
@@ -86,7 +81,7 @@ public function check(
8681
}
8782

8883
$assertedExpr = $assert->getParameter()->getExpr(new TypeExpr($parametersByName[$parameterName]));
89-
$assertedExprType = $this->initializerExprTypeResolver->getType($assertedExpr, $context);
84+
$assertedExprType = $scope->getType($assertedExpr);
9085
$assertedExprString = $assert->getParameter()->describe();
9186
if ($assertedExprType instanceof ErrorType) {
9287
$errors[] = RuleErrorBuilder::message(sprintf('Assert references unknown %s.', $assertedExprString))

stubs/ReflectionEnumWithLazyObjects.stub

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,4 +24,6 @@ class ReflectionEnum extends ReflectionClass
2424
*/
2525
public function isBacked(): bool {}
2626

27+
public function getBackingType(): ?ReflectionNamedType;
28+
2729
}

tests/PHPStan/Rules/PhpDoc/FunctionAssertRuleTest.php

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,6 @@
22

33
namespace PHPStan\Rules\PhpDoc;
44

5-
use PHPStan\Reflection\InitializerExprTypeResolver;
65
use PHPStan\Rules\ClassCaseSensitivityCheck;
76
use PHPStan\Rules\ClassForbiddenNameCheck;
87
use PHPStan\Rules\ClassNameCheck;
@@ -19,10 +18,8 @@ class FunctionAssertRuleTest extends RuleTestCase
1918

2019
protected function getRule(): Rule
2120
{
22-
$initializerExprTypeResolver = self::getContainer()->getByType(InitializerExprTypeResolver::class);
2321
$reflectionProvider = self::createReflectionProvider();
2422
return new FunctionAssertRule(new AssertRuleHelper(
25-
$initializerExprTypeResolver,
2623
$reflectionProvider,
2724
new UnresolvableTypeHelper(),
2825
new ClassNameCheck(

tests/PHPStan/Rules/PhpDoc/MethodAssertRuleTest.php

Lines changed: 10 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,6 @@
22

33
namespace PHPStan\Rules\PhpDoc;
44

5-
use PHPStan\Reflection\InitializerExprTypeResolver;
65
use PHPStan\Rules\ClassCaseSensitivityCheck;
76
use PHPStan\Rules\ClassForbiddenNameCheck;
87
use PHPStan\Rules\ClassNameCheck;
@@ -19,10 +18,8 @@ class MethodAssertRuleTest extends RuleTestCase
1918

2019
protected function getRule(): Rule
2120
{
22-
$initializerExprTypeResolver = self::getContainer()->getByType(InitializerExprTypeResolver::class);
2321
$reflectionProvider = self::createReflectionProvider();
2422
return new MethodAssertRule(new AssertRuleHelper(
25-
$initializerExprTypeResolver,
2623
$reflectionProvider,
2724
new UnresolvableTypeHelper(),
2825
new ClassNameCheck(
@@ -153,4 +150,14 @@ public function testBug10594(): void
153150
$this->analyse([__DIR__ . '/data/bug-10594.php'], []);
154151
}
155152

153+
public function testBugIncompatibleAssertTypeWithMethodReturnType(): void
154+
{
155+
$this->analyse([__DIR__ . '/data/incompatible-assert-type-with-method-return-type.php'], [
156+
[
157+
'Asserted type non-empty-list<static(IncompatibleAssertTypeWithMethodReturnType\Foo)> for $this->getValues() with type list<int> can never happen.',
158+
19,
159+
],
160+
]);
161+
}
162+
156163
}
Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
<?php
2+
3+
namespace IncompatibleAssertTypeWithMethodReturnType;
4+
5+
class Foo
6+
{
7+
8+
/**
9+
* @return list<int>
10+
*/
11+
public function getValues(): array
12+
{
13+
14+
}
15+
16+
/**
17+
* @phpstan-assert-if-false non-empty-list<static> $this->getValues()
18+
*/
19+
public function isEmpty(): bool
20+
{
21+
22+
}
23+
24+
}

0 commit comments

Comments
 (0)