Passed
Push — master ( da5866...513800 )
by Théo
02:08
created

TraverserFactory::createTraverser()   A

Complexity

Conditions 2
Paths 2

Size

Total Lines 11
Code Lines 5

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 1
CRAP Score 2

Importance

Changes 0
Metric Value
cc 2
eloc 5
nc 2
nop 1
dl 0
loc 11
ccs 1
cts 1
cp 1
crap 2
rs 10
c 0
b 0
f 0
1
<?php
2
3
declare(strict_types=1);
4
5
/*
6
 * This file is part of the humbug/php-scoper package.
7
 *
8
 * Copyright (c) 2017 Théo FIDRY <[email protected]>,
9
 *                    Pádraic Brady <[email protected]>
10
 *
11
 * For the full copyright and license information, please view the LICENSE
12
 * file that was distributed with this source code.
13
 */
14
15
namespace Humbug\PhpScoper\PhpParser;
16
17
use Humbug\PhpScoper\PhpParser\NodeVisitor\NamespaceStmt\NamespaceStmtCollection;
18
use Humbug\PhpScoper\PhpParser\NodeVisitor\Resolver\IdentifierResolver;
19
use Humbug\PhpScoper\PhpParser\NodeVisitor\UseStmt\UseStmtCollection;
20
use Humbug\PhpScoper\Scoper\PhpScoper;
21
use Humbug\PhpScoper\Symbol\EnrichedReflector;
22
use Humbug\PhpScoper\Symbol\SymbolsRegistry;
23
use PhpParser\NodeTraverser as PhpParserNodeTraverser;
24
use PhpParser\NodeTraverserInterface;
25
use PhpParser\NodeVisitor as PhpParserNodeVisitor;
26
use PhpParser\NodeVisitor\NameResolver;
27
28
/**
29
 * @private
30
 */
31
class TraverserFactory
32 555
{
33
    private EnrichedReflector $reflector;
34 555
    private string $prefix;
35
    private SymbolsRegistry $symbolsRegistry;
36
37 550
    public function __construct(
38
        EnrichedReflector $reflector,
39 550
        string $prefix,
40
        SymbolsRegistry $symbolsRegistry
41 550
    ) {
42 550
        $this->reflector = $reflector;
43
        $this->prefix = $prefix;
44 550
        $this->symbolsRegistry = $symbolsRegistry;
45
    }
46 550
47
    public function create(PhpScoper $scoper): NodeTraverserInterface
48 550
    {
49
        return self::createTraverser(
50 550
            self::createNodeVisitors(
51 550
                $this->prefix,
52
                $this->reflector,
53 550
                $scoper,
54 550
                $this->symbolsRegistry,
55 550
            )
56 550
        );
57 550
    }
58 550
59
    /**
60 550
     * @param PhpParserNodeVisitor[] $nodeVisitors
61 550
     */
62
    private static function createTraverser(array $nodeVisitors): NodeTraverserInterface
63 550
    {
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(
79
        string $prefix,
80
        EnrichedReflector $reflector,
81
        PhpScoper $scoper,
82
        SymbolsRegistry $symbolsRegistry
83
    ): array
84
    {
85
        $namespaceStatements = new NamespaceStmtCollection();
86
        $useStatements = new UseStmtCollection();
87
88
        $nameResolver = new NameResolver(
89
            null,
90
            ['preserveOriginalNames' => true],
91
        );
92
        $identifierResolver = new IdentifierResolver($nameResolver);
93
        $stringNodePrefixer = new StringNodePrefixer($scoper);
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
       ];
151
    }
152
}
153