We could not synchronize checks via GitHub's checks API since Scrutinizer's GitHub App is not installed for this repository.
| 1 | <?php |
||
| 7 | abstract class AbstractResolver implements FluentResolverInterface |
||
| 8 | { |
||
| 9 | /** @var array */ |
||
| 10 | private $solutions = []; |
||
| 11 | |||
| 12 | private $aliases = []; |
||
| 13 | |||
| 14 | /** @var array */ |
||
| 15 | private $solutionOptions = []; |
||
| 16 | |||
| 17 | /** @var array */ |
||
| 18 | private $fullyLoadedSolutions = []; |
||
| 19 | |||
| 20 | 123 | /** @var bool */ |
|
| 21 | private $ignoreCase = true; |
||
| 22 | 123 | ||
| 23 | 123 | public function __construct() |
|
| 24 | { |
||
| 25 | $this->ignoreCase = \version_compare(Kernel::VERSION, '3.3.0') < 0; |
||
| 26 | 118 | } |
|
| 27 | 118 | ||
| 28 | 117 | public function addSolution($id, $solutionOrFactory, array $aliases = [], array $options = []) |
|
| 29 | { |
||
| 30 | $id = $this->cleanIdOrAlias($id); |
||
| 31 | 117 | $this->fullyLoadedSolutions[$id] = false; |
|
| 32 | $this->addAliases($id, $aliases); |
||
| 33 | 117 | ||
| 34 | $this->solutions[$id] = function () use ($id, $solutionOrFactory) { |
||
| 35 | 116 | $solution = $solutionOrFactory; |
|
| 36 | if (self::isSolutionFactory($solutionOrFactory)) { |
||
| 37 | 123 | if (!isset($solutionOrFactory[1])) { |
|
| 38 | $solutionOrFactory[1] = []; |
||
| 39 | 123 | } |
|
| 40 | $solution = \call_user_func_array(...$solutionOrFactory); |
||
| 41 | } |
||
| 42 | 121 | $this->checkSolution($id, $solution); |
|
| 43 | |||
| 44 | 121 | return $solution; |
|
| 45 | }; |
||
| 46 | 121 | $this->solutionOptions[$id] = $options; |
|
| 47 | |||
| 48 | return $this; |
||
| 49 | } |
||
| 50 | |||
| 51 | public function hasSolution($id) |
||
| 52 | { |
||
| 53 | $id = $this->resolveAlias($id); |
||
| 54 | 116 | ||
| 55 | return isset($this->solutions[$id]); |
||
| 56 | 116 | } |
|
| 57 | |||
| 58 | /** |
||
| 59 | * @param $id |
||
| 60 | * |
||
| 61 | * @return mixed |
||
| 62 | 5 | */ |
|
| 63 | public function getSolution($id) |
||
| 64 | 5 | { |
|
| 65 | return $this->loadSolution($id); |
||
| 66 | } |
||
| 67 | 5 | ||
| 68 | /** |
||
| 69 | 5 | * @return array |
|
| 70 | */ |
||
| 71 | public function getSolutions() |
||
| 72 | { |
||
| 73 | return $this->loadSolutions(); |
||
| 74 | } |
||
| 75 | |||
| 76 | public function getSolutionAliases($id) |
||
| 80 | |||
| 81 | 50 | /** |
|
| 82 | * @param $id |
||
| 83 | * |
||
| 84 | 54 | * @return mixed |
|
| 85 | */ |
||
| 86 | 54 | public function getSolutionOptions($id) |
|
| 87 | { |
||
| 88 | $id = $this->resolveAlias($id); |
||
| 89 | |||
| 90 | return isset($this->solutionOptions[$id]) ? $this->solutionOptions[$id] : []; |
||
| 91 | } |
||
| 92 | |||
| 93 | 121 | /** |
|
| 94 | * @param string $id |
||
| 95 | 121 | * |
|
| 96 | 121 | * @return mixed |
|
| 97 | 6 | */ |
|
| 98 | private function loadSolution($id) |
||
| 99 | { |
||
| 100 | 118 | $id = $this->resolveAlias($id); |
|
| 101 | 30 | if (!$this->hasSolution($id)) { |
|
| 102 | return null; |
||
| 103 | 118 | } |
|
| 104 | 118 | ||
| 105 | 116 | if ($this->fullyLoadedSolutions[$id]) { |
|
| 106 | 116 | return $this->solutions[$id]; |
|
| 107 | } else { |
||
| 108 | 116 | $loader = $this->solutions[$id]; |
|
| 109 | $this->solutions[$id] = $loader(); |
||
| 110 | $this->fullyLoadedSolutions[$id] = true; |
||
| 111 | |||
| 112 | 123 | return $this->solutions[$id]; |
|
| 113 | } |
||
| 114 | 123 | } |
|
| 115 | 123 | ||
| 116 | private function addAliases($id, $aliases) |
||
| 117 | 123 | { |
|
| 118 | foreach ($aliases as $alias) { |
||
| 119 | 118 | $this->aliases[$this->cleanIdOrAlias($alias)] = $id; |
|
| 120 | } |
||
| 121 | 118 | } |
|
| 122 | |||
| 123 | private static function isSolutionFactory($solutionOrFactory) |
||
| 127 | |||
| 128 | private function resolveAlias($alias) |
||
| 129 | { |
||
| 130 | $alias = $this->cleanIdOrAlias($alias); |
||
| 131 | |||
| 132 | 5 | return isset($this->aliases[$alias]) ? $this->aliases[$alias] : $alias; |
|
| 133 | } |
||
| 134 | 5 | ||
| 135 | 5 | private function cleanIdOrAlias($idOrAlias) |
|
| 139 | |||
| 140 | /** |
||
| 141 | * @return mixed[] |
||
| 142 | */ |
||
| 143 | private function loadSolutions() |
||
| 144 | { |
||
| 145 | foreach ($this->solutions as $name => &$solution) { |
||
| 146 | 117 | $solution = $this->loadSolution($name); |
|
| 147 | } |
||
| 148 | 117 | ||
| 151 | |||
| 152 | /** |
||
| 153 | 117 | * @param mixed $solution |
|
| 154 | * |
||
| 155 | 117 | * @return bool |
|
| 156 | 1 | */ |
|
| 157 | 1 | protected function supportsSolution($solution) |
|
| 163 | |||
| 164 | protected function checkSolution($id, $solution) |
||
| 172 | |||
| 173 | /** |
||
| 174 | * default return null to accept mixed type. |
||
| 175 | * |
||
| 176 | * @return null|string supported class name |
||
| 177 | */ |
||
| 178 | protected function supportedSolutionClass() |
||
| 182 | } |
||
| 183 |