From 4c0cb98c84f7c4dfe62e21f6b163529a150861fe Mon Sep 17 00:00:00 2001 From: Ondrej Mirtes Date: Mon, 17 Oct 2022 21:47:22 +0200 Subject: [PATCH] Include `@template` tags in the result cache --- .github/workflows/e2e-tests.yml | 10 ++++++++++ e2e/result-cache-2/baseline-1.neon | 6 ++++++ e2e/result-cache-2/patch-1.patch | 11 +++++++++++ e2e/result-cache-2/phpstan-baseline.neon | 0 e2e/result-cache-2/phpstan.neon | 7 +++++++ e2e/result-cache-2/src/Bar.php | 8 ++++++++ e2e/result-cache-2/src/Foo.php | 11 +++++++++++ src/Dependency/DependencyResolver.php | 18 ++++++++++++++++++ 8 files changed, 71 insertions(+) create mode 100644 e2e/result-cache-2/baseline-1.neon create mode 100644 e2e/result-cache-2/patch-1.patch create mode 100644 e2e/result-cache-2/phpstan-baseline.neon create mode 100644 e2e/result-cache-2/phpstan.neon create mode 100644 e2e/result-cache-2/src/Bar.php create mode 100644 e2e/result-cache-2/src/Foo.php diff --git a/.github/workflows/e2e-tests.yml b/.github/workflows/e2e-tests.yml index 2da9a70f6f..dedcf06bd4 100644 --- a/.github/workflows/e2e-tests.yml +++ b/.github/workflows/e2e-tests.yml @@ -72,6 +72,16 @@ jobs: mv src/Bar.php.orig src/Bar.php echo -n > phpstan-baseline.neon ../../bin/phpstan -vvv + - script: | + cd e2e/result-cache-2 + echo -n > phpstan-baseline.neon + ../../bin/phpstan -vvv + patch -b src/Bar.php < patch-1.patch + cat baseline-1.neon > phpstan-baseline.neon + ../../bin/phpstan -vvv + mv src/Bar.php.orig src/Bar.php + echo -n > phpstan-baseline.neon + ../../bin/phpstan -vvv steps: - name: "Checkout" diff --git a/e2e/result-cache-2/baseline-1.neon b/e2e/result-cache-2/baseline-1.neon new file mode 100644 index 0000000000..6f5ca81f75 --- /dev/null +++ b/e2e/result-cache-2/baseline-1.neon @@ -0,0 +1,6 @@ +parameters: + ignoreErrors: + - + message: "#^PHPDoc tag @template T for class TestResultCache2\\\\Foo has invalid bound type TestResultCache2\\\\Bar\\.$#" + count: 1 + path: src/Foo.php diff --git a/e2e/result-cache-2/patch-1.patch b/e2e/result-cache-2/patch-1.patch new file mode 100644 index 0000000000..fe25230d43 --- /dev/null +++ b/e2e/result-cache-2/patch-1.patch @@ -0,0 +1,11 @@ +--- src/Bar.php 2022-10-17 21:44:38.000000000 +0200 ++++ src/Bar.php 2022-10-17 21:45:31.000000000 +0200 +@@ -2,7 +2,7 @@ + + namespace TestResultCache2; + +-class Bar ++class Barr + { + + } diff --git a/e2e/result-cache-2/phpstan-baseline.neon b/e2e/result-cache-2/phpstan-baseline.neon new file mode 100644 index 0000000000..e69de29bb2 diff --git a/e2e/result-cache-2/phpstan.neon b/e2e/result-cache-2/phpstan.neon new file mode 100644 index 0000000000..ddbf4c2114 --- /dev/null +++ b/e2e/result-cache-2/phpstan.neon @@ -0,0 +1,7 @@ +includes: + - phpstan-baseline.neon + +parameters: + level: 8 + paths: + - src diff --git a/e2e/result-cache-2/src/Bar.php b/e2e/result-cache-2/src/Bar.php new file mode 100644 index 0000000000..9a2cbae9a3 --- /dev/null +++ b/e2e/result-cache-2/src/Bar.php @@ -0,0 +1,8 @@ +namespacedName !== null) { + $this->addClassToDependencies($node->namespacedName->toString(), $dependenciesReflections); + } if ($node->extends !== null) { $this->addClassToDependencies($node->extends->toString(), $dependenciesReflections); } @@ -48,10 +51,16 @@ public function resolveDependencies(Node $node, Scope $scope): NodeDependencies $this->addClassToDependencies($className->toString(), $dependenciesReflections); } } elseif ($node instanceof Node\Stmt\Interface_) { + if ($node->namespacedName !== null) { + $this->addClassToDependencies($node->namespacedName->toString(), $dependenciesReflections); + } foreach ($node->extends as $className) { $this->addClassToDependencies($className->toString(), $dependenciesReflections); } } elseif ($node instanceof Node\Stmt\Enum_) { + if ($node->namespacedName !== null) { + $this->addClassToDependencies($node->namespacedName->toString(), $dependenciesReflections); + } foreach ($node->implements as $className) { $this->addClassToDependencies($className->toString(), $dependenciesReflections); } @@ -243,6 +252,15 @@ private function addClassToDependencies(string $className, array &$dependenciesR } } + foreach ($classReflection->getTemplateTags() as $templateTag) { + foreach ($templateTag->getBound()->getReferencedClasses() as $referencedClass) { + if (!$this->reflectionProvider->hasClass($referencedClass)) { + continue; + } + $dependenciesReflections[] = $this->reflectionProvider->getClass($referencedClass); + } + } + $classReflection = $classReflection->getParentClass(); } while ($classReflection !== null); }