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@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@0: private $globalVariables = array(); Chris@0: Chris@0: /** Chris@0: * @var array Chris@0: */ Chris@0: private $classes = array(); Chris@0: Chris@0: /** Chris@0: * @var array Chris@0: */ Chris@0: private $classNamePrefixes = array(); Chris@0: Chris@0: /** Chris@0: * @var array Chris@0: */ Chris@0: private $parentClasses = array(); Chris@0: Chris@0: /** Chris@0: * @var array Chris@0: */ Chris@0: private $interfaces = array(); Chris@0: Chris@0: /** Chris@0: * @var array Chris@0: */ Chris@0: private $staticAttributes = array(); Chris@0: Chris@0: /** Chris@0: * @param string $variableName Chris@0: */ Chris@0: public function addGlobalVariable($variableName) Chris@0: { Chris@0: $this->globalVariables[$variableName] = true; Chris@0: } Chris@0: Chris@0: /** Chris@0: * @param string $className Chris@0: */ Chris@0: public function addClass($className) Chris@0: { Chris@0: $this->classes[] = $className; Chris@0: } Chris@0: Chris@0: /** Chris@0: * @param string $className Chris@0: */ Chris@0: public function addSubclassesOf($className) Chris@0: { Chris@0: $this->parentClasses[] = $className; Chris@0: } Chris@0: Chris@0: /** Chris@0: * @param string $interfaceName Chris@0: */ Chris@0: public function addImplementorsOf($interfaceName) Chris@0: { Chris@0: $this->interfaces[] = $interfaceName; Chris@0: } Chris@0: Chris@0: /** Chris@0: * @param string $classNamePrefix Chris@0: */ Chris@0: public function addClassNamePrefix($classNamePrefix) Chris@0: { Chris@0: $this->classNamePrefixes[] = $classNamePrefix; Chris@0: } Chris@0: Chris@0: /** Chris@0: * @param string $className Chris@0: * @param string $attributeName Chris@0: */ Chris@0: public function addStaticAttribute($className, $attributeName) Chris@0: { Chris@0: if (!isset($this->staticAttributes[$className])) { Chris@0: $this->staticAttributes[$className] = array(); Chris@0: } Chris@0: Chris@0: $this->staticAttributes[$className][$attributeName] = true; Chris@0: } Chris@0: Chris@0: /** Chris@0: * @param string $variableName Chris@0: * @return bool Chris@0: */ Chris@0: public function isGlobalVariableBlacklisted($variableName) Chris@0: { Chris@0: return isset($this->globalVariables[$variableName]); Chris@0: } Chris@0: Chris@0: /** Chris@0: * @param string $className Chris@0: * @param string $attributeName Chris@0: * @return bool Chris@0: */ Chris@0: public function isStaticAttributeBlacklisted($className, $attributeName) Chris@0: { Chris@0: if (in_array($className, $this->classes)) { Chris@0: return true; Chris@0: } Chris@0: Chris@0: foreach ($this->classNamePrefixes as $prefix) { Chris@0: 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: }