@@ -169,35 +169,6 @@ private function performReplacements(string $s, array $replacements): string
169
169
public function extractAll (): PhpFile
170
170
{
171
171
$ phpFile = new PhpFile ;
172
- $ namespace = '' ;
173
- $ visitor = new class extends PhpParser \NodeVisitorAbstract {
174
- public $ callback ;
175
-
176
-
177
- public function enterNode (Node $ node )
178
- {
179
- return ($ this ->callback )($ node );
180
- }
181
- };
182
-
183
- $ visitor ->callback = function (Node $ node ) use (&$ namespace , $ phpFile ) {
184
- if ($ node instanceof Node \Stmt \Class_ && !$ node ->name ) {
185
- return PhpParser \NodeTraverser::DONT_TRAVERSE_CHILDREN ;
186
- }
187
- match (true ) {
188
- $ node instanceof Node \Stmt \DeclareDeclare
189
- && $ node ->key ->name === 'strict_types '
190
- && $ node ->value instanceof Node \Scalar \LNumber => $ phpFile ->setStrictTypes ((bool ) $ node ->value ->value ),
191
- $ node instanceof Node \Stmt \Namespace_ => $ namespace = $ node ->name ?->toString(),
192
- $ node instanceof Node \Stmt \Use_ => $ this ->addUseToNamespace ($ phpFile ->addNamespace ($ namespace ), $ node ),
193
- $ node instanceof Node \Stmt \ClassLike => $ this ->addClassLikeToFile ($ phpFile , $ node ),
194
- $ node instanceof Node \Stmt \Function_ => $ this ->addFunctionToFile ($ phpFile , $ node ),
195
- default => null ,
196
- };
197
- if ($ node instanceof Node \FunctionLike) {
198
- return PhpParser \NodeTraverser::DONT_TRAVERSE_CHILDREN ;
199
- }
200
- };
201
172
202
173
if (
203
174
$ this ->statements
@@ -207,9 +178,31 @@ public function enterNode(Node $node)
207
178
$ this ->addCommentAndAttributes ($ phpFile , $ this ->statements [0 ]);
208
179
}
209
180
210
- $ traverser = new PhpParser \NodeTraverser ;
211
- $ traverser ->addVisitor ($ visitor );
212
- $ traverser ->traverse ($ this ->statements );
181
+ $ namespaces = ['' => $ this ->statements ];
182
+ foreach ($ this ->statements as $ node ) {
183
+ if ($ node instanceof Node \Stmt \Declare_
184
+ && $ node ->declares [0 ] instanceof Node \Stmt \DeclareDeclare
185
+ && $ node ->declares [0 ]->key ->name === 'strict_types '
186
+ && $ node ->declares [0 ]->value instanceof Node \Scalar \LNumber
187
+ ) {
188
+ $ phpFile ->setStrictTypes ((bool ) $ node ->declares [0 ]->value ->value );
189
+
190
+ } elseif ($ node instanceof Node \Stmt \Namespace_) {
191
+ $ namespaces [$ node ->name ->toString ()] = $ node ->stmts ;
192
+ }
193
+ }
194
+
195
+ foreach ($ namespaces as $ name => $ nodes ) {
196
+ foreach ($ nodes as $ node ) {
197
+ match (true ) {
198
+ $ node instanceof Node \Stmt \Use_ => $ this ->addUseToNamespace ($ phpFile ->addNamespace ($ name ), $ node ),
199
+ $ node instanceof Node \Stmt \ClassLike => $ this ->addClassLikeToFile ($ phpFile , $ node ),
200
+ $ node instanceof Node \Stmt \Function_ => $ this ->addFunctionToFile ($ phpFile , $ node ),
201
+ default => null ,
202
+ };
203
+ }
204
+ }
205
+
213
206
return $ phpFile ;
214
207
}
215
208
0 commit comments