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