1+ <?php
2+
3+ declare (strict_types=1 );
4+
5+ namespace Smeghead \PhpVariableHardUsage \Command ;
6+
7+ use Smeghead \PhpVariableHardUsage \Analyze \VariableAnalyzer ;
8+ use Smeghead \PhpVariableHardUsage \Parse \VariableParser ;
9+
10+ final class ScopesCommand extends AbstractCommand
11+ {
12+ private string $ directory ;
13+
14+ public function __construct (string $ directory )
15+ {
16+ $ this ->directory = $ directory ;
17+ }
18+
19+ public function execute (): void
20+ {
21+ if (!is_dir ($ this ->directory )) {
22+ fwrite (STDERR , "Directory not found: {$ this ->directory }\n" );
23+ return ;
24+ }
25+
26+ $ phpFiles = $ this ->findPhpFiles ($ this ->directory );
27+ if (empty ($ phpFiles )) {
28+ fwrite (STDERR , "No PHP files found in: {$ this ->directory }\n" );
29+ return ;
30+ }
31+
32+ $ results = [];
33+ foreach ($ phpFiles as $ file ) {
34+ try {
35+ $ content = file_get_contents ($ file );
36+ if ($ content === false ) {
37+ fwrite (STDERR , "Failed to read file: {$ file }\n" );
38+ continue ;
39+ }
40+
41+ $ parser = new VariableParser ();
42+ $ parseResult = $ parser ->parse ($ content );
43+ $ analyzer = new VariableAnalyzer ($ file , $ parseResult ->functions );
44+ $ results [] = $ analyzer ->analyze ();
45+ } catch (\Exception $ e ) {
46+ fwrite (STDERR , "Error analyzing {$ file }: {$ e ->getMessage ()}\n" );
47+ }
48+ }
49+
50+ // 複数ファイルの結果をまとめて表示
51+ $ this ->printResults ($ results );
52+ }
53+
54+ /**
55+ * @return list<string>
56+ */
57+ private function findPhpFiles (string $ directory ): array
58+ {
59+ $ result = [];
60+ $ files = new \RecursiveIteratorIterator (
61+ new \RecursiveDirectoryIterator ($ directory , \RecursiveDirectoryIterator::SKIP_DOTS )
62+ );
63+
64+ /** @var \SplFileInfo $file */
65+ foreach ($ files as $ file ) {
66+ if ($ file ->isFile () && $ file ->getExtension () === 'php ' ) {
67+ $ result [] = $ file ->getPathname ();
68+ }
69+ }
70+
71+ return $ result ;
72+ }
73+
74+ /**
75+ * @param list<\Smeghead\PhpVariableHardUsage\Analyze\AnalysisResult> $results
76+ */
77+ private function printResults (array $ results ): void
78+ {
79+ // スコープベースのレポートを生成
80+ $ allScopes = [];
81+ foreach ($ results as $ result ) {
82+ foreach ($ result ->scopes as $ scope ) {
83+ $ allScopes [] = [
84+ 'file ' => $ result ->filename ,
85+ 'namespace ' => $ scope ->namespace ,
86+ 'name ' => $ scope ->name ,
87+ 'variableHardUsage ' => $ scope ->getVariableHardUsage ()
88+ ];
89+ }
90+ }
91+
92+ // 酷使度でソート
93+ usort ($ allScopes , function ($ a , $ b ) {
94+ return $ b ['variableHardUsage ' ] <=> $ a ['variableHardUsage ' ];
95+ });
96+
97+ // 結果を表示
98+ echo json_encode (['scopes ' => $ allScopes ], JSON_PRETTY_PRINT ) . PHP_EOL ;
99+ }
100+ }
0 commit comments