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

104 lines
2.6 KiB
PHP

<?php
declare(strict_types=1);
namespace Fbrinker\ExtensionCheck\Extension;
use Closure;
class ExtensionCheck
{
private $extensionDetails;
/** @var string[] */
private $excludedExtensions = [];
public function __construct(ExtensionDetails $extensionDetails)
{
$this->extensionDetails = $extensionDetails;
}
/**
* @param string[] $excludedExtensions
*/
public function setExcludedExtenstions(array $excludedExtensions): void
{
$this->excludedExtensions = $excludedExtensions;
}
public function getLoadedExtensionsCount(): int
{
return $this->extensionDetails->getLoadedExtensionsCount();
}
/**
* @param string[] $usedExtensions
* @return string[]
*/
public function getUnused(array $usedExtensions): array
{
return array_diff(
$this->extensionDetails->getLoadedExtensions(),
$usedExtensions,
$this->excludedExtensions
);
}
/**
* @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 = [];
$extensionMap = $this->extensionDetails->getExtensionMap($this->excludedExtensions);
foreach ($classes as $class) {
$extension = $extensionMap->checkClass($class);
if (!empty($extension)) {
$usedExtensions[$extension]['class'] = true;
}
$callback();
}
foreach ($functions as $function) {
$extension = $extensionMap->checkFunction($function);
if (!empty($extension)) {
$usedExtensions[$extension]['function'] = true;
}
$callback();
}
foreach ($constants as $constant) {
$extension = $extensionMap->checkConstant($constant);
if (!empty($extension)) {
$usedExtensions[$extension]['constant'] = true;
}
$callback();
}
$tmp = array_keys($usedExtensions);
foreach ($tmp as $usedExtension) {
$requiredExtensions = $extensionMap->checkRequiredDependency($usedExtension);
if (!empty($requiredExtensions)) {
foreach ($requiredExtensions as $requiredExtension) {
$usedExtensions[$requiredExtension]['dependency'] = true;
}
}
$callback();
}
return $usedExtensions;
}
}