Skip to content

Commit bc9301d

Browse files
committed
Result cache - reanalyse all files with errors when new symbol appears
1 parent 4c0cb98 commit bc9301d

15 files changed

+129
-33
lines changed

src/Analyser/AnalyserResult.php

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33
namespace PHPStan\Analyser;
44

55
use PHPStan\Collectors\CollectedData;
6-
use PHPStan\Dependency\ExportedNode;
6+
use PHPStan\Dependency\RootExportedNode;
77
use function usort;
88

99
class AnalyserResult
@@ -17,7 +17,7 @@ class AnalyserResult
1717
* @param CollectedData[] $collectedData
1818
* @param string[] $internalErrors
1919
* @param array<string, array<string>>|null $dependencies
20-
* @param array<string, array<ExportedNode>> $exportedNodes
20+
* @param array<string, array<RootExportedNode>> $exportedNodes
2121
*/
2222
public function __construct(
2323
private array $errors,
@@ -85,7 +85,7 @@ public function getDependencies(): ?array
8585
}
8686

8787
/**
88-
* @return array<string, array<ExportedNode>>
88+
* @return array<string, array<RootExportedNode>>
8989
*/
9090
public function getExportedNodes(): array
9191
{

src/Analyser/FileAnalyserResult.php

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33
namespace PHPStan\Analyser;
44

55
use PHPStan\Collectors\CollectedData;
6-
use PHPStan\Dependency\ExportedNode;
6+
use PHPStan\Dependency\RootExportedNode;
77

88
class FileAnalyserResult
99
{
@@ -12,7 +12,7 @@ class FileAnalyserResult
1212
* @param Error[] $errors
1313
* @param CollectedData[] $collectedData
1414
* @param array<int, string> $dependencies
15-
* @param array<int, ExportedNode> $exportedNodes
15+
* @param array<int, RootExportedNode> $exportedNodes
1616
*/
1717
public function __construct(
1818
private array $errors,
@@ -48,7 +48,7 @@ public function getDependencies(): array
4848
}
4949

5050
/**
51-
* @return array<int, ExportedNode>
51+
* @return array<int, RootExportedNode>
5252
*/
5353
public function getExportedNodes(): array
5454
{

src/Analyser/ResultCache/ResultCache.php

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

55
use PHPStan\Analyser\Error;
66
use PHPStan\Collectors\CollectedData;
7-
use PHPStan\Dependency\ExportedNode;
7+
use PHPStan\Dependency\RootExportedNode;
88

99
class ResultCache
1010
{
@@ -15,7 +15,7 @@ class ResultCache
1515
* @param array<string, array<Error>> $errors
1616
* @param array<string, array<CollectedData>> $collectedData
1717
* @param array<string, array<string>> $dependencies
18-
* @param array<string, array<ExportedNode>> $exportedNodes
18+
* @param array<string, array<RootExportedNode>> $exportedNodes
1919
*/
2020
public function __construct(
2121
private array $filesToAnalyse,
@@ -81,7 +81,7 @@ public function getDependencies(): array
8181
}
8282

8383
/**
84-
* @return array<string, array<ExportedNode>>
84+
* @return array<string, array<RootExportedNode>>
8585
*/
8686
public function getExportedNodes(): array
8787
{

src/Analyser/ResultCache/ResultCacheManager.php

Lines changed: 29 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -8,8 +8,8 @@
88
use PHPStan\Analyser\Error;
99
use PHPStan\Collectors\CollectedData;
1010
use PHPStan\Command\Output;
11-
use PHPStan\Dependency\ExportedNode;
1211
use PHPStan\Dependency\ExportedNodeFetcher;
12+
use PHPStan\Dependency\RootExportedNode;
1313
use PHPStan\File\FileFinder;
1414
use PHPStan\File\FileReader;
1515
use PHPStan\File\FileWriter;
@@ -225,11 +225,13 @@ public function restore(array $allAnalysedFiles, bool $debug, bool $onlyFiles, ?
225225
}
226226

227227
$cachedFileExportedNodes = $filteredExportedNodes[$analysedFile];
228-
if (count($dependentFiles) === 0) {
228+
$exportedNodesChanged = $this->exportedNodesChanged($analysedFile, $cachedFileExportedNodes);
229+
if ($exportedNodesChanged === null) {
229230
continue;
230231
}
231-
if (!$this->exportedNodesChanged($analysedFile, $cachedFileExportedNodes)) {
232-
continue;
232+
233+
if ($exportedNodesChanged) {
234+
$newFileAppeared = true;
233235
}
234236

235237
foreach ($dependentFiles as $dependentFile) {
@@ -279,26 +281,42 @@ private function isMetaDifferent(array $cachedMeta, array $currentMeta): bool
279281
}
280282

281283
/**
282-
* @param array<int, ExportedNode> $cachedFileExportedNodes
284+
* @param array<int, RootExportedNode> $cachedFileExportedNodes
285+
* @return bool|null null means nothing changed, true means new root symbol appeared, false means nested node changed
283286
*/
284-
private function exportedNodesChanged(string $analysedFile, array $cachedFileExportedNodes): bool
287+
private function exportedNodesChanged(string $analysedFile, array $cachedFileExportedNodes): ?bool
285288
{
286289
if (array_key_exists($analysedFile, $this->fileReplacements)) {
287290
$analysedFile = $this->fileReplacements[$analysedFile];
288291
}
289292
$fileExportedNodes = $this->exportedNodeFetcher->fetchNodes($analysedFile);
293+
294+
$cachedSymbols = [];
295+
foreach ($cachedFileExportedNodes as $cachedFileExportedNode) {
296+
$cachedSymbols[$cachedFileExportedNode->getType()][] = $cachedFileExportedNode->getName();
297+
}
298+
299+
$fileSymbols = [];
300+
foreach ($fileExportedNodes as $fileExportedNode) {
301+
$fileSymbols[$fileExportedNode->getType()][] = $fileExportedNode->getName();
302+
}
303+
304+
if ($cachedSymbols !== $fileSymbols) {
305+
return true;
306+
}
307+
290308
if (count($fileExportedNodes) !== count($cachedFileExportedNodes)) {
291309
return true;
292310
}
293311

294312
foreach ($fileExportedNodes as $i => $fileExportedNode) {
295313
$cachedExportedNode = $cachedFileExportedNodes[$i];
296314
if (!$cachedExportedNode->equals($fileExportedNode)) {
297-
return true;
315+
return false;
298316
}
299317
}
300318

301-
return false;
319+
return null;
302320
}
303321

304322
/**
@@ -487,8 +505,8 @@ private function mergeDependencies(ResultCache $resultCache, ?array $freshDepend
487505
}
488506

489507
/**
490-
* @param array<string, array<ExportedNode>> $freshExportedNodes
491-
* @return array<string, array<ExportedNode>>
508+
* @param array<string, array<RootExportedNode>> $freshExportedNodes
509+
* @return array<string, array<RootExportedNode>>
492510
*/
493511
private function mergeExportedNodes(ResultCache $resultCache, array $freshExportedNodes): array
494512
{
@@ -509,7 +527,7 @@ private function mergeExportedNodes(ResultCache $resultCache, array $freshExport
509527
* @param array<string, array<Error>> $errors
510528
* @param array<string, array<CollectedData>> $collectedData
511529
* @param array<string, array<string>> $dependencies
512-
* @param array<string, array<ExportedNode>> $exportedNodes
530+
* @param array<string, array<RootExportedNode>> $exportedNodes
513531
* @param mixed[] $meta
514532
*/
515533
private function save(

src/Dependency/ExportedNode/ExportedClassNode.php

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,12 +4,13 @@
44

55
use JsonSerializable;
66
use PHPStan\Dependency\ExportedNode;
7+
use PHPStan\Dependency\RootExportedNode;
78
use PHPStan\ShouldNotHappenException;
89
use ReturnTypeWillChange;
910
use function array_map;
1011
use function count;
1112

12-
class ExportedClassNode implements ExportedNode, JsonSerializable
13+
class ExportedClassNode implements RootExportedNode, JsonSerializable
1314
{
1415

1516
/**
@@ -170,4 +171,14 @@ public static function decode(array $data): ExportedNode
170171
);
171172
}
172173

174+
public function getType(): string
175+
{
176+
return self::TYPE_CLASS;
177+
}
178+
179+
public function getName(): string
180+
{
181+
return $this->name;
182+
}
183+
173184
}

src/Dependency/ExportedNode/ExportedEnumNode.php

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,12 +4,13 @@
44

55
use JsonSerializable;
66
use PHPStan\Dependency\ExportedNode;
7+
use PHPStan\Dependency\RootExportedNode;
78
use PHPStan\ShouldNotHappenException;
89
use ReturnTypeWillChange;
910
use function array_map;
1011
use function count;
1112

12-
class ExportedEnumNode implements ExportedNode, JsonSerializable
13+
class ExportedEnumNode implements RootExportedNode, JsonSerializable
1314
{
1415

1516
/**
@@ -133,4 +134,14 @@ public static function decode(array $data): ExportedNode
133134
);
134135
}
135136

137+
public function getType(): string
138+
{
139+
return self::TYPE_ENUM;
140+
}
141+
142+
public function getName(): string
143+
{
144+
return $this->name;
145+
}
146+
136147
}

src/Dependency/ExportedNode/ExportedFunctionNode.php

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,12 +4,13 @@
44

55
use JsonSerializable;
66
use PHPStan\Dependency\ExportedNode;
7+
use PHPStan\Dependency\RootExportedNode;
78
use PHPStan\ShouldNotHappenException;
89
use ReturnTypeWillChange;
910
use function array_map;
1011
use function count;
1112

12-
class ExportedFunctionNode implements ExportedNode, JsonSerializable
13+
class ExportedFunctionNode implements RootExportedNode, JsonSerializable
1314
{
1415

1516
/**
@@ -132,4 +133,14 @@ public static function decode(array $data): ExportedNode
132133
);
133134
}
134135

136+
public function getType(): string
137+
{
138+
return self::TYPE_FUNCTION;
139+
}
140+
141+
public function getName(): string
142+
{
143+
return $this->name;
144+
}
145+
135146
}

src/Dependency/ExportedNode/ExportedInterfaceNode.php

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,11 +4,12 @@
44

55
use JsonSerializable;
66
use PHPStan\Dependency\ExportedNode;
7+
use PHPStan\Dependency\RootExportedNode;
78
use ReturnTypeWillChange;
89
use function array_map;
910
use function count;
1011

11-
class ExportedInterfaceNode implements ExportedNode, JsonSerializable
12+
class ExportedInterfaceNode implements RootExportedNode, JsonSerializable
1213
{
1314

1415
/**
@@ -102,4 +103,14 @@ public static function decode(array $data): ExportedNode
102103
);
103104
}
104105

106+
public function getType(): string
107+
{
108+
return self::TYPE_INTERFACE;
109+
}
110+
111+
public function getName(): string
112+
{
113+
return $this->name;
114+
}
115+
105116
}

src/Dependency/ExportedNode/ExportedTraitNode.php

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,9 +4,10 @@
44

55
use JsonSerializable;
66
use PHPStan\Dependency\ExportedNode;
7+
use PHPStan\Dependency\RootExportedNode;
78
use ReturnTypeWillChange;
89

9-
class ExportedTraitNode implements ExportedNode, JsonSerializable
10+
class ExportedTraitNode implements RootExportedNode, JsonSerializable
1011
{
1112

1213
public function __construct(private string $traitName)
@@ -50,4 +51,14 @@ public function jsonSerialize()
5051
];
5152
}
5253

54+
public function getType(): string
55+
{
56+
return self::TYPE_TRAIT;
57+
}
58+
59+
public function getName(): string
60+
{
61+
return $this->traitName;
62+
}
63+
5364
}

src/Dependency/ExportedNodeFetcher.php

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@ public function __construct(
1818
}
1919

2020
/**
21-
* @return ExportedNode[]
21+
* @return RootExportedNode[]
2222
*/
2323
public function fetchNodes(string $fileName): array
2424
{

0 commit comments

Comments
 (0)