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