Skip to content

Commit 38b6fe5

Browse files
committed
fix: reduce VHU(Variable Hard Usage)
1 parent 9f30b8d commit 38b6fe5

File tree

2 files changed

+37
-17
lines changed

2 files changed

+37
-17
lines changed

src/Command/ScopesCommand.php

Lines changed: 29 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,9 @@
44

55
namespace Smeghead\PhpVariableHardUsage\Command;
66

7+
use Smeghead\PhpVariableHardUsage\Analyze\AnalysisResult;
78
use Smeghead\PhpVariableHardUsage\Analyze\VariableAnalyzer;
9+
use Smeghead\PhpVariableHardUsage\Parse\Exception\ParseFailedException;
810
use Smeghead\PhpVariableHardUsage\Parse\VariableParser;
911

1012
final class ScopesCommand extends AbstractCommand
@@ -20,12 +22,16 @@ public function __construct(array $paths)
2022
$this->paths = $paths;
2123
}
2224

23-
public function execute(): int
25+
/**
26+
* @param list<string> $paths
27+
* @return list<string>
28+
*/
29+
private function pickupPhpFiles(array $paths): array
2430
{
2531
$phpFiles = [];
2632

2733
// 各パスを処理
28-
foreach ($this->paths as $path) {
34+
foreach ($paths as $path) {
2935
if (is_dir($path)) {
3036
// ディレクトリの場合は再帰的にPHPファイルを収集
3137
$dirFiles = $this->findPhpFiles($path);
@@ -38,6 +44,26 @@ public function execute(): int
3844
}
3945
}
4046

47+
return $phpFiles;
48+
}
49+
50+
private function analyzeFile(string $file): AnalysisResult
51+
{
52+
$parser = new VariableParser();
53+
$content = file_get_contents($file);
54+
if ($content === false) {
55+
throw new ParseFailedException("Failed to read file: {$file}");
56+
}
57+
58+
$parseResult = $parser->parse($content);
59+
$analyzer = new VariableAnalyzer($file, $parseResult->functions);
60+
return $analyzer->analyze();
61+
}
62+
63+
public function execute(): int
64+
{
65+
$phpFiles = $this->pickupPhpFiles($this->paths);
66+
4167
if (empty($phpFiles)) {
4268
fwrite(STDERR, "No PHP files found in specified paths\n");
4369
return 1;
@@ -51,17 +77,7 @@ public function execute(): int
5177

5278
foreach ($phpFiles as $file) {
5379
try {
54-
$content = file_get_contents($file);
55-
if ($content === false) {
56-
fwrite(STDERR, "Failed to read file: {$file}\n");
57-
$hasErrors = true;
58-
continue;
59-
}
60-
61-
$parser = new VariableParser();
62-
$parseResult = $parser->parse($content);
63-
$analyzer = new VariableAnalyzer($file, $parseResult->functions);
64-
$results[] = $analyzer->analyze();
80+
$results[] = $this->analyzeFile($file);
6581
} catch (\Exception $e) {
6682
fwrite(STDERR, "Error analyzing {$file}: {$e->getMessage()}\n");
6783
$hasErrors = true;

src/Parse/VariableParser.php

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66

77
use PhpParser\Node\Expr\Variable;
88
use PhpParser\Node\FunctionLike;
9+
use PhpParser\Node\InterpolatedStringPart;
910
use PhpParser\Node\Scalar\InterpolatedString;
1011
use PhpParser\NodeFinder;
1112
use PhpParser\NodeTraverser;
@@ -66,7 +67,7 @@ private function collectParseResultPerFunctionLike(array $functionLikes): array
6667
$variables = $this->nodeFinder->findInstanceOf($function, Variable::class);
6768
foreach ($variables as $variable) {
6869
$assigned = $variable->getAttribute('assigned');
69-
$func->addVariable(new VarReference($this->getVariableName($variable), $variable->getLine(), $assigned === true)); // @phpstan-ignore-line
70+
$func->addVariable(new VarReference($this->getVariableName($variable), $variable->getLine(), $assigned === true));
7071
}
7172
return $func;
7273
}, $functionLikes);
@@ -78,11 +79,14 @@ private function getVariableName(Variable $variable): string
7879
$parts = $variable->name->parts;
7980
return sprintf('${"%s"}', implode('', array_map(function($part){
8081
if ($part instanceof Variable) {
81-
return sprintf('{$%s}', $part->name);
82+
return sprintf('{$%s}', $part->name->name ?? $part->name);
83+
} else if ($part instanceof InterpolatedStringPart) {
84+
return $part->value;
85+
} else {
86+
return '';
8287
}
83-
return $part->value;
8488
}, $parts)));
8589
}
86-
return $variable->name;
90+
return $variable->name->name ?? $variable->name;
8791
}
8892
}

0 commit comments

Comments
 (0)