Skip to content

Commit 4e2778b

Browse files
committed
Refactoring to reuse getServiceClassNames in more places
1 parent 8c64537 commit 4e2778b

File tree

2 files changed

+80
-54
lines changed

2 files changed

+80
-54
lines changed

src/Analyser/ResultCache/ResultCacheManager.php

Lines changed: 14 additions & 54 deletions
Original file line numberDiff line numberDiff line change
@@ -2,14 +2,14 @@
22

33
namespace PHPStan\Analyser\ResultCache;
44

5-
use Nette\DI\Definitions\Statement;
65
use Nette\Neon\Neon;
76
use PHPStan\Analyser\AnalyserResult;
87
use PHPStan\Analyser\Error;
98
use PHPStan\Collectors\CollectedData;
109
use PHPStan\Command\Output;
1110
use PHPStan\Dependency\ExportedNodeFetcher;
1211
use PHPStan\Dependency\RootExportedNode;
12+
use PHPStan\DependencyInjection\ProjectConfigHelper;
1313
use PHPStan\File\CouldNotReadFileException;
1414
use PHPStan\File\FileFinder;
1515
use PHPStan\File\FileWriter;
@@ -23,15 +23,13 @@
2323
use function array_filter;
2424
use function array_key_exists;
2525
use function array_keys;
26-
use function array_merge;
2726
use function array_unique;
2827
use function array_values;
2928
use function count;
3029
use function get_loaded_extensions;
3130
use function implode;
3231
use function is_array;
3332
use function is_file;
34-
use function is_string;
3533
use function ksort;
3634
use function sha1_file;
3735
use function sort;
@@ -636,70 +634,32 @@ private function getProjectExtensionFiles(?array $projectConfig, array $dependen
636634
$this->alreadyProcessed = [];
637635
$projectExtensionFiles = [];
638636
if ($projectConfig !== null) {
639-
$services = array_merge(
640-
$projectConfig['services'] ?? [],
641-
$projectConfig['rules'] ?? [],
642-
);
643-
foreach ($services as $service) {
644-
$classes = $this->getClassesFromConfigDefinition($service);
645-
if (is_array($service)) {
646-
foreach (['class', 'factory', 'implement'] as $key) {
647-
if (!isset($service[$key])) {
648-
continue;
649-
}
650-
651-
$classes = array_merge($classes, $this->getClassesFromConfigDefinition($service[$key]));
652-
}
637+
$classes = ProjectConfigHelper::getServiceClassNames($projectConfig);
638+
foreach ($classes as $class) {
639+
if (!$this->reflectionProvider->hasClass($class)) {
640+
continue;
653641
}
654642

655-
foreach (array_unique($classes) as $class) {
656-
if (!$this->reflectionProvider->hasClass($class)) {
657-
continue;
658-
}
643+
$classReflection = $this->reflectionProvider->getClass($class);
644+
$fileName = $classReflection->getFileName();
645+
if ($fileName === null) {
646+
continue;
647+
}
659648

660-
$classReflection = $this->reflectionProvider->getClass($class);
661-
$fileName = $classReflection->getFileName();
662-
if ($fileName === null) {
649+
$allServiceFiles = $this->getAllDependencies($fileName, $dependencies);
650+
foreach ($allServiceFiles as $serviceFile) {
651+
if (array_key_exists($serviceFile, $projectExtensionFiles)) {
663652
continue;
664653
}
665654

666-
$allServiceFiles = $this->getAllDependencies($fileName, $dependencies);
667-
foreach ($allServiceFiles as $serviceFile) {
668-
if (array_key_exists($serviceFile, $projectExtensionFiles)) {
669-
continue;
670-
}
671-
672-
$projectExtensionFiles[$serviceFile] = $this->getFileHash($serviceFile);
673-
}
655+
$projectExtensionFiles[$serviceFile] = $this->getFileHash($serviceFile);
674656
}
675657
}
676658
}
677659

678660
return $projectExtensionFiles;
679661
}
680662

681-
/**
682-
* @param mixed $definition
683-
* @return string[]
684-
*/
685-
private function getClassesFromConfigDefinition($definition): array
686-
{
687-
if (is_string($definition)) {
688-
return [$definition];
689-
}
690-
691-
if ($definition instanceof Statement) {
692-
$entity = $definition->entity;
693-
if (is_string($entity)) {
694-
return [$entity];
695-
} elseif (is_array($entity) && isset($entity[0]) && is_string($entity[0])) {
696-
return [$entity[0]];
697-
}
698-
}
699-
700-
return [];
701-
}
702-
703663
/**
704664
* @param array<string, array<int, string>> $dependencies
705665
* @return array<int, string>
Lines changed: 66 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,66 @@
1+
<?php declare(strict_types = 1);
2+
3+
namespace PHPStan\DependencyInjection;
4+
5+
use Nette\DI\Definitions\Statement;
6+
use function array_merge;
7+
use function array_unique;
8+
use function array_values;
9+
use function is_array;
10+
use function is_string;
11+
12+
class ProjectConfigHelper
13+
{
14+
15+
/**
16+
* @param array<mixed> $projectConfig
17+
* @return list<string>
18+
*/
19+
public static function getServiceClassNames(array $projectConfig): array
20+
{
21+
$services = array_merge(
22+
$projectConfig['services'] ?? [],
23+
$projectConfig['rules'] ?? [],
24+
);
25+
$classes = [];
26+
foreach ($services as $service) {
27+
$classes = array_merge($classes, self::getClassesFromConfigDefinition($service));
28+
if (!is_array($service)) {
29+
continue;
30+
}
31+
32+
foreach (['class', 'factory', 'implement'] as $key) {
33+
if (!isset($service[$key])) {
34+
continue;
35+
}
36+
37+
$classes = array_merge($classes, self::getClassesFromConfigDefinition($service[$key]));
38+
}
39+
}
40+
41+
return array_values(array_unique($classes));
42+
}
43+
44+
/**
45+
* @param mixed $definition
46+
* @return string[]
47+
*/
48+
private static function getClassesFromConfigDefinition($definition): array
49+
{
50+
if (is_string($definition)) {
51+
return [$definition];
52+
}
53+
54+
if ($definition instanceof Statement) {
55+
$entity = $definition->entity;
56+
if (is_string($entity)) {
57+
return [$entity];
58+
} elseif (is_array($entity) && isset($entity[0]) && is_string($entity[0])) {
59+
return [$entity[0]];
60+
}
61+
}
62+
63+
return [];
64+
}
65+
66+
}

0 commit comments

Comments
 (0)