Skip to content

Commit 08703d1

Browse files
committed
Fix result cache getting stale because of trait @use
1 parent 6a4eb02 commit 08703d1

File tree

10 files changed

+83
-1
lines changed

10 files changed

+83
-1
lines changed

.github/workflows/e2e-tests.yml

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -82,6 +82,16 @@ jobs:
8282
mv src/Bar.php.orig src/Bar.php
8383
echo -n > phpstan-baseline.neon
8484
../../bin/phpstan -vvv
85+
- script: |
86+
cd e2e/result-cache-3
87+
echo -n > phpstan-baseline.neon
88+
../../bin/phpstan -vvv
89+
patch -b src/Baz.php < patch-1.patch
90+
cat baseline-1.neon > phpstan-baseline.neon
91+
../../bin/phpstan -vvv
92+
mv src/Baz.php.orig src/Baz.php
93+
echo -n > phpstan-baseline.neon
94+
../../bin/phpstan -vvv
8595
8696
steps:
8797
- name: "Checkout"

e2e/result-cache-3/baseline-1.neon

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
parameters:
2+
ignoreErrors:
3+
-
4+
message: "#^Type TestResultCache3\\\\Baz in generic type TestResultCache3\\\\BarTrait\\<TestResultCache3\\\\Baz\\> in PHPDoc tag @use is not subtype of template type T of Exception of trait TestResultCache3\\\\BarTrait\\.$#"
5+
count: 1
6+
path: src/Foo.php

e2e/result-cache-3/patch-1.patch

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
--- src/Baz.php 2022-10-24 14:28:45.000000000 +0200
2+
+++ src/Baz.php 2022-10-24 14:30:02.000000000 +0200
3+
@@ -2,7 +2,7 @@
4+
5+
namespace TestResultCache3;
6+
7+
-class Baz extends \Exception
8+
+class Baz extends \stdClass
9+
{
10+
11+
}

e2e/result-cache-3/phpstan-baseline.neon

Whitespace-only changes.

e2e/result-cache-3/phpstan.neon

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
includes:
2+
- phpstan-baseline.neon
3+
4+
parameters:
5+
level: 8
6+
paths:
7+
- src

e2e/result-cache-3/src/BarTrait.php

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
<?php
2+
3+
namespace TestResultCache3;
4+
5+
/**
6+
* @template T of \Exception
7+
*/
8+
trait BarTrait
9+
{
10+
11+
}

e2e/result-cache-3/src/Baz.php

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
<?php
2+
3+
namespace TestResultCache3;
4+
5+
class Baz extends \Exception
6+
{
7+
8+
}

e2e/result-cache-3/src/Foo.php

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
<?php
2+
3+
namespace TestResultCache3;
4+
5+
class Foo
6+
{
7+
8+
/** @use BarTrait<Baz> */
9+
use BarTrait;
10+
11+
}

src/Dependency/DependencyResolver.php

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@
2121
use PHPStan\Reflection\ReflectionProvider;
2222
use PHPStan\Type\ClosureType;
2323
use PHPStan\Type\Constant\ConstantStringType;
24+
use PHPStan\Type\FileTypeMapper;
2425
use PHPStan\Type\Type;
2526
use function array_merge;
2627
use function count;
@@ -32,6 +33,7 @@ public function __construct(
3233
private FileHelper $fileHelper,
3334
private ReflectionProvider $reflectionProvider,
3435
private ExportedNodeResolver $exportedNodeResolver,
36+
private FileTypeMapper $fileTypeMapper,
3537
)
3638
{
3739
}
@@ -260,6 +262,22 @@ public function resolveDependencies(Node $node, Scope $scope): NodeDependencies
260262
foreach ($node->traits as $traitName) {
261263
$this->addClassToDependencies($traitName->toString(), $dependenciesReflections);
262264
}
265+
266+
$docComment = $node->getDocComment();
267+
if ($docComment !== null) {
268+
$usesTags = $this->fileTypeMapper->getResolvedPhpDoc(
269+
$scope->getFile(),
270+
$scope->isInClass() ? $scope->getClassReflection()->getName() : null,
271+
$scope->isInTrait() ? $scope->getTraitReflection()->getName() : null,
272+
null,
273+
$docComment->getText(),
274+
)->getUsesTags();
275+
foreach ($usesTags as $usesTag) {
276+
foreach ($usesTag->getType()->getReferencedClasses() as $referencedClass) {
277+
$this->addClassToDependencies($referencedClass, $dependenciesReflections);
278+
}
279+
}
280+
}
263281
} elseif ($node instanceof Node\Expr\Instanceof_) {
264282
if ($node->class instanceof Name) {
265283
$this->addClassToDependencies($scope->resolveName($node->class), $dependenciesReflections);

tests/PHPStan/Analyser/AnalyserTest.php

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -613,7 +613,7 @@ private function createAnalyser(bool $reportUnmatchedIgnoredErrors): Analyser
613613
new NameResolver(),
614614
self::getContainer(),
615615
),
616-
new DependencyResolver($fileHelper, $reflectionProvider, new ExportedNodeResolver($fileTypeMapper, new ExprPrinter(new Printer()))),
616+
new DependencyResolver($fileHelper, $reflectionProvider, new ExportedNodeResolver($fileTypeMapper, new ExprPrinter(new Printer())), $fileTypeMapper),
617617
new RuleErrorTransformer(),
618618
$reportUnmatchedIgnoredErrors,
619619
);

0 commit comments

Comments
 (0)