@@ -39,7 +39,7 @@ public function __construct()
39
39
{
40
40
$ this ->mergePass = new MergeExtensionConfigurationPass ();
41
41
42
- $ this ->optimizationPasses = array (
42
+ $ this ->optimizationPasses = array (array (
43
43
new ExtensionCompilerPass (),
44
44
new ResolveDefinitionTemplatesPass (),
45
45
new DecoratorServicePass (),
@@ -51,9 +51,9 @@ public function __construct()
51
51
new AnalyzeServiceReferencesPass (true ),
52
52
new CheckCircularReferencesPass (),
53
53
new CheckReferenceValidityPass (),
54
- );
54
+ )) ;
55
55
56
- $ this ->removingPasses = array (
56
+ $ this ->removingPasses = array (array (
57
57
new RemovePrivateAliasesPass (),
58
58
new ReplaceAliasByActualDefinitionPass (),
59
59
new RemoveAbstractDefinitionsPass (),
@@ -64,98 +64,111 @@ public function __construct()
64
64
new RemoveUnusedDefinitionsPass (),
65
65
)),
66
66
new CheckExceptionOnInvalidReferenceBehaviorPass (),
67
- );
67
+ )) ;
68
68
}
69
69
70
70
/**
71
71
* Returns all passes in order to be processed.
72
72
*
73
- * @return array An array of all passes to process
73
+ * @return CompilerPassInterface[]
74
74
*/
75
75
public function getPasses ()
76
76
{
77
77
return array_merge (
78
78
array ($ this ->mergePass ),
79
- $ this ->beforeOptimizationPasses ,
80
- $ this ->optimizationPasses ,
81
- $ this ->beforeRemovingPasses ,
82
- $ this ->removingPasses ,
83
- $ this ->afterRemovingPasses
79
<
F438
/td>+ $ this ->getBeforeOptimizationPasses () ,
80
+ $ this ->getOptimizationPasses () ,
81
+ $ this ->getBeforeRemovingPasses () ,
82
+ $ this ->getRemovingPasses () ,
83
+ $ this ->getAfterRemovingPasses ()
84
84
);
85
85
}
86
86
87
87
/**
88
88
* Adds a pass.
89
89
*
90
- * @param CompilerPassInterface $pass A Compiler pass
91
- * @param string $type The pass type
90
+ * @param CompilerPassInterface $pass A Compiler pass
91
+ * @param string $type The pass type
92
+ * @param int $priority Used to sort the passes
92
93
*
93
94
* @throws InvalidArgumentException when a pass type doesn't exist
94
95
*/
95
- public function addPass (CompilerPassInterface $ pass , $ type = self ::TYPE_BEFORE_OPTIMIZATION )
96
+ public function addPass (CompilerPassInterface $ pass , $ type = self ::TYPE_BEFORE_OPTIMIZATION /*, $priority = 0*/ )
96
97
{
98
+ // For BC
99
+ if (func_num_args () >= 3 ) {
100
+ $ priority = func_get_arg (2 );
101
+ } else {
102
+ $ priority = 0 ;
103
+ }
104
+
97
105
$ property = $ type .'Passes ' ;
98
106
if (!isset ($ this ->$ property )) {
99
107
throw new InvalidArgumentException (sprintf ('Invalid type "%s". ' , $ type ));
100
108
}
101
109
102
- $ this ->{$ property }[] = $ pass ;
110
+ $ passes = &$ this ->$ property ;
111
+
112
+ if (!isset ($ passes [$ priority ])) {
113
+ $ passes [$ priority ] = array ();
114
+ }
115
+ $ passes [$ priority ][] = $ pass ;
103
116
}
104
117
105
118
/**
106<
10000
/code>
119
* Gets all passes for the AfterRemoving pass.
107
120
*
108
- * @return array An array of passes
121
+ * @return CompilerPassInterface[]
109
122
*/
110
123
public function getAfterRemovingPasses ()
111
124
{
112
- return $ this ->afterRemovingPasses ;
125
+ return $ this ->sortPasses ( $ this -> afterRemovingPasses ) ;
113
126
}
114
127
115
128
/**
116
129
* Gets all passes for the BeforeOptimization pass.
117
130
*
118
- * @return array An array of passes
131
+ * @return CompilerPassInterface[]
119
132
*/
120
133
public function getBeforeOptimizationPasses ()
121
134
{
122
- return $ this ->beforeOptimizationPasses ;
135
+ return $ this ->sortPasses ( $ this -> beforeOptimizationPasses ) ;
123
136
}
124
137
125
138
/**
126
139
* Gets all passes for the BeforeRemoving pass.
127
140
*
128
- * @return array An array of passes
141
+ * @return CompilerPassInterface[]
129
142
*/
130
143
public function getBeforeRemovingPasses ()
131
144
{
132
- return $ this ->beforeRemovingPasses ;
145
+ return $ this ->sortPasses ( $ this -> beforeRemovingPasses ) ;
133
146
}
134
147
135
148
/**
136
149
* Gets all passes for the Optimization pass.
137
150
*
138
- * @return array An array of passes
151
+ * @return CompilerPassInterface[]
139
152
*/
140
153
public function getOptimizationPasses ()
141
154
{
142
- return $ this ->optimizationPasses ;
155
+ return $ this ->sortPasses ( $ this -> optimizationPasses ) ;
143
156
}
144
157
145
158
/**
146
159
* Gets all passes for the Removing pass.
147
160
*
148
- * @return array An array of passes
161
+ * @return CompilerPassInterface[]
149
162
*/
150
163
public function getRemovingPasses ()
151
164
{
152
- return $ this ->removingPasses ;
165
+ return $ this ->sortPasses ( $ this -> removingPasses ) ;
153
166
}
154
167
155
168
/**
156
169
* Gets all passes for the Merge pass.
157
170
*
158
- * @return array An array of passes
171
+ * @return CompilerPassInterface
159
172
*/
160
173
public function getMergePass ()
161
174
{
@@ -175,50 +188,69 @@ public function setMergePass(CompilerPassInterface $pass)
175
188
/**
176
189
* Sets the AfterRemoving passes.
177
190
*
178
- * @param array $passes An array of passes
191
+ * @param CompilerPassInterface[] $ passes
179
192
*/
180
193
public function setAfterRemovingPasses (array $ passes )
181
194
{
182
- $ this ->afterRemovingPasses = $ passes ;
195
+ $ this ->afterRemovingPasses = array ( $ passes) ;
183
196
}
184
197
185
198
/**
186
199
* Sets the BeforeOptimization passes.
187
200
*
188
- * @param array $passes An array of passes
201
+ * @param CompilerPassInterface[] $ passes
189
202
*/
190
203
public function setBeforeOptimizationPasses (array $ passes )
191
204
{
192
- $ this ->beforeOptimizationPasses = $ passes ;
205
+ $ this ->beforeOptimizationPasses = array ( $ passes) ;
193
206
}
194
207
195
208
/**
196
209
* Sets the BeforeRemoving passes.
197
210
*
198
- * @param array $passes An array of passes
211
+ * @param CompilerPassInterface[] $ passes
199
212
*/
200
213
public function setBeforeRemovingPasses (array $ passes )
201
214
{
202
- $ this ->beforeRemovingPasses = $ passes ;
215
+ $ this ->beforeRemovingPasses = array ( $ passes) ;
203
216
}
204
217
205
218
/**
206
219
* Sets the Optimization passes.
207
220
*
208
- * @param array $passes An array of passes
221
+ * @param CompilerPassInterface[] $ passes
209
222
*/
210
223
public function setOptimizationPasses (array $ passes )
211
224
{
212
- $ this ->optimizationPasses = $ passes ;
225
+ $ this ->optimizationPasses = array ( $ passes) ;
213
226
}
214
227
215
228
/**
216
229
* Sets the Removing passes.
217
230
*
218
- * @param array $passes An array of passes
231
+ * @param CompilerPassInterface[] $ passes
219
232
*/
220
233
public function setRemovingPasses (array $ passes )
221
234
{
222
- $ this ->removingPasses = $ passes ;
235
+ $ this ->removingPasses = array ($ passes );
236
+ }
237
+
238
+ /**
239
+ * Sort passes by priority.
240
+ *
241
+ * @param array $passes CompilerPassInterface instances with their priority as key.
242
+ *
243
+ * @return CompilerPassInterface[]
244
+ */
245
+ private function sortPasses (array $ passes )
246
+ {
247
+ if (0 === count ($ passes )) {
248
+ return array ();
249
+ }
250
+
251
+ krsort ($ passes );
252
+
253
+ // Flatten the array
254
+ return call_user_func_array ('array_merge ' , $ passes );
223
255
}
224
256
}
0 commit comments