From 6411cb903602dcb8a4b0adc8c71a0cd4ef36c8e4 Mon Sep 17 00:00:00 2001 From: Ondrej Mirtes Date: Thu, 10 Jul 2025 13:06:46 +0200 Subject: [PATCH 1/4] Test Symfony 7.3 --- composer.json | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/composer.json b/composer.json index 0d5cd41c..6d1ab244 100644 --- a/composer.json +++ b/composer.json @@ -27,15 +27,15 @@ "phpstan/phpstan-strict-rules": "^1.5.1", "phpunit/phpunit": "^8.5.29 || ^9.5", "psr/container": "1.0 || 1.1.1", - "symfony/config": "^5.4 || ^6.1", - "symfony/console": "^5.4 || ^6.1", - "symfony/dependency-injection": "^5.4 || ^6.1", - "symfony/form": "^5.4 || ^6.1", - "symfony/framework-bundle": "^5.4 || ^6.1", - "symfony/http-foundation": "^5.4 || ^6.1", - "symfony/messenger": "^5.4", + "symfony/config": "^5.4 || ^6.1 || ^7.3", + "symfony/console": "^5.4 || ^6.1 || ^7.3", + "symfony/dependency-injection": "^5.4 || ^6.1 || ^7.3", + "symfony/form": "^5.4 || ^6.1 || ^7.3", + "symfony/framework-bundle": "^5.4 || ^6.1 || ^7.3", + "symfony/http-foundation": "^5.4 || ^6.1 || ^7.3", + "symfony/messenger": "^5.4 || ^6.4 || ^7.3", "symfony/polyfill-php80": "^1.24", - "symfony/serializer": "^5.4", + "symfony/serializer": "^5.4 || ^6.4 || ^7.3", "symfony/service-contracts": "^2.2.0" }, "config": { From fa4fc64f6f30bc0eedd946eccffb09d32a5314dd Mon Sep 17 00:00:00 2001 From: Ondrej Mirtes Date: Thu, 10 Jul 2025 13:11:37 +0200 Subject: [PATCH 2/4] Fix build --- src/Symfony/MessageMapFactory.php | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/Symfony/MessageMapFactory.php b/src/Symfony/MessageMapFactory.php index 5c9ef152..e8148384 100644 --- a/src/Symfony/MessageMapFactory.php +++ b/src/Symfony/MessageMapFactory.php @@ -4,7 +4,6 @@ use PHPStan\Reflection\ClassReflection; use PHPStan\Reflection\ReflectionProvider; -use Symfony\Component\Messenger\Handler\MessageSubscriberInterface; use function class_exists; use function count; use function is_array; @@ -91,7 +90,7 @@ public function create(): MessageMap /** @return iterable> */ private function guessHandledMessages(ClassReflection $reflectionClass): iterable { - if ($reflectionClass->implementsInterface(MessageSubscriberInterface::class)) { + if ($reflectionClass->implementsInterface('Symfony\\Component\\Messenger\\Handler\\MessageSubscriberInterface')) { $className = $reflectionClass->getName(); foreach ($className::getHandledMessages() as $index => $value) { From fd9a06f46ecdf3c8fc110002d809c3cbf1966146 Mon Sep 17 00:00:00 2001 From: Ondrej Mirtes Date: Thu, 10 Jul 2025 13:15:54 +0200 Subject: [PATCH 3/4] Remove untested files --- ...mpleAbstractControllerWithoutContainer.php | 115 ------------------ .../ExampleControllerWithoutContainer.php | 115 ------------------ 2 files changed, 230 deletions(-) delete mode 100644 tests/Type/Symfony/data/ExampleAbstractControllerWithoutContainer.php delete mode 100644 tests/Type/Symfony/data/ExampleControllerWithoutContainer.php diff --git a/tests/Type/Symfony/data/ExampleAbstractControllerWithoutContainer.php b/tests/Type/Symfony/data/ExampleAbstractControllerWithoutContainer.php deleted file mode 100644 index edc6438a..00000000 --- a/tests/Type/Symfony/data/ExampleAbstractControllerWithoutContainer.php +++ /dev/null @@ -1,115 +0,0 @@ -get('foo')); - assertType('object', $this->get('synthetic')); - assertType('object', $this->get('bar')); - assertType('object', $this->get(doFoo())); - assertType('object', $this->get()); - - assertType('bool', $this->has('foo')); - assertType('bool', $this->has('synthetic')); - assertType('bool', $this->has('bar')); - assertType('bool', $this->has(doFoo())); - assertType('bool', $this->has()); - } - - public function parameters(ContainerInterface $container, ParameterBagInterface $parameterBag): void - { - assertType('array|bool|float|int|string|null', $container->getParameter('unknown')); - assertType('array|bool|float|int|string|null', $parameterBag->get('unknown')); - assertType('array|bool|float|int|string|null', $this->getParameter('unknown')); - assertType('array|bool|float|int|string|null', $container->getParameter('app.string')); - assertType('array|bool|float|int|string|null', $parameterBag->get('app.string')); - assertType('array|bool|float|int|string|null', $this->getParameter('app.string')); - assertType('array|bool|float|int|string|null', $container->getParameter('app.int')); - assertType('array|bool|float|int|string|null', $parameterBag->get('app.int')); - assertType('array|bool|float|int|string|null', $this->getParameter('app.int')); - assertType('array|bool|float|int|string|null', $container->getParameter('app.int_as_string')); - assertType('array|bool|float|int|string|null', $parameterBag->get('app.int_as_string')); - assertType('array|bool|float|int|string|null', $this->getParameter('app.int_as_string')); - assertType('array|bool|float|int|string|null', $container->getParameter('app.int_as_processor')); - assertType('array|bool|float|int|string|null', $parameterBag->get('app.int_as_processor')); - assertType('array|bool|float|int|string|null', $this->getParameter('app.int_as_processor')); - assertType('array|bool|float|int|string|null', $container->getParameter('app.float')); - assertType('array|bool|float|int|string|null', $parameterBag->get('app.float')); - assertType('array|bool|float|int|string|null', $this->getParameter('app.float')); - assertType('array|bool|float|int|string|null', $container->getParameter('app.float_as_string')); - assertType('array|bool|float|int|string|null', $parameterBag->get('app.float_as_string')); - assertType('array|bool|float|int|string|null', $this->getParameter('app.float_as_string')); - assertType('array|bool|float|int|string|null', $container->getParameter('app.float_as_processor')); - assertType('array|bool|float|int|string|null', $parameterBag->get('app.float_as_processor')); - assertType('array|bool|float|int|string|null', $this->getParameter('app.float_as_processor')); - assertType('array|bool|float|int|string|null', $container->getParameter('app.boolean')); - assertType('array|bool|float|int|string|null', $parameterBag->get('app.boolean')); - assertType('array|bool|float|int|string|null', $this->getParameter('app.boolean')); - assertType('array|bool|float|int|string|null', $container->getParameter('app.boolean_as_string')); - assertType('array|bool|float|int|string|null', $parameterBag->get('app.boolean_as_string')); - assertType('array|bool|float|int|string|null', $this->getParameter('app.boolean_as_string')); - assertType('array|bool|float|int|string|null', $container->getParameter('app.boolean_as_processor')); - assertType('array|bool|float|int|string|null', $parameterBag->get('app.boolean_as_processor')); - assertType('array|bool|float|int|string|null', $this->getParameter('app.boolean_as_processor')); - assertType('array|bool|float|int|string|null', $container->getParameter('app.list')); - assertType('array|bool|float|int|string|null', $parameterBag->get('app.list')); - assertType('array|bool|float|int|string|null', $this->getParameter('app.list')); - assertType('array|bool|float|int|string|null', $container->getParameter('app.list_of_list')); - assertType('array|bool|float|int|string|null', $parameterBag->get('app.list_of_list')); - assertType('array|bool|float|int|string|null', $this->getParameter('app.list_of_list')); - assertType('array|bool|float|int|string|null', $container->getParameter('app.array_of_list')); - assertType('array|bool|float|int|string|null', $parameterBag->get('app.array_of_list')); - assertType('array|bool|float|int|string|null', $this->getParameter('app.array_of_list')); - assertType('array|bool|float|int|string|null', $container->getParameter('app.map')); - assertType('array|bool|float|int|string|null', $parameterBag->get('app.map')); - assertType('array|bool|float|int|string|null', $this->getParameter('app.map')); - assertType('array|bool|float|int|string|null', $container->getParameter('app.binary')); - assertType('array|bool|float|int|string|null', $parameterBag->get('app.binary')); - assertType('array|bool|float|int|string|null', $this->getParameter('app.binary')); - assertType('array|bool|float|int|string|null', $container->getParameter('app.constant')); - assertType('array|bool|float|int|string|null', $parameterBag->get('app.constant')); - assertType('array|bool|float|int|string|null', $this->getParameter('app.constant')); - - assertType('bool', $container->hasParameter('unknown')); - assertType('bool', $parameterBag->has('unknown')); - assertType('bool', $container->hasParameter('app.string')); - assertType('bool', $parameterBag->has('app.string')); - assertType('bool', $container->hasParameter('app.int')); - assertType('bool', $parameterBag->has('app.int')); - assertType('bool', $container->hasParameter('app.int_as_string')); - assertType('bool', $parameterBag->has('app.int_as_string')); - assertType('bool', $container->hasParameter('app.int_as_processor')); - assertType('bool', $parameterBag->has('app.int_as_processor')); - assertType('bool', $container->hasParameter('app.float')); - assertType('bool', $parameterBag->has('app.float')); - assertType('bool', $container->hasParameter('app.float_as_string')); - assertType('bool', $parameterBag->has('app.float_as_string')); - assertType('bool', $container->hasParameter('app.float_as_processor')); - assertType('bool', $parameterBag->has('app.float_as_processor')); - assertType('bool', $container->hasParameter('app.boolean')); - assertType('bool', $parameterBag->has('app.boolean')); - assertType('bool', $container->hasParameter('app.boolean_as_string')); - assertType('bool', $parameterBag->has('app.boolean_as_string')); - assertType('bool', $container->hasParameter('app.boolean_as_processor')); - assertType('bool', $parameterBag->has('app.boolean_as_processor')); - assertType('bool', $container->hasParameter('app.list')); - assertType('bool', $parameterBag->has('app.list')); - assertType('bool', $container->hasParameter('app.list_of_list')); - assertType('bool', $parameterBag->has('app.list_of_list')); - assertType('bool', $container->hasParameter('app.map')); - assertType('bool', $parameterBag->has('app.map')); - assertType('bool', $container->hasParameter('app.binary')); - assertType('bool', $parameterBag->has('app.binary')); - assertType('bool', $container->hasParameter('app.constant')); - assertType('bool', $parameterBag->has('app.constant')); - } - -} diff --git a/tests/Type/Symfony/data/ExampleControllerWithoutContainer.php b/tests/Type/Symfony/data/ExampleControllerWithoutContainer.php deleted file mode 100644 index 2e48dc80..00000000 --- a/tests/Type/Symfony/data/ExampleControllerWithoutContainer.php +++ /dev/null @@ -1,115 +0,0 @@ -get('foo')); - assertType('object', $this->get('synthetic')); - assertType('object', $this->get('bar')); - assertType('object', $this->get(doFoo())); - assertType('object', $this->get()); - - assertType('bool', $this->has('foo')); - assertType('bool', $this->has('synthetic')); - assertType('bool', $this->has('bar')); - assertType('bool', $this->has(doFoo())); - assertType('bool', $this->has()); - } - - public function parameters(ContainerInterface $container, ParameterBagInterface $parameterBag): void - { - assertType('array|bool|float|int|string|null', $container->getParameter('unknown')); - assertType('array|bool|float|int|string|null', $parameterBag->get('unknown')); - assertType('array|bool|float|int|string|null', $this->getParameter('unknown')); - assertType('array|bool|float|int|string|null', $container->getParameter('app.string')); - assertType('array|bool|float|int|string|null', $parameterBag->get('app.string')); - assertType('array|bool|float|int|string|null', $this->getParameter('app.string')); - assertType('array|bool|float|int|string|null', $container->getParameter('app.int')); - assertType('array|bool|float|int|string|null', $parameterBag->get('app.int')); - assertType('array|bool|float|int|string|null', $this->getParameter('app.int')); - assertType('array|bool|float|int|string|null', $container->getParameter('app.int_as_string')); - assertType('array|bool|float|int|string|null', $parameterBag->get('app.int_as_string')); - assertType('array|bool|float|int|string|null', $this->getParameter('app.int_as_string')); - assertType('array|bool|float|int|string|null', $container->getParameter('app.int_as_processor')); - assertType('array|bool|float|int|string|null', $parameterBag->get('app.int_as_processor')); - assertType('array|bool|float|int|string|null', $this->getParameter('app.int_as_processor')); - assertType('array|bool|float|int|string|null', $container->getParameter('app.float')); - assertType('array|bool|float|int|string|null', $parameterBag->get('app.float')); - assertType('array|bool|float|int|string|null', $this->getParameter('app.float')); - assertType('array|bool|float|int|string|null', $container->getParameter('app.float_as_string')); - assertType('array|bool|float|int|string|null', $parameterBag->get('app.float_as_string')); - assertType('array|bool|float|int|string|null', $this->getParameter('app.float_as_string')); - assertType('array|bool|float|int|string|null', $container->getParameter('app.float_as_processor')); - assertType('array|bool|float|int|string|null', $parameterBag->get('app.float_as_processor')); - assertType('array|bool|float|int|string|null', $this->getParameter('app.float_as_processor')); - assertType('array|bool|float|int|string|null', $container->getParameter('app.boolean')); - assertType('array|bool|float|int|string|null', $parameterBag->get('app.boolean')); - assertType('array|bool|float|int|string|null', $this->getParameter('app.boolean')); - assertType('array|bool|float|int|string|null', $container->getParameter('app.boolean_as_string')); - assertType('array|bool|float|int|string|null', $parameterBag->get('app.boolean_as_string')); - assertType('array|bool|float|int|string|null', $this->getParameter('app.boolean_as_string')); - assertType('array|bool|float|int|string|null', $container->getParameter('app.boolean_as_processor')); - assertType('array|bool|float|int|string|null', $parameterBag->get('app.boolean_as_processor')); - assertType('array|bool|float|int|string|null', $this->getParameter('app.boolean_as_processor')); - assertType('array|bool|float|int|string|null', $container->getParameter('app.list')); - assertType('array|bool|float|int|string|null', $parameterBag->get('app.list')); - assertType('array|bool|float|int|string|null', $this->getParameter('app.list')); - assertType('array|bool|float|int|string|null', $container->getParameter('app.list_of_list')); - assertType('array|bool|float|int|string|null', $parameterBag->get('app.list_of_list')); - assertType('array|bool|float|int|string|null', $this->getParameter('app.list_of_list')); - assertType('array|bool|float|int|string|null', $container->getParameter('app.array_of_list')); - assertType('array|bool|float|int|string|null', $parameterBag->get('app.array_of_list')); - assertType('array|bool|float|int|string|null', $this->getParameter('app.array_of_list')); - assertType('array|bool|float|int|string|null', $container->getParameter('app.map')); - assertType('array|bool|float|int|string|null', $parameterBag->get('app.map')); - assertType('array|bool|float|int|string|null', $this->getParameter('app.map')); - assertType('array|bool|float|int|string|null', $container->getParameter('app.binary')); - assertType('array|bool|float|int|string|null', $parameterBag->get('app.binary')); - assertType('array|bool|float|int|string|null', $this->getParameter('app.binary')); - assertType('array|bool|float|int|string|null', $container->getParameter('app.constant')); - assertType('array|bool|float|int|string|null', $parameterBag->get('app.constant')); - assertType('array|bool|float|int|string|null', $this->getParameter('app.constant')); - - assertType('bool', $container->hasParameter('unknown')); - assertType('bool', $parameterBag->has('unknown')); - assertType('bool', $container->hasParameter('app.string')); - assertType('bool', $parameterBag->has('app.string')); - assertType('bool', $container->hasParameter('app.int')); - assertType('bool', $parameterBag->has('app.int')); - assertType('bool', $container->hasParameter('app.int_as_string')); - assertType('bool', $parameterBag->has('app.int_as_string')); - assertType('bool', $container->hasParameter('app.int_as_processor')); - assertType('bool', $parameterBag->has('app.int_as_processor')); - assertType('bool', $container->hasParameter('app.float')); - assertType('bool', $parameterBag->has('app.float')); - assertType('bool', $container->hasParameter('app.float_as_string')); - assertType('bool', $parameterBag->has('app.float_as_string')); - assertType('bool', $container->hasParameter('app.float_as_processor')); - assertType('bool', $parameterBag->has('app.float_as_processor')); - assertType('bool', $container->hasParameter('app.boolean')); - assertType('bool', $parameterBag->has('app.boolean')); - assertType('bool', $container->hasParameter('app.boolean_as_string')); - assertType('bool', $parameterBag->has('app.boolean_as_string')); - assertType('bool', $container->hasParameter('app.boolean_as_processor')); - assertType('bool', $parameterBag->has('app.boolean_as_processor')); - assertType('bool', $container->hasParameter('app.list')); - assertType('bool', $parameterBag->has('app.list')); - assertType('bool', $container->hasParameter('app.list_of_list')); - assertType('bool', $parameterBag->has('app.list_of_list')); - assertType('bool', $container->hasParameter('app.map')); - assertType('bool', $parameterBag->has('app.map')); - assertType('bool', $container->hasParameter('app.binary')); - assertType('bool', $parameterBag->has('app.binary')); - assertType('bool', $container->hasParameter('app.constant')); - assertType('bool', $parameterBag->has('app.constant')); - } - -} From 048bb7e100e586aaae59d866edc17492c83a7ba2 Mon Sep 17 00:00:00 2001 From: Ondrej Mirtes Date: Thu, 10 Jul 2025 13:16:55 +0200 Subject: [PATCH 4/4] Fix build --- tests/Type/Symfony/ExtensionTest.php | 6 ++++ .../data/ExampleAbstractController.php | 17 ----------- .../ExampleAbstractControllerServices.php | 28 +++++++++++++++++++ 3 files changed, 34 insertions(+), 17 deletions(-) create mode 100644 tests/Type/Symfony/data/ExampleAbstractControllerServices.php diff --git a/tests/Type/Symfony/ExtensionTest.php b/tests/Type/Symfony/ExtensionTest.php index 40420be0..8b3dc691 100644 --- a/tests/Type/Symfony/ExtensionTest.php +++ b/tests/Type/Symfony/ExtensionTest.php @@ -3,6 +3,7 @@ namespace PHPStan\Type\Symfony; use PHPStan\Testing\TypeInferenceTestCase; +use ReflectionClass; use ReflectionMethod; use Symfony\Component\HttpFoundation\Request; use function class_exists; @@ -46,6 +47,11 @@ public function dataFileAsserts(): iterable if (class_exists('Symfony\Bundle\FrameworkBundle\Controller\AbstractController')) { yield from $this->gatherAssertTypes(__DIR__ . '/data/ExampleAbstractController.php'); + + $ref = new ReflectionClass('Symfony\Bundle\FrameworkBundle\Controller\AbstractController'); + if ($ref->hasMethod('get')) { + yield from $this->gatherAssertTypes(__DIR__ . '/data/ExampleAbstractControllerServices.php'); + } } yield from $this->gatherAssertTypes(__DIR__ . '/data/serializer.php'); diff --git a/tests/Type/Symfony/data/ExampleAbstractController.php b/tests/Type/Symfony/data/ExampleAbstractController.php index 53b38066..d5e0370b 100644 --- a/tests/Type/Symfony/data/ExampleAbstractController.php +++ b/tests/Type/Symfony/data/ExampleAbstractController.php @@ -10,23 +10,6 @@ final class ExampleAbstractController extends AbstractController { - public function services(): void - { - assertType('Foo', $this->get('foo')); - assertType('Foo', $this->get('parameterised_foo')); - assertType('Foo\Bar', $this->get('parameterised_bar')); - assertType('Synthetic', $this->get('synthetic')); - assertType('object', $this->get('bar')); - assertType('object', $this->get(doFoo())); - assertType('object', $this->get()); - - assertType('true', $this->has('foo')); - assertType('true', $this->has('synthetic')); - assertType('false', $this->has('bar')); - assertType('bool', $this->has(doFoo())); - assertType('bool', $this->has()); - } - public function parameters(ContainerInterface $container, ParameterBagInterface $parameterBag): void { assertType('array|bool|float|int|string|null', $container->getParameter('unknown')); diff --git a/tests/Type/Symfony/data/ExampleAbstractControllerServices.php b/tests/Type/Symfony/data/ExampleAbstractControllerServices.php new file mode 100644 index 00000000..396012dd --- /dev/null +++ b/tests/Type/Symfony/data/ExampleAbstractControllerServices.php @@ -0,0 +1,28 @@ +get('foo')); + assertType('Foo', $this->get('parameterised_foo')); + assertType('Foo\Bar', $this->get('parameterised_bar')); + assertType('Synthetic', $this->get('synthetic')); + assertType('object', $this->get('bar')); + assertType('object', $this->get(doFoo())); + assertType('object', $this->get()); + + assertType('true', $this->has('foo')); + assertType('true', $this->has('synthetic')); + assertType('false', $this->has('bar')); + assertType('bool', $this->has(doFoo())); + assertType('bool', $this->has()); + } + +}