annotate vendor/symfony/dependency-injection/Compiler/PassConfig.php @ 8:50b0d041100e

Further files for download
author Chris Cannam
date Mon, 05 Feb 2018 10:56:40 +0000
parents 4c8ae668cc8c
children 1fec387a4317
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@0 32 private $afterRemovingPasses = array();
Chris@0 33 private $beforeOptimizationPasses = array();
Chris@0 34 private $beforeRemovingPasses = array();
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@0 42 $this->optimizationPasses = array(array(
Chris@0 43 new ExtensionCompilerPass(),
Chris@0 44 new ResolveDefinitionTemplatesPass(),
Chris@0 45 new DecoratorServicePass(),
Chris@0 46 new ResolveParameterPlaceHoldersPass(),
Chris@0 47 new FactoryReturnTypePass(),
Chris@0 48 new CheckDefinitionValidityPass(),
Chris@0 49 new ResolveReferencesToAliasesPass(),
Chris@0 50 new ResolveInvalidReferencesPass(),
Chris@0 51 new AutowirePass(),
Chris@0 52 new AnalyzeServiceReferencesPass(true),
Chris@0 53 new CheckCircularReferencesPass(),
Chris@0 54 new CheckReferenceValidityPass(),
Chris@0 55 ));
Chris@0 56
Chris@0 57 $this->removingPasses = array(array(
Chris@0 58 new RemovePrivateAliasesPass(),
Chris@0 59 new ReplaceAliasByActualDefinitionPass(),
Chris@0 60 new RemoveAbstractDefinitionsPass(),
Chris@0 61 new RepeatedPass(array(
Chris@0 62 new AnalyzeServiceReferencesPass(),
Chris@0 63 new InlineServiceDefinitionsPass(),
Chris@0 64 new AnalyzeServiceReferencesPass(),
Chris@0 65 new RemoveUnusedDefinitionsPass(),
Chris@0 66 )),
Chris@0 67 new CheckExceptionOnInvalidReferenceBehaviorPass(),
Chris@0 68 ));
Chris@0 69 }
Chris@0 70
Chris@0 71 /**
Chris@0 72 * Returns all passes in order to be processed.
Chris@0 73 *
Chris@0 74 * @return CompilerPassInterface[]
Chris@0 75 */
Chris@0 76 public function getPasses()
Chris@0 77 {
Chris@0 78 return array_merge(
Chris@0 79 array($this->mergePass),
Chris@0 80 $this->getBeforeOptimizationPasses(),
Chris@0 81 $this->getOptimizationPasses(),
Chris@0 82 $this->getBeforeRemovingPasses(),
Chris@0 83 $this->getRemovingPasses(),
Chris@0 84 $this->getAfterRemovingPasses()
Chris@0 85 );
Chris@0 86 }
Chris@0 87
Chris@0 88 /**
Chris@0 89 * Adds a pass.
Chris@0 90 *
Chris@0 91 * @param CompilerPassInterface $pass A Compiler pass
Chris@0 92 * @param string $type The pass type
Chris@0 93 * @param int $priority Used to sort the passes
Chris@0 94 *
Chris@0 95 * @throws InvalidArgumentException when a pass type doesn't exist
Chris@0 96 */
Chris@0 97 public function addPass(CompilerPassInterface $pass, $type = self::TYPE_BEFORE_OPTIMIZATION/*, $priority = 0*/)
Chris@0 98 {
Chris@0 99 if (func_num_args() >= 3) {
Chris@0 100 $priority = func_get_arg(2);
Chris@0 101 } else {
Chris@0 102 if (__CLASS__ !== get_class($this)) {
Chris@0 103 $r = new \ReflectionMethod($this, __FUNCTION__);
Chris@0 104 if (__CLASS__ !== $r->getDeclaringClass()->getName()) {
Chris@0 105 @trigger_error(sprintf('Method %s() will have a third `$priority = 0` argument in version 4.0. Not defining it is deprecated since 3.2.', __METHOD__), E_USER_DEPRECATED);
Chris@0 106 }
Chris@0 107 }
Chris@0 108
Chris@0 109 $priority = 0;
Chris@0 110 }
Chris@0 111
Chris@0 112 $property = $type.'Passes';
Chris@0 113 if (!isset($this->$property)) {
Chris@0 114 throw new InvalidArgumentException(sprintf('Invalid type "%s".', $type));
Chris@0 115 }
Chris@0 116
Chris@0 117 $passes = &$this->$property;
Chris@0 118
Chris@0 119 if (!isset($passes[$priority])) {
Chris@0 120 $passes[$priority] = array();
Chris@0 121 }
Chris@0 122 $passes[$priority][] = $pass;
Chris@0 123 }
Chris@0 124
Chris@0 125 /**
Chris@0 126 * Gets all passes for the AfterRemoving pass.
Chris@0 127 *
Chris@0 128 * @return CompilerPassInterface[]
Chris@0 129 */
Chris@0 130 public function getAfterRemovingPasses()
Chris@0 131 {
Chris@0 132 return $this->sortPasses($this->afterRemovingPasses);
Chris@0 133 }
Chris@0 134
Chris@0 135 /**
Chris@0 136 * Gets all passes for the BeforeOptimization pass.
Chris@0 137 *
Chris@0 138 * @return CompilerPassInterface[]
Chris@0 139 */
Chris@0 140 public function getBeforeOptimizationPasses()
Chris@0 141 {
Chris@0 142 return $this->sortPasses($this->beforeOptimizationPasses);
Chris@0 143 }
Chris@0 144
Chris@0 145 /**
Chris@0 146 * Gets all passes for the BeforeRemoving pass.
Chris@0 147 *
Chris@0 148 * @return CompilerPassInterface[]
Chris@0 149 */
Chris@0 150 public function getBeforeRemovingPasses()
Chris@0 151 {
Chris@0 152 return $this->sortPasses($this->beforeRemovingPasses);
Chris@0 153 }
Chris@0 154
Chris@0 155 /**
Chris@0 156 * Gets all passes for the Optimization pass.
Chris@0 157 *
Chris@0 158 * @return CompilerPassInterface[]
Chris@0 159 */
Chris@0 160 public function getOptimizationPasses()
Chris@0 161 {
Chris@0 162 return $this->sortPasses($this->optimizationPasses);
Chris@0 163 }
Chris@0 164
Chris@0 165 /**
Chris@0 166 * Gets all passes for the Removing pass.
Chris@0 167 *
Chris@0 168 * @return CompilerPassInterface[]
Chris@0 169 */
Chris@0 170 public function getRemovingPasses()
Chris@0 171 {
Chris@0 172 return $this->sortPasses($this->removingPasses);
Chris@0 173 }
Chris@0 174
Chris@0 175 /**
Chris@0 176 * Gets the Merge pass.
Chris@0 177 *
Chris@0 178 * @return CompilerPassInterface
Chris@0 179 */
Chris@0 180 public function getMergePass()
Chris@0 181 {
Chris@0 182 return $this->mergePass;
Chris@0 183 }
Chris@0 184
Chris@0 185 /**
Chris@0 186 * Sets the Merge Pass.
Chris@0 187 *
Chris@0 188 * @param CompilerPassInterface $pass The merge pass
Chris@0 189 */
Chris@0 190 public function setMergePass(CompilerPassInterface $pass)
Chris@0 191 {
Chris@0 192 $this->mergePass = $pass;
Chris@0 193 }
Chris@0 194
Chris@0 195 /**
Chris@0 196 * Sets the AfterRemoving passes.
Chris@0 197 *
Chris@0 198 * @param CompilerPassInterface[] $passes
Chris@0 199 */
Chris@0 200 public function setAfterRemovingPasses(array $passes)
Chris@0 201 {
Chris@0 202 $this->afterRemovingPasses = array($passes);
Chris@0 203 }
Chris@0 204
Chris@0 205 /**
Chris@0 206 * Sets the BeforeOptimization passes.
Chris@0 207 *
Chris@0 208 * @param CompilerPassInterface[] $passes
Chris@0 209 */
Chris@0 210 public function setBeforeOptimizationPasses(array $passes)
Chris@0 211 {
Chris@0 212 $this->beforeOptimizationPasses = array($passes);
Chris@0 213 }
Chris@0 214
Chris@0 215 /**
Chris@0 216 * Sets the BeforeRemoving passes.
Chris@0 217 *
Chris@0 218 * @param CompilerPassInterface[] $passes
Chris@0 219 */
Chris@0 220 public function setBeforeRemovingPasses(array $passes)
Chris@0 221 {
Chris@0 222 $this->beforeRemovingPasses = array($passes);
Chris@0 223 }
Chris@0 224
Chris@0 225 /**
Chris@0 226 * Sets the Optimization passes.
Chris@0 227 *
Chris@0 228 * @param CompilerPassInterface[] $passes
Chris@0 229 */
Chris@0 230 public function setOptimizationPasses(array $passes)
Chris@0 231 {
Chris@0 232 $this->optimizationPasses = array($passes);
Chris@0 233 }
Chris@0 234
Chris@0 235 /**
Chris@0 236 * Sets the Removing passes.
Chris@0 237 *
Chris@0 238 * @param CompilerPassInterface[] $passes
Chris@0 239 */
Chris@0 240 public function setRemovingPasses(array $passes)
Chris@0 241 {
Chris@0 242 $this->removingPasses = array($passes);
Chris@0 243 }
Chris@0 244
Chris@0 245 /**
Chris@0 246 * Sort passes by priority.
Chris@0 247 *
Chris@0 248 * @param array $passes CompilerPassInterface instances with their priority as key
Chris@0 249 *
Chris@0 250 * @return CompilerPassInterface[]
Chris@0 251 */
Chris@0 252 private function sortPasses(array $passes)
Chris@0 253 {
Chris@0 254 if (0 === count($passes)) {
Chris@0 255 return array();
Chris@0 256 }
Chris@0 257
Chris@0 258 krsort($passes);
Chris@0 259
Chris@0 260 // Flatten the array
Chris@0 261 return call_user_func_array('array_merge', $passes);
Chris@0 262 }
Chris@0 263 }