4 * This file is part of the Symfony package.
6 * (c) Fabien Potencier <fabien@symfony.com>
8 * For the full copyright and license information, please view the LICENSE
9 * file that was distributed with this source code.
12 namespace Symfony\Component\DependencyInjection\Compiler;
14 use Symfony\Component\DependencyInjection\Exception\InvalidArgumentException;
17 * Compiler Pass Configuration.
19 * This class has a default configuration embedded.
21 * @author Johannes M. Schmitt <schmittjoh@gmail.com>
25 const TYPE_AFTER_REMOVING = 'afterRemoving';
26 const TYPE_BEFORE_OPTIMIZATION = 'beforeOptimization';
27 const TYPE_BEFORE_REMOVING = 'beforeRemoving';
28 const TYPE_OPTIMIZE = 'optimization';
29 const TYPE_REMOVE = 'removing';
32 private $afterRemovingPasses = array();
33 private $beforeOptimizationPasses = array();
34 private $beforeRemovingPasses = array();
35 private $optimizationPasses;
36 private $removingPasses;
38 public function __construct()
40 $this->mergePass = new MergeExtensionConfigurationPass();
42 $this->optimizationPasses = array(array(
43 new ExtensionCompilerPass(),
44 new ResolveDefinitionTemplatesPass(),
45 new DecoratorServicePass(),
46 new ResolveParameterPlaceHoldersPass(),
47 new FactoryReturnTypePass(),
48 new CheckDefinitionValidityPass(),
49 new ResolveReferencesToAliasesPass(),
50 new ResolveInvalidReferencesPass(),
52 new AnalyzeServiceReferencesPass(true),
53 new CheckCircularReferencesPass(),
54 new CheckReferenceValidityPass(),
57 $this->removingPasses = array(array(
58 new RemovePrivateAliasesPass(),
59 new ReplaceAliasByActualDefinitionPass(),
60 new RemoveAbstractDefinitionsPass(),
61 new RepeatedPass(array(
62 new AnalyzeServiceReferencesPass(),
63 new InlineServiceDefinitionsPass(),
64 new AnalyzeServiceReferencesPass(),
65 new RemoveUnusedDefinitionsPass(),
67 new CheckExceptionOnInvalidReferenceBehaviorPass(),
72 * Returns all passes in order to be processed.
74 * @return CompilerPassInterface[]
76 public function getPasses()
79 array($this->mergePass),
80 $this->getBeforeOptimizationPasses(),
81 $this->getOptimizationPasses(),
82 $this->getBeforeRemovingPasses(),
83 $this->getRemovingPasses(),
84 $this->getAfterRemovingPasses()
91 * @param CompilerPassInterface $pass A Compiler pass
92 * @param string $type The pass type
93 * @param int $priority Used to sort the passes
95 * @throws InvalidArgumentException when a pass type doesn't exist
97 public function addPass(CompilerPassInterface $pass, $type = self::TYPE_BEFORE_OPTIMIZATION/*, $priority = 0*/)
99 if (func_num_args() >= 3) {
100 $priority = func_get_arg(2);
102 if (__CLASS__ !== get_class($this)) {
103 $r = new \ReflectionMethod($this, __FUNCTION__);
104 if (__CLASS__ !== $r->getDeclaringClass()->getName()) {
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);
112 $property = $type.'Passes';
113 if (!isset($this->$property)) {
114 throw new InvalidArgumentException(sprintf('Invalid type "%s".', $type));
117 $passes = &$this->$property;
119 if (!isset($passes[$priority])) {
120 $passes[$priority] = array();
122 $passes[$priority][] = $pass;
126 * Gets all passes for the AfterRemoving pass.
128 * @return CompilerPassInterface[]
130 public function getAfterRemovingPasses()
132 return $this->sortPasses($this->afterRemovingPasses);
136 * Gets all passes for the BeforeOptimization pass.
138 * @return CompilerPassInterface[]
140 public function getBeforeOptimizationPasses()
142 return $this->sortPasses($this->beforeOptimizationPasses);
146 * Gets all passes for the BeforeRemoving pass.
148 * @return CompilerPassInterface[]
150 public function getBeforeRemovingPasses()
152 return $this->sortPasses($this->beforeRemovingPasses);
156 * Gets all passes for the Optimization pass.
158 * @return CompilerPassInterface[]
160 public function getOptimizationPasses()
162 return $this->sortPasses($this->optimizationPasses);
166 * Gets all passes for the Removing pass.
168 * @return CompilerPassInterface[]
170 public function getRemovingPasses()
172 return $this->sortPasses($this->removingPasses);
176 * Gets the Merge pass.
178 * @return CompilerPassInterface
180 public function getMergePass()
182 return $this->mergePass;
186 * Sets the Merge Pass.
188 * @param CompilerPassInterface $pass The merge pass
190 public function setMergePass(CompilerPassInterface $pass)
192 $this->mergePass = $pass;
196 * Sets the AfterRemoving passes.
198 * @param CompilerPassInterface[] $passes
200 public function setAfterRemovingPasses(array $passes)
202 $this->afterRemovingPasses = array($passes);
206 * Sets the BeforeOptimization passes.
208 * @param CompilerPassInterface[] $passes
210 public function setBeforeOptimizationPasses(array $passes)
212 $this->beforeOptimizationPasses = array($passes);
216 * Sets the BeforeRemoving passes.
218 * @param CompilerPassInterface[] $passes
220 public function setBeforeRemovingPasses(array $passes)
222 $this->beforeRemovingPasses = array($passes);
226 * Sets the Optimization passes.
228 * @param CompilerPassInterface[] $passes
230 public function setOptimizationPasses(array $passes)
232 $this->optimizationPasses = array($passes);
236 * Sets the Removing passes.
238 * @param CompilerPassInterface[] $passes
240 public function setRemovingPasses(array $passes)
242 $this->removingPasses = array($passes);
246 * Sort passes by priority.
248 * @param array $passes CompilerPassInterface instances with their priority as key
250 * @return CompilerPassInterface[]
252 private function sortPasses(array $passes)
254 if (0 === count($passes)) {
261 return call_user_func_array('array_merge', $passes);