Skip to content

Commit 1865171

Browse files
authored
feat: improve phpstan level 6 and resolve all errors (#2157)
1 parent 20e26d9 commit 1865171

16 files changed

+83
-21
lines changed

phpstan.neon.dist

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,8 @@
11
parameters:
2-
level: 5
2+
level: 6
3+
reportUnmatchedIgnoredErrors: true
34
paths:
45
- config
56
- src
67
- tests
78
ignoreErrors:
8-
# phpstan has no array shape intersection support https://github.com/phpstan/phpstan/issues/12414
9-
- message: '#unresolvable type.#'
10-
path: src/DataCollector/DoctrineDataCollector.php

src/DataCollector/DoctrineDataCollector.php

Lines changed: 30 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -25,14 +25,6 @@
2525
use function usort;
2626

2727
/**
28-
* @phpstan-type QueryType = array{
29-
* executionMS: float,
30-
* explainable: bool,
31-
* sql: string,
32-
* params: ?array<array-key, mixed>,
33-
* runnable: bool,
34-
* types: ?array<array-key, Type|int|string|null>,
35-
* }
3628
* @phpstan-type DataType = array{
3729
* caches: array{
3830
* enabled: bool,
@@ -44,7 +36,14 @@
4436
* entities: array<string, array<class-string, array{class: class-string, file: false|string, line: false|int}>>,
4537
* errors: array<string, array<class-string, list<string>>>,
4638
* managers: list<string>,
47-
* queries: array<string, list<QueryType>>,
39+
* queries: array<string, list<array{
40+
* executionMS: float,
41+
* explainable: bool,
42+
* sql: string,
43+
* params: ?array<array-key, mixed>,
44+
* runnable: bool,
45+
* types: ?array<array-key, Type|int|string|null>
46+
* }>>,
4847
* entityCounts: array<string, array<class-string, int>>
4948
* }
5049
* @psalm-property DataType $data
@@ -57,8 +56,17 @@ class DoctrineDataCollector extends BaseCollector
5756

5857
/**
5958
* @var mixed[][]|null
60-
* @phpstan-var ?array<string, list<QueryType&array{count: int, index: int, executionPercent?: float}>>
61-
* @phpstan-ignore property.unusedType
59+
* @phpstan-var ?array<string, list<array{
60+
* executionMS: float,
61+
* explainable: bool,
62+
* sql: string,
63+
* params: ?array<array-key, mixed>,
64+
* runnable: bool,
65+
* types: ?array<array-key, Type|int|string|null>,
66+
* count: int,
67+
* index: int,
68+
* executionPercent?: float
69+
* }>>
6270
*/
6371
private array|null $groupedQueries = null;
6472

@@ -261,7 +269,17 @@ public function getManagedEntityCountByClass(): array
261269

262270
/**
263271
* @return string[][]
264-
* @phpstan-return array<string, list<QueryType&array{count: int, index: int, executionPercent?: float}>>
272+
* @phpstan-return array<string, list<array{
273+
* executionMS: float,
274+
* explainable: bool,
275+
* sql: string,
276+
* params: ?array<array-key, mixed>,
277+
* runnable: bool,
278+
* types: ?array<array-key, Type|int|string|null>,
279+
* count: int,
280+
* index: int,
281+
* executionPercent?: float
282+
* }>>
265283
*/
266284
public function getGroupedQueries(): array
267285
{

src/Dbal/RegexSchemaAssetFilter.php

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
namespace Doctrine\Bundle\DoctrineBundle\Dbal;
66

77
use Doctrine\DBAL\Schema\AbstractAsset;
8+
use Doctrine\DBAL\Schema\Name;
89

910
use function preg_match;
1011

@@ -15,6 +16,7 @@ public function __construct(
1516
) {
1617
}
1718

19+
/** @param string|AbstractAsset<Name> $assetName */
1820
public function __invoke(string|AbstractAsset $assetName): bool
1921
{
2022
if ($assetName instanceof AbstractAsset) {

src/Dbal/SchemaAssetsFilterManager.php

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
namespace Doctrine\Bundle\DoctrineBundle\Dbal;
66

77
use Doctrine\DBAL\Schema\AbstractAsset;
8+
use Doctrine\DBAL\Schema\Name;
89

910
/**
1011
* Manages schema filters passed to Connection::setSchemaAssetsFilter()
@@ -17,6 +18,7 @@ public function __construct(
1718
) {
1819
}
1920

21+
/** @param string|AbstractAsset<Name> $assetName */
2022
public function __invoke(string|AbstractAsset $assetName): bool
2123
{
2224
foreach ($this->schemaAssetFilters as $schemaAssetFilter) {

src/DependencyInjection/Configuration.php

Lines changed: 21 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@
1212
use RuntimeException;
1313
use Symfony\Component\Config\Definition\Builder\ArrayNodeDefinition;
1414
use Symfony\Component\Config\Definition\Builder\NodeDefinition;
15+
use Symfony\Component\Config\Definition\Builder\NodeParentInterface;
1516
use Symfony\Component\Config\Definition\Builder\TreeBuilder;
1617
use Symfony\Component\Config\Definition\ConfigurationInterface;
1718
use Symfony\Component\DependencyInjection\Exception\LogicException;
@@ -48,6 +49,7 @@ public function __construct(private bool $debug)
4849
{
4950
}
5051

52+
/** @return TreeBuilder<'array'> */
5153
public function getConfigTreeBuilder(): TreeBuilder
5254
{
5355
$treeBuilder = new TreeBuilder('doctrine');
@@ -61,6 +63,8 @@ public function getConfigTreeBuilder(): TreeBuilder
6163

6264
/**
6365
* Add DBAL section to configuration tree
66+
*
67+
* @param ArrayNodeDefinition<TreeBuilder<'array'>> $node
6468
*/
6569
private function addDbalSection(ArrayNodeDefinition $node): void
6670
{
@@ -153,6 +157,8 @@ private function addDbalSection(ArrayNodeDefinition $node): void
153157

154158
/**
155159
* Return the dbal connections node
160+
*
161+
* @return ArrayNodeDefinition<TreeBuilder<'array'>>
156162
*/
157163
private function getDbalConnectionsNode(): ArrayNodeDefinition
158164
{
@@ -226,7 +232,11 @@ private function getDbalConnectionsNode(): ArrayNodeDefinition
226232
* Adds config keys related to params processed by the DBAL drivers
227233
*
228234
* These keys are available for replica configurations too.
229-
*/
235+
*
236+
* @param ArrayNodeDefinition<TP> $node
237+
*
238+
* @template TP of NodeParentInterface|null
239+
**/
230240
private function configureDbalDriverNode(ArrayNodeDefinition $node): void
231241
{
232242
$node
@@ -354,6 +364,8 @@ private function configureDbalDriverNode(ArrayNodeDefinition $node): void
354364

355365
/**
356366
* Add the ORM section to configuration tree
367+
*
368+
* @param ArrayNodeDefinition<TreeBuilder<'array'>> $node
357369
*/
358370
private function addOrmSection(ArrayNodeDefinition $node): void
359371
{
@@ -449,6 +461,8 @@ private function addOrmSection(ArrayNodeDefinition $node): void
449461

450462
/**
451463
* Return ORM target entity resolver node
464+
*
465+
* @return ArrayNodeDefinition<TreeBuilder<'array'>>
452466
*/
453467
private function getOrmTargetEntityResolverNode(): NodeDefinition
454468
{
@@ -466,6 +480,8 @@ private function getOrmTargetEntityResolverNode(): NodeDefinition
466480

467481
/**
468482
* Return ORM entity listener node
483+
*
484+
* @return ArrayNodeDefinition<TreeBuilder<'array'>>
469485
*/
470486
private function getOrmEntityListenersNode(): NodeDefinition
471487
{
@@ -548,6 +564,8 @@ private function getOrmEntityListenersNode(): NodeDefinition
548564

549565
/**
550566
* Return ORM entity manager node
567+
*
568+
* @return ArrayNodeDefinition<TreeBuilder<'array'>>
551569
*/
552570
private function getOrmEntityManagersNode(): ArrayNodeDefinition
553571
{
@@ -722,6 +740,8 @@ private function getOrmEntityManagersNode(): ArrayNodeDefinition
722740

723741
/**
724742
* Return an ORM cache driver node for a given entity manager
743+
*
744+
* @return ArrayNodeDefinition<TreeBuilder<'array'>>
725745
*/
726746
private function getOrmCacheDriverNode(string $name): ArrayNodeDefinition
727747
{

src/DependencyInjection/DoctrineExtension.php

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -218,7 +218,10 @@ private function setMappingDriverConfig(array $mappingConfig, string $mappingNam
218218
*
219219
* Returns false when autodetection failed, an array of the completed information otherwise.
220220
*
221-
* @param array<string, mixed> $bundleConfig
221+
* @param array<string, mixed> $bundleConfig
222+
* @param ReflectionClass<object> $bundle
223+
*
224+
* @return array<string, mixed>|false
222225
*/
223226
private function getMappingDriverBundleConfigDefaults(
224227
array $bundleConfig,
@@ -1368,6 +1371,8 @@ public function getNamespace(): string
13681371

13691372
/**
13701373
* {@inheritDoc}
1374+
*
1375+
* @param array<string, mixed> $config
13711376
*/
13721377
public function getConfiguration(array $config, ContainerBuilder $container): Configuration
13731378
{

src/Mapping/ClassMetadataFactory.php

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,9 @@ class ClassMetadataFactory extends BaseClassMetadataFactory
1414
{
1515
/**
1616
* {@inheritDoc}
17+
*
18+
* @param ClassMetadata<object> $class
19+
* @param ClassMetadata<object> $parent
1720
*/
1821
protected function doLoadMetadata($class, $parent, $rootEntityFound, array $nonSuperclassParents): void
1922
{

src/Mapping/ContainerEntityListenerResolver.php

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -46,6 +46,8 @@ public function clear($className = null): void
4646

4747
/**
4848
* {@inheritDoc}
49+
*
50+
* @param mixed $object
4951
*/
5052
public function register($object): void
5153
{
@@ -60,8 +62,11 @@ public function register($object): void
6062

6163
/**
6264
* {@inheritDoc}
65+
*
66+
* @param string $className
67+
* @param string $serviceId
6368
*/
64-
public function registerService($className, $serviceId)
69+
public function registerService($className, $serviceId): void
6570
{
6671
$this->serviceIds[$this->normalizeClassName($className)] = $serviceId;
6772
}

src/Mapping/EntityListenerServiceResolver.php

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,5 +13,5 @@ interface EntityListenerServiceResolver extends EntityListenerResolver
1313
* @param string $serviceId
1414
*/
1515
// phpcs:ignore
16-
public function registerService($className, $serviceId);
16+
public function registerService($className, $serviceId): void;
1717
}

src/Repository/ContainerRepositoryFactory.php

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,7 @@
2626
*/
2727
final class ContainerRepositoryFactory implements RepositoryFactory
2828
{
29-
/** @var array<string, ObjectRepository> */
29+
/** @var array<string, ObjectRepository<object>> */
3030
private array $managedRepositories = [];
3131

3232
/** @param ContainerInterface $container A service locator containing the repositories */

0 commit comments

Comments
 (0)