68 private $pluginBlacklist;
74 $basePath = str_replace(
'\\',
'/', $basePath);
80 $this->_command =
'php ' . $basePath .
'/bin/magento setup:di:compile';
82 $booleanUtils = new \Magento\Framework\Stdlib\BooleanUtils();
83 $constInterpreter = new \Magento\Framework\Data\Argument\Interpreter\Constant();
84 $argumentInterpreter = new \Magento\Framework\Data\Argument\Interpreter\Composite(
86 'boolean' =>
new \
Magento\Framework\Data\Argument\Interpreter\Boolean($booleanUtils),
87 'string' =>
new \
Magento\Framework\Data\Argument\Interpreter\BaseStringUtils($booleanUtils),
88 'number' =>
new \
Magento\Framework\Data\Argument\Interpreter\Number(),
89 'null' =>
new \
Magento\Framework\Data\Argument\Interpreter\NullType(),
90 'object' =>
new \
Magento\Framework\Data\Argument\Interpreter\
DataObject($booleanUtils),
91 'const' => $constInterpreter,
92 'init_parameter' =>
new \
Magento\Framework\
App\Arguments\ArgumentInterpreter($constInterpreter),
97 $argumentInterpreter->addInterpreter(
99 new \
Magento\Framework\Data\Argument\Interpreter\ArrayType($argumentInterpreter)
102 $this->_mapper = new \Magento\Framework\ObjectManager\Config\Mapper\Dom(
103 $argumentInterpreter,
107 $this->_validator = new \Magento\Framework\Code\Validator();
108 $this->_validator->add(
new \
Magento\Framework\Code\
Validator\ConstructorIntegrity());
111 $this->_validator->add(
new \
Magento\Framework\Code\
Validator\ConstructorArgumentTypes());
120 private function getPluginBlacklist(): array
122 if ($this->pluginBlacklist ===
null) {
123 $blacklistFiles = str_replace(
126 realpath(
__DIR__) .
'/../_files/blacklist/compiler_plugins*.txt' 128 $blacklistItems = [];
129 foreach (glob($blacklistFiles) as
$fileName) {
130 $blacklistItems = array_merge(
132 file(
$fileName, FILE_IGNORE_NEW_LINES | FILE_SKIP_EMPTY_LINES)
135 $this->pluginBlacklist = $blacklistItems;
137 return $this->pluginBlacklist;
147 $dom = new \DOMDocument();
149 $data = $this->_mapper->convert($dom);
151 foreach (
$data as $instanceName => $parameters) {
152 if (!isset($parameters[
'parameters']) || empty($parameters[
'parameters'])) {
167 $this->fail(
'Class ' . $instanceName .
' does not have __constructor');
170 $parameters = $parameters[
'parameters'];
171 $classParameters = $constructor->getParameters();
172 foreach ($classParameters as $classParameter) {
173 $parameterName = $classParameter->getName();
174 if (array_key_exists($parameterName, $parameters)) {
175 unset($parameters[$parameterName]);
178 $message =
'Configuration of ' . $instanceName .
' contains data for non-existed parameters: ' . implode(
180 array_keys($parameters)
182 $this->assertEmpty($parameters,
$message);
198 if (substr($instanceName, -7) ==
'Factory' &&
class_exists(substr($instanceName, 0, -7))) {
201 $this->fail(
'Detected configuration of non existed class: ' . $instanceName);
211 $generationPath = str_replace(
'/',
'\\', $this->_generationDir);
215 $patterns = [
'/' . preg_quote($generationPath) .
'/',];
216 $replacements = [
''];
220 $patterns[] =
'/' . preg_quote(str_replace(
'/',
'\\', $modulePath)) .
'/';
221 $replacements[] =
'\\' . str_replace(
'_',
'\\', $moduleName);
225 $patterns[] =
'/' . preg_quote(str_replace(
'/',
'\\',
$libPath)) .
'/';
226 $replacements[] =
'\\Magento\\Framework';
231 foreach (
$files as $file) {
232 $file = str_replace(
'/',
'\\', $file);
233 $filePath = preg_replace($patterns, $replacements, $file);
236 $file = str_replace(
'\\', DIRECTORY_SEPARATOR, $file);
243 $allowedFiles = array_keys($classes);
244 foreach ($classes as
$class) {
256 return $outputClasses;
273 $parent =
$class->getParentClass();
276 $file = str_replace(
'\\', DIRECTORY_SEPARATOR, $parent->getFileName());
279 if ($parent && in_array($file, $allowedFiles)) {
300 }
catch (\
Magento\Framework\Exception\ValidatorException $exceptions) {
301 $this->fail($exceptions->getMessage());
302 }
catch (\ReflectionException $exceptions) {
303 $this->fail($exceptions->getMessage());
312 $invoker = new \Magento\Framework\App\Utility\AggregateInvoker($this);
326 $generatorIo = new \Magento\Framework\Code\Generator\Io(
328 $this->_generationDir
330 $generator = new \Magento\Framework\Code\Generator(
339 \
Magento\Framework\Api\Code\Generator\ExtensionAttributesInterfaceGenerator::class,
341 \
Magento\Framework\Api\Code\Generator\ExtensionAttributesGenerator::class
344 $generationAutoloader = new \Magento\Framework\Code\Generator\Autoloader(
$generator);
345 spl_autoload_register([$generationAutoloader,
'load']);
347 $invoker = new \Magento\Framework\App\Utility\AggregateInvoker($this);
354 spl_autoload_unregister([$generationAutoloader,
'load']);
362 $invoker = new \Magento\Framework\App\Utility\AggregateInvoker($this);
364 function ($plugin,
$type) {
367 $this->pluginDataProvider()
382 $this->pluginValidator->validate($plugin,
$type);
384 }
catch (\
Magento\Framework\Exception\ValidatorException $exception) {
385 $this->fail($exception->getMessage());
395 protected function pluginDataProvider()
399 foreach (
$files as $file) {
400 $dom = new \DOMDocument();
402 $xpath = new \DOMXPath($dom);
403 $pluginList = $xpath->query(
'//config/type/plugin');
404 foreach ($pluginList as $node) {
406 $type = $node->parentNode->attributes->getNamedItem(
'name')->nodeValue;
408 if ($node->attributes->getNamedItem(
'type')) {
409 $plugin = $node->attributes->getNamedItem(
'type')->nodeValue;
410 if (!in_array($plugin, $this->getPluginBlacklist())) {
412 $plugins[] = [
'plugin' => $plugin,
'intercepted type' =>
$type];
_classExistsAsReal($instanceName)
_phpClassesDataProvider()
static resolveVirtualType($className)
defined('TESTS_BP')||define('TESTS_BP' __DIR__
testConfigurationOfInstanceParameters()
validatePlugins($plugin, $type)
testConstructorIntegrity()
_buildInheritanceHierarchyTree($className, array $allowedFiles)
_validateClass($className)
$_option $_optionId $class
static isVirtual($className)
static getClassModuleName($class)
foreach($appDirs as $dir) $files