This repository was archived by the owner on Jan 16, 2023. It is now read-only.
-
Notifications
You must be signed in to change notification settings - Fork 5
Expand file tree
/
Copy pathStaticAnalyzer.php
More file actions
80 lines (75 loc) · 2.43 KB
/
StaticAnalyzer.php
File metadata and controls
80 lines (75 loc) · 2.43 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
<?php declare(strict_types=1);
namespace PHPVisualDebt;
use PhpParser\Error;
use PhpParser\NodeTraverser;
use PhpParser\NodeVisitor\NameResolver;
use PhpParser\Parser;
use PHPVisualDebt\Exception\ParseException;
use RecursiveDirectoryIterator;
use RecursiveIteratorIterator;
use RegexIterator;
final class StaticAnalyzer
{
/**
* @var Parser
*/
private $parser;
/**
* @var NodeTraverser
*/
private $traverser;
/**
* @var array|Questioner\AbstractQuestioner[]
*/
protected $questioners = [];
public function __construct(Parser $parser, NodeTraverser $traverser)
{
$this->parser = $parser;
$this->traverser = $traverser;
}
public function addQuestioner(Questioner\AbstractQuestioner $questioner)
{
$this->questioners[\get_class($questioner)] = $questioner;
}
public function analyze($directory) : array
{
$filesQuestions = [];
/** @var \SplFileInfo[] $files */
$files = new RegexIterator(
new RecursiveIteratorIterator(new RecursiveDirectoryIterator($directory)),
'/\.php$/'
);
$this->traverser->addVisitor(new NameResolver());
foreach ($this->questioners as $questioner) {
$this->traverser->addVisitor($questioner);
}
foreach ($files as $file) {
try {
$stmts = $this->parser->parse(\file_get_contents($file->getPathname()));
foreach ($this->questioners as $questioner) {
$questioner->setCurrentFileInfo($file);
}
$this->traverser->traverse($stmts);
} catch (Error $error) {
throw new ParseException($error->getMessage());
} finally {
foreach ($this->questioners as $questioner) {
if ($questioner->isSingleFileMode()) {
foreach ($questioner->getFileQuestions() as $fileQuestions) {
$filesQuestions[] = $fileQuestions;
}
}
}
}
}
foreach ($this->questioners as $questioner) {
if ($questioner->isPostAnalysisMode()) {
foreach ($questioner->getFileQuestions() as $fileQuestions) {
$filesQuestions[] = $fileQuestions;
}
}
}
//dump($filesQuestions);
return $filesQuestions;
}
}