Skip to content

Commit b13181e

Browse files
committed
Result cache - fix handling deleted files
1 parent 526bb0d commit b13181e

File tree

2 files changed

+51
-1
lines changed

2 files changed

+51
-1
lines changed

src/Analyser/ResultCache/ResultCacheManager.php

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -88,20 +88,25 @@ public function restore(array $allAnalysedFiles, bool $debug): ResultCache
8888
}
8989

9090
$invertedDependencies = $data['dependencies'];
91+
$deletedFiles = array_fill_keys(array_keys($invertedDependencies), true);
9192
$filesToAnalyse = [];
9293
$invertedDependenciesToReturn = [];
9394
$errors = $data['errors'];
9495
$filteredErrors = [];
96+
$newFileAppeared = false;
9597
foreach ($allAnalysedFiles as $analysedFile) {
9698
if (array_key_exists($analysedFile, $errors)) {
9799
$filteredErrors[$analysedFile] = $errors[$analysedFile];
98100
}
99101
if (!array_key_exists($analysedFile, $invertedDependencies)) {
100102
// new file
101103
$filesToAnalyse[] = $analysedFile;
104+
$newFileAppeared = true;
102105
continue;
103106
}
104107

108+
unset($deletedFiles[$analysedFile]);
109+
105110
$analysedFileData = $invertedDependencies[$analysedFile];
106111
$cachedModifiedTime = $analysedFileData['modifiedTime'];
107112
$dependentFiles = $analysedFileData['dependentFiles'];
@@ -124,6 +129,27 @@ public function restore(array $allAnalysedFiles, bool $debug): ResultCache
124129
}
125130
}
126131

132+
foreach (array_keys($deletedFiles) as $deletedFile) {
133+
if (!array_key_exists($deletedFile, $invertedDependencies)) {
134+
continue;
135+
}
136+
137+
$deletedFileData = $invertedDependencies[$deletedFile];
138+
$dependentFiles = $deletedFileData['dependentFiles'];
139+
foreach ($dependentFiles as $dependentFile) {
140+
if (!is_file($dependentFile)) {
141+
continue;
142+
}
143+
$filesToAnalyse[] = $dependentFile;
144+
}
145+
}
146+
147+
if ($newFileAppeared) {
148+
foreach (array_keys($filteredErrors) as $fileWithError) {
149+
$filesToAnalyse[] = $fileWithError;
150+
}
151+
}
152+
127153
return new ResultCache(array_unique($filesToAnalyse), false, $data['lastFullAnalysisTime'], $filteredErrors, $invertedDependenciesToReturn);
128154
}
129155

tests/e2e/ResultCacheEndToEndTest.php

Lines changed: 25 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,11 @@
1212
class ResultCacheEndToEndTest extends TestCase
1313
{
1414

15+
public function setUp(): void
16+
{
17+
chdir(__DIR__ . '/PHP-Parser');
18+
}
19+
1520
public function tearDown(): void
1621
{
1722
exec(sprintf('git -C %s reset --hard 2>&1', escapeshellarg(__DIR__ . '/PHP-Parser')), $outputLines, $exitCode);
@@ -24,7 +29,6 @@ public function tearDown(): void
2429

2530
public function testResultCache(): void
2631
{
27-
chdir(__DIR__ . '/PHP-Parser');
2832
$this->runPhpstan(0);
2933
$this->assertResultCache(__DIR__ . '/resultCache_1.php');
3034

@@ -69,6 +73,26 @@ private function runPhpstanWithErrors(): void
6973
$this->assertResultCache(__DIR__ . '/resultCache_2.php');
7074
}
7175

76+
public function testResultCacheDeleteFile(): void
77+
{
78+
$this->runPhpstan(0);
79+
$this->assertResultCache(__DIR__ . '/resultCache_1.php');
80+
81+
$serializerPath = __DIR__ . '/PHP-Parser/lib/PhpParser/Serializer.php';
82+
$serializerCode = FileReader::read($serializerPath);
83+
$originalSerializerCode = $serializerCode;
84+
unlink($serializerPath);
85+
86+
$result = $this->runPhpstan(1);
87+
$this->assertSame(1, $result['totals']['file_errors']);
88+
$this->assertSame(0, $result['totals']['errors']);
89+
$this->assertSame('Reflection error: PhpParser\Serializer not found.', $result['files'][__DIR__ . '/PHP-Parser/lib/PhpParser/Serializer/XML.php']['messages'][0]['message']);
90+
91+
file_put_contents($serializerPath, $originalSerializerCode);
92+
$this->runPhpstan(0);
93+
$this->assertResultCache(__DIR__ . '/resultCache_1.php');
94+
}
95+
7296
/**
7397
* @param int $expectedExitCode
7498
* @return mixed[]

0 commit comments

Comments
 (0)