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 }
|