Passed
Pull Request — master (#555)
by Théo
02:04
created

TraverserFactory   A

Complexity

Total Complexity 4

Size/Duplication

Total Lines 97
Duplicated Lines 0 %

Test Coverage

Coverage 100%

Importance

Changes 7
Bugs 0 Features 0
Metric Value
eloc 58
c 7
b 0
f 0
dl 0
loc 97
rs 10
ccs 20
cts 20
cp 1
wmc 4

3 Methods

Rating   Name   Duplication   Size   Complexity  
A __construct() 0 3 1
A addVisitors() 0 7 2
A create() 0 76 1
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\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 NameResolver(
47
            null,
48 550
            ['preserveOriginalNames' => true],
49
        );
50 550
        $identifierResolver = new IdentifierResolver($nameResolver);
51 550
        $stringNodePrefixer = new StringNodePrefixer($scoper);
52
53 550
        self::addVisitors(
54 550
            $traverser,
55 550
            [
56 550
                $nameResolver,
57 550
                new NodeVisitor\ParentNodeAppender(),
58 550
                new NodeVisitor\IdentifierNameAppender($identifierResolver),
59
60 550
                new NodeVisitor\NamespaceStmt\NamespaceStmtPrefixer(
61 550
                    $prefix,
62
                    $whitelist,
63 550
                    $namespaceStatements,
64
                ),
65
66
                new NodeVisitor\UseStmt\UseStmtCollector(
67
                    $namespaceStatements,
68
                    $useStatements,
69
                ),
70
                new NodeVisitor\UseStmt\UseStmtPrefixer(
71
                    $prefix,
72
                    $whitelist,
73
                    $this->reflector,
74
                ),
75
76
                new NodeVisitor\NamespaceStmt\FunctionIdentifierRecorder(
77
                    $prefix,
78
                    $identifierResolver,
79
                    $whitelist,
80
                    $this->reflector,
81
                ),
82
                new NodeVisitor\ClassIdentifierRecorder(
83
                    $prefix,
84
                    $identifierResolver,
85
                    $whitelist
86
                ),
87
                new NodeVisitor\NameStmtPrefixer(
88
                    $prefix,
89
                    $whitelist,
90
                    $namespaceStatements,
91
                    $useStatements,
92
                    $this->reflector,
93
                ),
94
                new NodeVisitor\StringScalarPrefixer(
95
                    $prefix,
96
                    $whitelist,
97
                    $this->reflector,
98
                ),
99
                new NodeVisitor\NewdocPrefixer($stringNodePrefixer),
100
                new NodeVisitor\EvalPrefixer($stringNodePrefixer),
101
102
                new NodeVisitor\ClassAliasStmtAppender(
103
                    $prefix,
104
                    $whitelist,
105
                    $identifierResolver,
106
                ),
107
                new NodeVisitor\ConstStmtReplacer(
108
                    $whitelist,
109
                    $identifierResolver,
110
                ),
111
            ],
112
        );
113
114
        return $traverser;
115
    }
116
117
    /**
118
     * @param PhpParserNodeVisitor[] $nodeVisitors
119
     */
120
    private static function addVisitors(
121
        NodeTraverserInterface $nodeTraverser,
122
        array $nodeVisitors
123
    ): void
124
    {
125
        foreach ($nodeVisitors as $nodeVisitor) {
126
            $nodeTraverser->addVisitor($nodeVisitor);
127
        }
128
    }
129
}
130