2020use Humbug \PhpScoper \Scoper \PhpScoper ;
2121use Humbug \PhpScoper \Symbol \EnrichedReflector ;
2222use Humbug \PhpScoper \Symbol \SymbolsRegistry ;
23+ use PhpParser \NodeTraverser as PhpParserNodeTraverser ;
2324use PhpParser \NodeTraverserInterface ;
2425use PhpParser \NodeVisitor as PhpParserNodeVisitor ;
2526use PhpParser \NodeVisitor \NameResolver ;
3031class TraverserFactory
3132{
3233 private EnrichedReflector $ reflector ;
34+ private string $ prefix ;
35+ private SymbolsRegistry $ symbolsRegistry ;
3336
34- public function __construct (EnrichedReflector $ reflector )
35- {
37+ public function __construct (
38+ EnrichedReflector $ reflector ,
39+ string $ prefix ,
40+ SymbolsRegistry $ symbolsRegistry
41+ ) {
3642 $ this ->reflector = $ reflector ;
43+ $ this ->prefix = $ prefix ;
44+ $ this ->symbolsRegistry = $ symbolsRegistry ;
3745 }
3846
39- public function create (
40- PhpScoper $ scoper ,
47+ public function create (PhpScoper $ scoper ): NodeTraverserInterface
48+ {
49+ return self ::createTraverser (
50+ self ::createNodeVisitors (
51+ $ this ->prefix ,
52+ $ this ->reflector ,
53+ $ scoper ,
54+ $ this ->symbolsRegistry ,
55+ )
56+ );
57+ }
58+
59+ /**
60+ * @param PhpParserNodeVisitor[] $nodeVisitors
61+ */
62+ private static function createTraverser (array $ nodeVisitors ): NodeTraverserInterface
63+ {
64+ $ traverser = new NodeTraverser (
65+ new PhpParserNodeTraverser (),
66+ );
67+
68+ foreach ($ nodeVisitors as $ nodeVisitor ) {
69+ $ traverser ->addVisitor ($ nodeVisitor );
70+ }
71+
72+ return $ traverser ;
73+ }
74+
75+ /**
76+ * @return PhpParserNodeVisitor[]
77+ */
78+ private static function createNodeVisitors (
4179 string $ prefix ,
80+ EnrichedReflector $ reflector ,
81+ PhpScoper $ scoper ,
4282 SymbolsRegistry $ symbolsRegistry
43- ): NodeTraverserInterface
83+ ): array
4484 {
45- $ traverser = new NodeTraverser ();
46-
4785 $ namespaceStatements = new NamespaceStmtCollection ();
4886 $ useStatements = new UseStmtCollection ();
4987
@@ -53,80 +91,62 @@ public function create(
5391 );
5492 $ identifierResolver = new IdentifierResolver ($ nameResolver );
5593 $ stringNodePrefixer = new StringNodePrefixer ($ scoper );
56-
57- self ::addVisitors (
58- $ traverser ,
59- [
60- $ nameResolver ,
61- new NodeVisitor \ParentNodeAppender (),
62- new NodeVisitor \IdentifierNameAppender ($ identifierResolver ),
63-
64- new NodeVisitor \NamespaceStmt \NamespaceStmtPrefixer (
65- $ prefix ,
66- $ this ->reflector ,
67- $ namespaceStatements ,
68- ),
69-
70- new NodeVisitor \UseStmt \UseStmtCollector (
71- $ namespaceStatements ,
72- $ useStatements ,
73- ),
74- new NodeVisitor \UseStmt \UseStmtPrefixer (
75- $ prefix ,
76- $ this ->reflector ,
77- ),
78-
79- new NodeVisitor \NamespaceStmt \FunctionIdentifierRecorder (
80- $ prefix ,
81- $ identifierResolver ,
82- $ symbolsRegistry ,
83- $ this ->reflector ,
84- ),
85- new NodeVisitor \ClassIdentifierRecorder (
86- $ prefix ,
87- $ identifierResolver ,
88- $ symbolsRegistry ,
89- $ this ->reflector ,
90- ),
91- new NodeVisitor \NameStmtPrefixer (
92- $ prefix ,
93- $ namespaceStatements ,
94- $ useStatements ,
95- $ this ->reflector ,
96- ),
97- new NodeVisitor \StringScalarPrefixer (
98- $ prefix ,
99- $ this ->reflector ,
100- ),
101- new NodeVisitor \NewdocPrefixer ($ stringNodePrefixer ),
102- new NodeVisitor \EvalPrefixer ($ stringNodePrefixer ),
103-
104- new NodeVisitor \ClassAliasStmtAppender (
105- $ prefix ,
106- $ this ->reflector ,
107- $ identifierResolver ,
108- ),
109- new NodeVisitor \MultiConstStmtReplacer (),
110- new NodeVisitor \ConstStmtReplacer (
111- $ identifierResolver ,
112- $ this ->reflector ,
113- ),
114- ],
115- );
116-
117- return $ traverser ;
118- }
119-
120- /**
121- * @param PhpParserNodeVisitor[] $nodeVisitors
122- */
123- private static function addVisitors (
124- NodeTraverserInterface $ nodeTraverser ,
125- array $ nodeVisitors
126- ): void
127- {
128- foreach ($ nodeVisitors as $ nodeVisitor ) {
129- $ nodeTraverser ->addVisitor ($ nodeVisitor );
130- }
94+
95+ return [
96+ $ nameResolver ,
97+ new NodeVisitor \ParentNodeAppender (),
98+ new NodeVisitor \IdentifierNameAppender ($ identifierResolver ),
99+
100+ new NodeVisitor \NamespaceStmt \NamespaceStmtPrefixer (
101+ $ prefix ,
102+ $ reflector ,
103+ $ namespaceStatements ,
104+ ),
105+
106+ new NodeVisitor \UseStmt \UseStmtCollector (
107+ $ namespaceStatements ,
108+ $ useStatements ,
109+ ),
110+ new NodeVisitor \UseStmt \UseStmtPrefixer (
111+ $ prefix ,
112+ $ reflector ,
113+ ),
114+
115+ new NodeVisitor \NamespaceStmt \FunctionIdentifierRecorder (
116+ $ prefix ,
117+ $ identifierResolver ,
118+ $ symbolsRegistry ,
119+ $ reflector ,
120+ ),
121+ new NodeVisitor \ClassIdentifierRecorder (
122+ $ prefix ,
123+ $ identifierResolver ,
124+ $ symbolsRegistry ,
125+ $ reflector ,
126+ ),
127+ new NodeVisitor \NameStmtPrefixer (
128+ $ prefix ,
129+ $ namespaceStatements ,
130+ $ useStatements ,
131+ $ reflector ,
132+ ),
133+ new NodeVisitor \StringScalarPrefixer (
134+ $ prefix ,
135+ $ reflector ,
136+ ),
137+ new NodeVisitor \NewdocPrefixer ($ stringNodePrefixer ),
138+ new NodeVisitor \EvalPrefixer ($ stringNodePrefixer ),
139+
140+ new NodeVisitor \ClassAliasStmtAppender (
141+ $ prefix ,
142+ $ reflector ,
143+ $ identifierResolver ,
144+ ),
145+ new NodeVisitor \MultiConstStmtReplacer (),
146+ new NodeVisitor \ConstStmtReplacer (
147+ $ identifierResolver ,
148+ $ reflector ,
149+ ),
150+ ];
131151 }
132152}
0 commit comments