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

112 lines
2.8 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;
}
public function getUnused(array $usedExtensions) {
return array_diff(
$this->extensionDetails->getLoadedExtensions(),
$usedExtensions
);
}
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($class): ?string {
$classMap = $this->extensionDetails->getExtensionClassMap();
if (!isset($classMap[$class])) {
return null;
}
return $classMap[$class];
}
private function checkFunction($function): ?string {
$functionMap = $this->extensionDetails->getExtensionFunctionMap();
if (!isset($functionMap[$function])) {
return null;
}
return $functionMap[$function];
}
private function checkConstant($function): ?string {
$constantMap = $this->extensionDetails->getExtensionConstantMap();
if (!isset($constantMap[$function])) {
return null;
}
return $constantMap[$function];
}
private function checkRequiredDependency($extension): array {
$dependencyMap = $this->extensionDetails->getExtensionDependencyMap();
if (!isset($dependencyMap[$extension]['required'])) {
return [];
}
return $dependencyMap[$extension]['required'];
}
}