annotate vendor/symfony/dependency-injection/Compiler/PassConfig.php @ 19:fa3358dc1485 tip

Add ndrum files
author Chris Cannam
date Wed, 28 Aug 2019 13:14:47 +0100
parents 129ea1e6d783
children
rev   line source
Chris@0 1 <?php
Chris@0 2
Chris@0 3 /*
Chris@0 4 * This file is part of the Symfony package.
Chris@0 5 *
Chris@0 6 * (c) Fabien Potencier <fabien@symfony.com>
Chris@0 7 *
Chris@0 8 * For the full copyright and license information, please view the LICENSE
Chris@0 9 * file that was distributed with this source code.
Chris@0 10 */
Chris@0 11
Chris@0 12 namespace Symfony\Component\DependencyInjection\Compiler;
Chris@0 13
Chris@0 14 use Symfony\Component\DependencyInjection\Exception\InvalidArgumentException;
Chris@0 15
Chris@0 16 /**
Chris@0 17 * Compiler Pass Configuration.
Chris@0 18 *
Chris@0 19 * This class has a default configuration embedded.
Chris@0 20 *
Chris@0 21 * @author Johannes M. Schmitt <schmittjoh@gmail.com>
Chris@0 22 */
Chris@0 23 class PassConfig
Chris@0 24 {
Chris@0 25 const TYPE_AFTER_REMOVING = 'afterRemoving';
Chris@0 26 const TYPE_BEFORE_OPTIMIZATION = 'beforeOptimization';
Chris@0 27 const TYPE_BEFORE_REMOVING = 'beforeRemoving';
Chris@0 28 const TYPE_OPTIMIZE = 'optimization';
Chris@0 29 const TYPE_REMOVE = 'removing';
Chris@0 30
Chris@0 31 private $mergePass;
Chris@17 32 private $afterRemovingPasses = [];
Chris@17 33 private $beforeOptimizationPasses = [];
Chris@17 34 private $beforeRemovingPasses = [];
Chris@0 35 private $optimizationPasses;
Chris@0 36 private $removingPasses;
Chris@0 37
Chris@0 38 public function __construct()
Chris@0 39 {
Chris@0 40 $this->mergePass = new MergeExtensionConfigurationPass();
Chris@0 41
Chris@17 42 $this->beforeOptimizationPasses = [
Chris@17 43 100 => [
Chris@14 44 $resolveClassPass = new ResolveClassPass(),
Chris@14 45 new ResolveInstanceofConditionalsPass(),
Chris@14 46 new RegisterEnvVarProcessorsPass(),
Chris@17 47 ],
Chris@17 48 -1000 => [new ExtensionCompilerPass()],
Chris@17 49 ];
Chris@14 50
Chris@17 51 $this->optimizationPasses = [[
Chris@14 52 new ResolveChildDefinitionsPass(),
Chris@14 53 new ServiceLocatorTagPass(),
Chris@17 54 new RegisterServiceSubscribersPass(),
Chris@0 55 new DecoratorServicePass(),
Chris@14 56 new ResolveParameterPlaceHoldersPass(false),
Chris@14 57 new ResolveFactoryClassPass(),
Chris@14 58 new FactoryReturnTypePass($resolveClassPass),
Chris@0 59 new CheckDefinitionValidityPass(),
Chris@14 60 new ResolveNamedArgumentsPass(),
Chris@14 61 new AutowireRequiredMethodsPass(),
Chris@14 62 new ResolveBindingsPass(),
Chris@14 63 new AutowirePass(false),
Chris@14 64 new ResolveTaggedIteratorArgumentPass(),
Chris@14 65 new ResolveServiceSubscribersPass(),
Chris@0 66 new ResolveReferencesToAliasesPass(),
Chris@0 67 new ResolveInvalidReferencesPass(),
Chris@0 68 new AnalyzeServiceReferencesPass(true),
Chris@0 69 new CheckCircularReferencesPass(),
Chris@0 70 new CheckReferenceValidityPass(),
Chris@14 71 new CheckArgumentsValidityPass(false),
Chris@17 72 ]];
Chris@0 73
Chris@17 74 $this->beforeRemovingPasses = [
Chris@17 75 -100 => [
Chris@14 76 new ResolvePrivatesPass(),
Chris@17 77 ],
Chris@17 78 ];
Chris@14 79
Chris@17 80 $this->removingPasses = [[
Chris@0 81 new RemovePrivateAliasesPass(),
Chris@0 82 new ReplaceAliasByActualDefinitionPass(),
Chris@0 83 new RemoveAbstractDefinitionsPass(),
Chris@17 84 new RepeatedPass([
Chris@0 85 new AnalyzeServiceReferencesPass(),
Chris@0 86 new InlineServiceDefinitionsPass(),
Chris@0 87 new AnalyzeServiceReferencesPass(),
Chris@0 88 new RemoveUnusedDefinitionsPass(),
Chris@17 89 ]),
Chris@14 90 new DefinitionErrorExceptionPass(),
Chris@0 91 new CheckExceptionOnInvalidReferenceBehaviorPass(),
Chris@14 92 new ResolveHotPathPass(),
Chris@17 93 ]];
Chris@0 94 }
Chris@0 95
Chris@0 96 /**
Chris@0 97 * Returns all passes in order to be processed.
Chris@0 98 *
Chris@0 99 * @return CompilerPassInterface[]
Chris@0 100 */
Chris@0 101 public function getPasses()
Chris@0 102 {
Chris@0 103 return array_merge(
Chris@17 104 [$this->mergePass],
Chris@0 105 $this->getBeforeOptimizationPasses(),
Chris@0 106 $this->getOptimizationPasses(),
Chris@0 107 $this->getBeforeRemovingPasses(),
Chris@0 108 $this->getRemovingPasses(),
Chris@0 109 $this->getAfterRemovingPasses()
Chris@0 110 );
Chris@0 111 }
Chris@0 112
Chris@0 113 /**
Chris@0 114 * Adds a pass.
Chris@0 115 *
Chris@0 116 * @param CompilerPassInterface $pass A Compiler pass
Chris@0 117 * @param string $type The pass type
Chris@0 118 * @param int $priority Used to sort the passes
Chris@0 119 *
Chris@0 120 * @throws InvalidArgumentException when a pass type doesn't exist
Chris@0 121 */
Chris@14 122 public function addPass(CompilerPassInterface $pass, $type = self::TYPE_BEFORE_OPTIMIZATION/*, int $priority = 0*/)
Chris@0 123 {
Chris@17 124 if (\func_num_args() >= 3) {
Chris@0 125 $priority = func_get_arg(2);
Chris@0 126 } else {
Chris@17 127 if (__CLASS__ !== \get_class($this)) {
Chris@0 128 $r = new \ReflectionMethod($this, __FUNCTION__);
Chris@0 129 if (__CLASS__ !== $r->getDeclaringClass()->getName()) {
Chris@14 130 @trigger_error(sprintf('Method %s() will have a third `int $priority = 0` argument in version 4.0. Not defining it is deprecated since Symfony 3.2.', __METHOD__), E_USER_DEPRECATED);
Chris@0 131 }
Chris@0 132 }
Chris@0 133
Chris@0 134 $priority = 0;
Chris@0 135 }
Chris@0 136
Chris@0 137 $property = $type.'Passes';
Chris@0 138 if (!isset($this->$property)) {
Chris@0 139 throw new InvalidArgumentException(sprintf('Invalid type "%s".', $type));
Chris@0 140 }
Chris@0 141
Chris@0 142 $passes = &$this->$property;
Chris@0 143
Chris@0 144 if (!isset($passes[$priority])) {
Chris@17 145 $passes[$priority] = [];
Chris@0 146 }
Chris@0 147 $passes[$priority][] = $pass;
Chris@0 148 }
Chris@0 149
Chris@0 150 /**
Chris@0 151 * Gets all passes for the AfterRemoving pass.
Chris@0 152 *
Chris@0 153 * @return CompilerPassInterface[]
Chris@0 154 */
Chris@0 155 public function getAfterRemovingPasses()
Chris@0 156 {
Chris@0 157 return $this->sortPasses($this->afterRemovingPasses);
Chris@0 158 }
Chris@0 159
Chris@0 160 /**
Chris@0 161 * Gets all passes for the BeforeOptimization pass.
Chris@0 162 *
Chris@0 163 * @return CompilerPassInterface[]
Chris@0 164 */
Chris@0 165 public function getBeforeOptimizationPasses()
Chris@0 166 {
Chris@0 167 return $this->sortPasses($this->beforeOptimizationPasses);
Chris@0 168 }
Chris@0 169
Chris@0 170 /**
Chris@0 171 * Gets all passes for the BeforeRemoving pass.
Chris@0 172 *
Chris@0 173 * @return CompilerPassInterface[]
Chris@0 174 */
Chris@0 175 public function getBeforeRemovingPasses()
Chris@0 176 {
Chris@0 177 return $this->sortPasses($this->beforeRemovingPasses);
Chris@0 178 }
Chris@0 179
Chris@0 180 /**
Chris@0 181 * Gets all passes for the Optimization pass.
Chris@0 182 *
Chris@0 183 * @return CompilerPassInterface[]
Chris@0 184 */
Chris@0 185 public function getOptimizationPasses()
Chris@0 186 {
Chris@0 187 return $this->sortPasses($this->optimizationPasses);
Chris@0 188 }
Chris@0 189
Chris@0 190 /**
Chris@0 191 * Gets all passes for the Removing pass.
Chris@0 192 *
Chris@0 193 * @return CompilerPassInterface[]
Chris@0 194 */
Chris@0 195 public function getRemovingPasses()
Chris@0 196 {
Chris@0 197 return $this->sortPasses($this->removingPasses);
Chris@0 198 }
Chris@0 199
Chris@0 200 /**
Chris@0 201 * Gets the Merge pass.
Chris@0 202 *
Chris@0 203 * @return CompilerPassInterface
Chris@0 204 */
Chris@0 205 public function getMergePass()
Chris@0 206 {
Chris@0 207 return $this->mergePass;
Chris@0 208 }
Chris@0 209
Chris@0 210 public function setMergePass(CompilerPassInterface $pass)
Chris@0 211 {
Chris@0 212 $this->mergePass = $pass;
Chris@0 213 }
Chris@0 214
Chris@0 215 /**
Chris@0 216 * Sets the AfterRemoving passes.
Chris@0 217 *
Chris@0 218 * @param CompilerPassInterface[] $passes
Chris@0 219 */
Chris@0 220 public function setAfterRemovingPasses(array $passes)
Chris@0 221 {
Chris@17 222 $this->afterRemovingPasses = [$passes];
Chris@0 223 }
Chris@0 224
Chris@0 225 /**
Chris@0 226 * Sets the BeforeOptimization passes.
Chris@0 227 *
Chris@0 228 * @param CompilerPassInterface[] $passes
Chris@0 229 */
Chris@0 230 public function setBeforeOptimizationPasses(array $passes)
Chris@0 231 {
Chris@17 232 $this->beforeOptimizationPasses = [$passes];
Chris@0 233 }
Chris@0 234
Chris@0 235 /**
Chris@0 236 * Sets the BeforeRemoving passes.
Chris@0 237 *
Chris@0 238 * @param CompilerPassInterface[] $passes
Chris@0 239 */
Chris@0 240 public function setBeforeRemovingPasses(array $passes)
Chris@0 241 {
Chris@17 242 $this->beforeRemovingPasses = [$passes];
Chris@0 243 }
Chris@0 244
Chris@0 245 /**
Chris@0 246 * Sets the Optimization passes.
Chris@0 247 *
Chris@0 248 * @param CompilerPassInterface[] $passes
Chris@0 249 */
Chris@0 250 public function setOptimizationPasses(array $passes)
Chris@0 251 {
Chris@17 252 $this->optimizationPasses = [$passes];
Chris@0 253 }
Chris@0 254
Chris@0 255 /**
Chris@0 256 * Sets the Removing passes.
Chris@0 257 *
Chris@0 258 * @param CompilerPassInterface[] $passes
Chris@0 259 */
Chris@0 260 public function setRemovingPasses(array $passes)
Chris@0 261 {
Chris@17 262 $this->removingPasses = [$passes];
Chris@0 263 }
Chris@0 264
Chris@0 265 /**
Chris@0 266 * Sort passes by priority.
Chris@0 267 *
Chris@0 268 * @param array $passes CompilerPassInterface instances with their priority as key
Chris@0 269 *
Chris@0 270 * @return CompilerPassInterface[]
Chris@0 271 */
Chris@0 272 private function sortPasses(array $passes)
Chris@0 273 {
Chris@17 274 if (0 === \count($passes)) {
Chris@17 275 return [];
Chris@0 276 }
Chris@0 277
Chris@0 278 krsort($passes);
Chris@0 279
Chris@0 280 // Flatten the array
Chris@17 281 return \call_user_func_array('array_merge', $passes);
Chris@0 282 }
Chris@0 283 }