![]() Server : Apache System : Linux server2.corals.io 4.18.0-348.2.1.el8_5.x86_64 #1 SMP Mon Nov 15 09:17:08 EST 2021 x86_64 User : corals ( 1002) PHP Version : 7.4.33 Disable Function : exec,passthru,shell_exec,system Directory : /home/corals/old/vendor/magento/framework/Code/Validator/ |
<?php /** * Class constructor validator. Validates argument types duplication * * Copyright © Magento, Inc. All rights reserved. * See COPYING.txt for license details. */ namespace Magento\Framework\Code\Validator; use Magento\Framework\Code\ValidatorInterface; class TypeDuplication implements ValidatorInterface { /** * Name of the suppress warnings annotation. */ const SUPPRESS_ANNOTATION = 'SuppressWarnings'; const TYPE_DUPLICATIONS = 'Magento.TypeDuplication'; /** * @var \Magento\Framework\Code\Reader\ArgumentsReader */ protected $_argumentsReader; /** * @var \Magento\Framework\Code\Reader\ScalarTypesProvider */ private $scalarTypesProvider; /** * @param \Magento\Framework\Code\Reader\ArgumentsReader|null $argumentsReader * @param \Magento\Framework\Code\Reader\ScalarTypesProvider|null $scalarTypesProvider */ public function __construct( \Magento\Framework\Code\Reader\ArgumentsReader $argumentsReader = null, \Magento\Framework\Code\Reader\ScalarTypesProvider $scalarTypesProvider = null ) { $this->_argumentsReader = $argumentsReader ?: new \Magento\Framework\Code\Reader\ArgumentsReader(); $this->scalarTypesProvider = $scalarTypesProvider ?: new \Magento\Framework\Code\Reader\ScalarTypesProvider(); } /** * Validate class * * @param string $className * @return bool * @throws \Magento\Framework\Exception\ValidatorException */ public function validate($className) { $class = new \ReflectionClass($className); $classArguments = $this->_argumentsReader->getConstructorArguments($class, true); $arguments = $this->_getObjectArguments($classArguments); $typeList = []; $errors = []; foreach ($arguments as $argument) { $name = $argument['name']; $type = $argument['type']; if (in_array($type, $typeList)) { $errors[] = 'Multiple type injection [' . $type . ']'; } elseif (isset($typeList[$name])) { $errors[] = 'Variable name duplication. [$' . $name . ']'; } $typeList[$name] = $type; } if (!empty($errors)) { if (false == $this->_ignoreWarning($class)) { $classPath = str_replace('\\', '/', $class->getFileName()); throw new \Magento\Framework\Exception\ValidatorException( new \Magento\Framework\Phrase( 'Argument type duplication in class %1 in %2%3%4', [ $class->getName(), $classPath, PHP_EOL, implode(PHP_EOL, $errors) ] ) ); } } return true; } /** * Get arguments with object types * * @param array $arguments * @return array */ protected function _getObjectArguments(array $arguments) { $output = []; foreach ($arguments as $argument) { $type = $argument['type']; if (!$type || in_array($type, $this->scalarTypesProvider->getTypes())) { continue; } $reflection = new \ReflectionClass($type); if (false == $reflection->isInterface()) { $output[] = $argument; } } return $output; } /** * Check whether warning must be skipped * * @param \ReflectionClass $class * @return bool */ protected function _ignoreWarning(\ReflectionClass $class) { $annotations = $this->_argumentsReader->getAnnotations($class); if (isset($annotations[self::SUPPRESS_ANNOTATION])) { return $annotations[self::SUPPRESS_ANNOTATION] == self::TYPE_DUPLICATIONS; } return false; } }