php-extension-check/src/Extension/ExtensionCheck.php

134 lines
3.2 KiB
PHP

<?php
declare(strict_types=1);
namespace Fbrinker\ExtensionCheck\Extension;
use Closure;
class ExtensionCheck
{
private $extensionDetails;
public function __construct(ExtensionDetails $extensionDetails)
{
$this->extensionDetails = $extensionDetails;
}
/**
* @param string[] $usedExtensions
* @return string[]
*/
public function getUnused(array $usedExtensions): array
{
return array_diff(
$this->extensionDetails->getLoadedExtensions(),
$usedExtensions
);
}
/**
* @param string[] $classes
* @param string[] $functions
* @param string[] $constants
* @return array<string,array<string,bool>>
*/
public function checkUsages(array $classes, array $functions, array $constants, Closure $callback)
{
$usedExtensions = [];
foreach ($classes as $class) {
$extension = $this->checkClass($class);
if (!empty($extension)) {
$usedExtensions[$extension]['class'] = true;
}
$callback();
}
foreach ($functions as $function) {
$extension = $this->checkFunction($function);
if (!empty($extension)) {
$usedExtensions[$extension]['function'] = true;
}
$callback();
}
foreach ($constants as $constant) {
$extension = $this->checkConstant($constant);
if (!empty($extension)) {
$usedExtensions[$extension]['constant'] = true;
}
$callback();
}
$tmp = array_keys($usedExtensions);
foreach ($tmp as $usedExtension) {
$requiredExtensions = $this->checkRequiredDependency($usedExtension);
if (!empty($requiredExtensions)) {
foreach ($requiredExtensions as $requiredExtension) {
$usedExtensions[$requiredExtension]['dependency'] = true;
}
}
$callback();
}
return $usedExtensions;
}
private function checkClass(string $class): ?string
{
$classMap = $this->extensionDetails->getExtensionClassMap();
if (!isset($classMap[$class])) {
return null;
}
return $classMap[$class];
}
private function checkFunction(string $function): ?string
{
$functionMap = $this->extensionDetails->getExtensionFunctionMap();
if (!isset($functionMap[$function])) {
return null;
}
return $functionMap[$function];
}
private function checkConstant(string $function): ?string
{
$constantMap = $this->extensionDetails->getExtensionConstantMap();
if (!isset($constantMap[$function])) {
return null;
}
return $constantMap[$function];
}
/**
* @return string[]
*/
private function checkRequiredDependency(string $extension): array
{
$dependencyMap = $this->extensionDetails->getExtensionDependencyMap();
if (!isset($dependencyMap[$extension]['required'])) {
return [];
}
return $dependencyMap[$extension]['required'];
}
}