Chris@0: Chris@0: * Chris@0: * For the full copyright and license information, please view the LICENSE Chris@0: * file that was distributed with this source code. Chris@0: */ Chris@0: Chris@14: declare(strict_types=1); Chris@14: Chris@0: namespace SebastianBergmann\GlobalState; Chris@0: Chris@0: use ReflectionClass; Chris@0: Chris@0: /** Chris@0: * A blacklist for global state elements that should not be snapshotted. Chris@0: */ Chris@0: class Blacklist Chris@0: { Chris@0: /** Chris@0: * @var array Chris@0: */ Chris@14: private $globalVariables = []; Chris@14: Chris@14: /** Chris@14: * @var string[] Chris@14: */ Chris@14: private $classes = []; Chris@14: Chris@14: /** Chris@14: * @var string[] Chris@14: */ Chris@14: private $classNamePrefixes = []; Chris@14: Chris@14: /** Chris@14: * @var string[] Chris@14: */ Chris@14: private $parentClasses = []; Chris@14: Chris@14: /** Chris@14: * @var string[] Chris@14: */ Chris@14: private $interfaces = []; Chris@0: Chris@0: /** Chris@0: * @var array Chris@0: */ Chris@14: private $staticAttributes = []; Chris@0: Chris@14: public function addGlobalVariable(string $variableName) Chris@0: { Chris@0: $this->globalVariables[$variableName] = true; Chris@0: } Chris@0: Chris@14: public function addClass(string $className) Chris@0: { Chris@0: $this->classes[] = $className; Chris@0: } Chris@0: Chris@14: public function addSubclassesOf(string $className) Chris@0: { Chris@0: $this->parentClasses[] = $className; Chris@0: } Chris@0: Chris@14: public function addImplementorsOf(string $interfaceName) Chris@0: { Chris@0: $this->interfaces[] = $interfaceName; Chris@0: } Chris@0: Chris@14: public function addClassNamePrefix(string $classNamePrefix) Chris@0: { Chris@0: $this->classNamePrefixes[] = $classNamePrefix; Chris@0: } Chris@0: Chris@14: public function addStaticAttribute(string $className, string $attributeName) Chris@0: { Chris@0: if (!isset($this->staticAttributes[$className])) { Chris@14: $this->staticAttributes[$className] = []; Chris@0: } Chris@0: Chris@0: $this->staticAttributes[$className][$attributeName] = true; Chris@0: } Chris@0: Chris@14: public function isGlobalVariableBlacklisted(string $variableName): bool Chris@0: { Chris@0: return isset($this->globalVariables[$variableName]); Chris@0: } Chris@0: Chris@14: public function isStaticAttributeBlacklisted(string $className, string $attributeName): bool Chris@0: { Chris@14: if (\in_array($className, $this->classes)) { Chris@0: return true; Chris@0: } Chris@0: Chris@0: foreach ($this->classNamePrefixes as $prefix) { Chris@14: if (\strpos($className, $prefix) === 0) { Chris@0: return true; Chris@0: } Chris@0: } Chris@0: Chris@0: $class = new ReflectionClass($className); Chris@0: Chris@0: foreach ($this->parentClasses as $type) { Chris@0: if ($class->isSubclassOf($type)) { Chris@0: return true; Chris@0: } Chris@0: } Chris@0: Chris@0: foreach ($this->interfaces as $type) { Chris@0: if ($class->implementsInterface($type)) { Chris@0: return true; Chris@0: } Chris@0: } Chris@0: Chris@0: if (isset($this->staticAttributes[$className][$attributeName])) { Chris@0: return true; Chris@0: } Chris@0: Chris@0: return false; Chris@0: } Chris@0: }