Chris@0
|
1 <?php
|
Chris@0
|
2 /*
|
Chris@14
|
3 * This file is part of sebastian/global-state.
|
Chris@0
|
4 *
|
Chris@0
|
5 * (c) Sebastian Bergmann <sebastian@phpunit.de>
|
Chris@0
|
6 *
|
Chris@0
|
7 * For the full copyright and license information, please view the LICENSE
|
Chris@0
|
8 * file that was distributed with this source code.
|
Chris@0
|
9 */
|
Chris@0
|
10
|
Chris@14
|
11 declare(strict_types=1);
|
Chris@14
|
12
|
Chris@0
|
13 namespace SebastianBergmann\GlobalState;
|
Chris@0
|
14
|
Chris@0
|
15 use ReflectionClass;
|
Chris@0
|
16
|
Chris@0
|
17 /**
|
Chris@0
|
18 * A blacklist for global state elements that should not be snapshotted.
|
Chris@0
|
19 */
|
Chris@0
|
20 class Blacklist
|
Chris@0
|
21 {
|
Chris@0
|
22 /**
|
Chris@0
|
23 * @var array
|
Chris@0
|
24 */
|
Chris@14
|
25 private $globalVariables = [];
|
Chris@14
|
26
|
Chris@14
|
27 /**
|
Chris@14
|
28 * @var string[]
|
Chris@14
|
29 */
|
Chris@14
|
30 private $classes = [];
|
Chris@14
|
31
|
Chris@14
|
32 /**
|
Chris@14
|
33 * @var string[]
|
Chris@14
|
34 */
|
Chris@14
|
35 private $classNamePrefixes = [];
|
Chris@14
|
36
|
Chris@14
|
37 /**
|
Chris@14
|
38 * @var string[]
|
Chris@14
|
39 */
|
Chris@14
|
40 private $parentClasses = [];
|
Chris@14
|
41
|
Chris@14
|
42 /**
|
Chris@14
|
43 * @var string[]
|
Chris@14
|
44 */
|
Chris@14
|
45 private $interfaces = [];
|
Chris@0
|
46
|
Chris@0
|
47 /**
|
Chris@0
|
48 * @var array
|
Chris@0
|
49 */
|
Chris@14
|
50 private $staticAttributes = [];
|
Chris@0
|
51
|
Chris@14
|
52 public function addGlobalVariable(string $variableName)
|
Chris@0
|
53 {
|
Chris@0
|
54 $this->globalVariables[$variableName] = true;
|
Chris@0
|
55 }
|
Chris@0
|
56
|
Chris@14
|
57 public function addClass(string $className)
|
Chris@0
|
58 {
|
Chris@0
|
59 $this->classes[] = $className;
|
Chris@0
|
60 }
|
Chris@0
|
61
|
Chris@14
|
62 public function addSubclassesOf(string $className)
|
Chris@0
|
63 {
|
Chris@0
|
64 $this->parentClasses[] = $className;
|
Chris@0
|
65 }
|
Chris@0
|
66
|
Chris@14
|
67 public function addImplementorsOf(string $interfaceName)
|
Chris@0
|
68 {
|
Chris@0
|
69 $this->interfaces[] = $interfaceName;
|
Chris@0
|
70 }
|
Chris@0
|
71
|
Chris@14
|
72 public function addClassNamePrefix(string $classNamePrefix)
|
Chris@0
|
73 {
|
Chris@0
|
74 $this->classNamePrefixes[] = $classNamePrefix;
|
Chris@0
|
75 }
|
Chris@0
|
76
|
Chris@14
|
77 public function addStaticAttribute(string $className, string $attributeName)
|
Chris@0
|
78 {
|
Chris@0
|
79 if (!isset($this->staticAttributes[$className])) {
|
Chris@14
|
80 $this->staticAttributes[$className] = [];
|
Chris@0
|
81 }
|
Chris@0
|
82
|
Chris@0
|
83 $this->staticAttributes[$className][$attributeName] = true;
|
Chris@0
|
84 }
|
Chris@0
|
85
|
Chris@14
|
86 public function isGlobalVariableBlacklisted(string $variableName): bool
|
Chris@0
|
87 {
|
Chris@0
|
88 return isset($this->globalVariables[$variableName]);
|
Chris@0
|
89 }
|
Chris@0
|
90
|
Chris@14
|
91 public function isStaticAttributeBlacklisted(string $className, string $attributeName): bool
|
Chris@0
|
92 {
|
Chris@14
|
93 if (\in_array($className, $this->classes)) {
|
Chris@0
|
94 return true;
|
Chris@0
|
95 }
|
Chris@0
|
96
|
Chris@0
|
97 foreach ($this->classNamePrefixes as $prefix) {
|
Chris@14
|
98 if (\strpos($className, $prefix) === 0) {
|
Chris@0
|
99 return true;
|
Chris@0
|
100 }
|
Chris@0
|
101 }
|
Chris@0
|
102
|
Chris@0
|
103 $class = new ReflectionClass($className);
|
Chris@0
|
104
|
Chris@0
|
105 foreach ($this->parentClasses as $type) {
|
Chris@0
|
106 if ($class->isSubclassOf($type)) {
|
Chris@0
|
107 return true;
|
Chris@0
|
108 }
|
Chris@0
|
109 }
|
Chris@0
|
110
|
Chris@0
|
111 foreach ($this->interfaces as $type) {
|
Chris@0
|
112 if ($class->implementsInterface($type)) {
|
Chris@0
|
113 return true;
|
Chris@0
|
114 }
|
Chris@0
|
115 }
|
Chris@0
|
116
|
Chris@0
|
117 if (isset($this->staticAttributes[$className][$attributeName])) {
|
Chris@0
|
118 return true;
|
Chris@0
|
119 }
|
Chris@0
|
120
|
Chris@0
|
121 return false;
|
Chris@0
|
122 }
|
Chris@0
|
123 }
|