Skip to content

Commit

Permalink
Refactoring to reuse getServiceClassNames in more places
Browse files Browse the repository at this point in the history
  • Loading branch information
ondrejmirtes committed Mar 19, 2024
1 parent 8c64537 commit 4e2778b
Show file tree
Hide file tree
Showing 2 changed files with 80 additions and 54 deletions.
68 changes: 14 additions & 54 deletions src/Analyser/ResultCache/ResultCacheManager.php
Original file line number Diff line number Diff line change
Expand Up @@ -2,14 +2,14 @@

namespace PHPStan\Analyser\ResultCache;

use Nette\DI\Definitions\Statement;
use Nette\Neon\Neon;
use PHPStan\Analyser\AnalyserResult;
use PHPStan\Analyser\Error;
use PHPStan\Collectors\CollectedData;
use PHPStan\Command\Output;
use PHPStan\Dependency\ExportedNodeFetcher;
use PHPStan\Dependency\RootExportedNode;
use PHPStan\DependencyInjection\ProjectConfigHelper;
use PHPStan\File\CouldNotReadFileException;
use PHPStan\File\FileFinder;
use PHPStan\File\FileWriter;
Expand All @@ -23,15 +23,13 @@
use function array_filter;
use function array_key_exists;
use function array_keys;
use function array_merge;
use function array_unique;
use function array_values;
use function count;
use function get_loaded_extensions;
use function implode;
use function is_array;
use function is_file;
use function is_string;
use function ksort;
use function sha1_file;
use function sort;
Expand Down Expand Up @@ -636,70 +634,32 @@ private function getProjectExtensionFiles(?array $projectConfig, array $dependen
$this->alreadyProcessed = [];
$projectExtensionFiles = [];
if ($projectConfig !== null) {
$services = array_merge(
$projectConfig['services'] ?? [],
$projectConfig['rules'] ?? [],
);
foreach ($services as $service) {
$classes = $this->getClassesFromConfigDefinition($service);
if (is_array($service)) {
foreach (['class', 'factory', 'implement'] as $key) {
if (!isset($service[$key])) {
continue;
}

$classes = array_merge($classes, $this->getClassesFromConfigDefinition($service[$key]));
}
$classes = ProjectConfigHelper::getServiceClassNames($projectConfig);
foreach ($classes as $class) {
if (!$this->reflectionProvider->hasClass($class)) {
continue;
}

foreach (array_unique($classes) as $class) {
if (!$this->reflectionProvider->hasClass($class)) {
continue;
}
$classReflection = $this->reflectionProvider->getClass($class);
$fileName = $classReflection->getFileName();
if ($fileName === null) {
continue;
}

$classReflection = $this->reflectionProvider->getClass($class);
$fileName = $classReflection->getFileName();
if ($fileName === null) {
$allServiceFiles = $this->getAllDependencies($fileName, $dependencies);
foreach ($allServiceFiles as $serviceFile) {
if (array_key_exists($serviceFile, $projectExtensionFiles)) {
continue;
}

$allServiceFiles = $this->getAllDependencies($fileName, $dependencies);
foreach ($allServiceFiles as $serviceFile) {
if (array_key_exists($serviceFile, $projectExtensionFiles)) {
continue;
}

$projectExtensionFiles[$serviceFile] = $this->getFileHash($serviceFile);
}
$projectExtensionFiles[$serviceFile] = $this->getFileHash($serviceFile);
}
}
}

return $projectExtensionFiles;
}

/**
* @param mixed $definition
* @return string[]
*/
private function getClassesFromConfigDefinition($definition): array
{
if (is_string($definition)) {
return [$definition];
}

if ($definition instanceof Statement) {
$entity = $definition->entity;
if (is_string($entity)) {
return [$entity];
} elseif (is_array($entity) && isset($entity[0]) && is_string($entity[0])) {
return [$entity[0]];
}
}

return [];
}

/**
* @param array<string, array<int, string>> $dependencies
* @return array<int, string>
Expand Down
66 changes: 66 additions & 0 deletions src/DependencyInjection/ProjectConfigHelper.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,66 @@
<?php declare(strict_types = 1);

namespace PHPStan\DependencyInjection;

use Nette\DI\Definitions\Statement;
use function array_merge;
use function array_unique;
use function array_values;
use function is_array;
use function is_string;

class ProjectConfigHelper
{

/**
* @param array<mixed> $projectConfig
* @return list<string>
*/
public static function getServiceClassNames(array $projectConfig): array
{
$services = array_merge(
$projectConfig['services'] ?? [],
$projectConfig['rules'] ?? [],
);
$classes = [];
foreach ($services as $service) {
$classes = array_merge($classes, self::getClassesFromConfigDefinition($service));
if (!is_array($service)) {
continue;
}

foreach (['class', 'factory', 'implement'] as $key) {
if (!isset($service[$key])) {
continue;
}

$classes = array_merge($classes, self::getClassesFromConfigDefinition($service[$key]));
}
}

return array_values(array_unique($classes));
}

/**
* @param mixed $definition
* @return string[]
*/
private static function getClassesFromConfigDefinition($definition): array
{
if (is_string($definition)) {
return [$definition];
}

if ($definition instanceof Statement) {
$entity = $definition->entity;
if (is_string($entity)) {
return [$entity];
} elseif (is_array($entity) && isset($entity[0]) && is_string($entity[0])) {
return [$entity[0]];
}
}

return [];
}

}

0 comments on commit 4e2778b

Please sign in to comment.