Passed
Pull Request — master (#496)
by Théo
01:51
created

TraverserFactory::addVisitors()   A

Complexity

Conditions 2
Paths 2

Size

Total Lines 7
Code Lines 2

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 0
CRAP Score 6

Importance

Changes 0
Metric Value
cc 2
eloc 2
c 0
b 0
f 0
nc 2
nop 2
dl 0
loc 7
ccs 0
cts 0
cp 0
crap 6
rs 10
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\FullyQualifiedNameResolver;
19
use Humbug\PhpScoper\PhpParser\NodeVisitor\UseStmt\UseStmtCollection;
20
use Humbug\PhpScoper\Reflector;
21
use Humbug\PhpScoper\Scoper\PhpScoper;
22
use Humbug\PhpScoper\Whitelist;
23
use PhpParser\NodeTraverserInterface;
24
use PhpParser\NodeVisitor as PhpParserNodeVisitor;
25
use PhpParser\NodeVisitor\NameResolver;
26
27
/**
28
 * @private
29
 */
30
class TraverserFactory
31
{
32 555
    private Reflector $reflector;
33
34 555
    public function __construct(Reflector $reflector)
35
    {
36
        $this->reflector = $reflector;
37 550
    }
38
39 550
    public function create(PhpScoper $scoper, string $prefix, Whitelist $whitelist): NodeTraverserInterface
40
    {
41 550
        $traverser = new NodeTraverser();
42 550
43
        $namespaceStatements = new NamespaceStmtCollection();
44 550
        $useStatements = new UseStmtCollection();
45
46 550
        $nameResolver = new FullyQualifiedNameResolver($namespaceStatements, $useStatements);
47
        $newNameResolver = new NameResolver(
48 550
            null,
49
            ['preserveOriginalNames' => true],
50 550
        );
51 550
52
        self::addVisitors(
53 550
            $traverser,
54 550
            [
55 550
                $newNameResolver,
56 550
                new NodeVisitor\ParentNodeAppender(),
57 550
58 550
                new NodeVisitor\NamespaceStmt\NamespaceStmtPrefixer(
59
                    $prefix,
60 550
                    $whitelist,
61 550
                    $namespaceStatements,
62
                ),
63 550
64
                new NodeVisitor\UseStmt\UseStmtCollector(
65
                    $namespaceStatements,
66
                    $useStatements,
67
                ),
68
                new NodeVisitor\UseStmt\UseStmtPrefixer(
69
                    $prefix,
70
                    $whitelist,
71
                    $this->reflector,
72
                ),
73
74
                new NodeVisitor\NamespaceStmt\FunctionIdentifierRecorder(
75
                    $prefix,
76
                    $nameResolver,
77
                    $whitelist,
78
                    $this->reflector,
79
                ),
80
                new NodeVisitor\ClassIdentifierRecorder(
81
                    $prefix,
82
                    $nameResolver,
83
                    $whitelist
84
                ),
85
                new NodeVisitor\NameStmtPrefixer(
86
                    $prefix,
87
                    $whitelist,
88
                    $namespaceStatements,
89
                    $useStatements,
90
                    $nameResolver,
91
                    $this->reflector,
92
                ),
93
                new NodeVisitor\StringScalarPrefixer(
94
                    $prefix,
95
                    $whitelist,
96
                    $this->reflector,
97
                ),
98
                new NodeVisitor\NewdocPrefixer(
99
                    $scoper,
100
                    $prefix,
101
                    $whitelist,
102
                ),
103
                new NodeVisitor\EvalPrefixer(
104
                    $scoper,
105
                    $prefix,
106
                    $whitelist,
107
                ),
108
109
                new NodeVisitor\ClassAliasStmtAppender(
110
                    $prefix,
111
                    $whitelist,
112
                    $nameResolver,
113
                ),
114
                new NodeVisitor\ConstStmtReplacer(
115
                    $whitelist,
116
                    $nameResolver,
117
                ),
118
            ],
119
        );
120
121
        return $traverser;
122
    }
123
124
    /**
125
     * @param PhpParserNodeVisitor[] $nodeVisitors
126
     */
127
    private static function addVisitors(
128
        NodeTraverserInterface $nodeTraverser,
129
        array $nodeVisitors
130
    ): void
131
    {
132
        foreach ($nodeVisitors as $nodeVisitor) {
133
            $nodeTraverser->addVisitor($nodeVisitor);
134
        }
135
    }
136
}
137