Skip to content

Commit

Permalink
Result cache - reanalyse all files with errors when new symbol appears
Browse files Browse the repository at this point in the history
  • Loading branch information
ondrejmirtes committed Oct 20, 2022
1 parent 4c0cb98 commit bc9301d
Show file tree
Hide file tree
Showing 15 changed files with 129 additions and 33 deletions.
6 changes: 3 additions & 3 deletions src/Analyser/AnalyserResult.php
Expand Up @@ -3,7 +3,7 @@
namespace PHPStan\Analyser;

use PHPStan\Collectors\CollectedData;
use PHPStan\Dependency\ExportedNode;
use PHPStan\Dependency\RootExportedNode;
use function usort;

class AnalyserResult
Expand All @@ -17,7 +17,7 @@ class AnalyserResult
* @param CollectedData[] $collectedData
* @param string[] $internalErrors
* @param array<string, array<string>>|null $dependencies
* @param array<string, array<ExportedNode>> $exportedNodes
* @param array<string, array<RootExportedNode>> $exportedNodes
*/
public function __construct(
private array $errors,
Expand Down Expand Up @@ -85,7 +85,7 @@ public function getDependencies(): ?array
}

/**
* @return array<string, array<ExportedNode>>
* @return array<string, array<RootExportedNode>>
*/
public function getExportedNodes(): array
{
Expand Down
6 changes: 3 additions & 3 deletions src/Analyser/FileAnalyserResult.php
Expand Up @@ -3,7 +3,7 @@
namespace PHPStan\Analyser;

use PHPStan\Collectors\CollectedData;
use PHPStan\Dependency\ExportedNode;
use PHPStan\Dependency\RootExportedNode;

class FileAnalyserResult
{
Expand All @@ -12,7 +12,7 @@ class FileAnalyserResult
* @param Error[] $errors
* @param CollectedData[] $collectedData
* @param array<int, string> $dependencies
* @param array<int, ExportedNode> $exportedNodes
* @param array<int, RootExportedNode> $exportedNodes
*/
public function __construct(
private array $errors,
Expand Down Expand Up @@ -48,7 +48,7 @@ public function getDependencies(): array
}

/**
* @return array<int, ExportedNode>
* @return array<int, RootExportedNode>
*/
public function getExportedNodes(): array
{
Expand Down
6 changes: 3 additions & 3 deletions src/Analyser/ResultCache/ResultCache.php
Expand Up @@ -4,7 +4,7 @@

use PHPStan\Analyser\Error;
use PHPStan\Collectors\CollectedData;
use PHPStan\Dependency\ExportedNode;
use PHPStan\Dependency\RootExportedNode;

class ResultCache
{
Expand All @@ -15,7 +15,7 @@ class ResultCache
* @param array<string, array<Error>> $errors
* @param array<string, array<CollectedData>> $collectedData
* @param array<string, array<string>> $dependencies
* @param array<string, array<ExportedNode>> $exportedNodes
* @param array<string, array<RootExportedNode>> $exportedNodes
*/
public function __construct(
private array $filesToAnalyse,
Expand Down Expand Up @@ -81,7 +81,7 @@ public function getDependencies(): array
}

/**
* @return array<string, array<ExportedNode>>
* @return array<string, array<RootExportedNode>>
*/
public function getExportedNodes(): array
{
Expand Down
40 changes: 29 additions & 11 deletions src/Analyser/ResultCache/ResultCacheManager.php
Expand Up @@ -8,8 +8,8 @@
use PHPStan\Analyser\Error;
use PHPStan\Collectors\CollectedData;
use PHPStan\Command\Output;
use PHPStan\Dependency\ExportedNode;
use PHPStan\Dependency\ExportedNodeFetcher;
use PHPStan\Dependency\RootExportedNode;
use PHPStan\File\FileFinder;
use PHPStan\File\FileReader;
use PHPStan\File\FileWriter;
Expand Down Expand Up @@ -225,11 +225,13 @@ public function restore(array $allAnalysedFiles, bool $debug, bool $onlyFiles, ?
}

$cachedFileExportedNodes = $filteredExportedNodes[$analysedFile];
if (count($dependentFiles) === 0) {
$exportedNodesChanged = $this->exportedNodesChanged($analysedFile, $cachedFileExportedNodes);
if ($exportedNodesChanged === null) {
continue;
}
if (!$this->exportedNodesChanged($analysedFile, $cachedFileExportedNodes)) {
continue;

if ($exportedNodesChanged) {
$newFileAppeared = true;
}

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

/**
* @param array<int, ExportedNode> $cachedFileExportedNodes
* @param array<int, RootExportedNode> $cachedFileExportedNodes
* @return bool|null null means nothing changed, true means new root symbol appeared, false means nested node changed
*/
private function exportedNodesChanged(string $analysedFile, array $cachedFileExportedNodes): bool
private function exportedNodesChanged(string $analysedFile, array $cachedFileExportedNodes): ?bool
{
if (array_key_exists($analysedFile, $this->fileReplacements)) {
$analysedFile = $this->fileReplacements[$analysedFile];
}
$fileExportedNodes = $this->exportedNodeFetcher->fetchNodes($analysedFile);

$cachedSymbols = [];
foreach ($cachedFileExportedNodes as $cachedFileExportedNode) {
$cachedSymbols[$cachedFileExportedNode->getType()][] = $cachedFileExportedNode->getName();
}

$fileSymbols = [];
foreach ($fileExportedNodes as $fileExportedNode) {
$fileSymbols[$fileExportedNode->getType()][] = $fileExportedNode->getName();
}

if ($cachedSymbols !== $fileSymbols) {
return true;
}

if (count($fileExportedNodes) !== count($cachedFileExportedNodes)) {
return true;
}

foreach ($fileExportedNodes as $i => $fileExportedNode) {
$cachedExportedNode = $cachedFileExportedNodes[$i];
if (!$cachedExportedNode->equals($fileExportedNode)) {
return true;
return false;
}
}

return false;
return null;
}

/**
Expand Down Expand Up @@ -487,8 +505,8 @@ private function mergeDependencies(ResultCache $resultCache, ?array $freshDepend
}

/**
* @param array<string, array<ExportedNode>> $freshExportedNodes
* @return array<string, array<ExportedNode>>
* @param array<string, array<RootExportedNode>> $freshExportedNodes
* @return array<string, array<RootExportedNode>>
*/
private function mergeExportedNodes(ResultCache $resultCache, array $freshExportedNodes): array
{
Expand All @@ -509,7 +527,7 @@ private function mergeExportedNodes(ResultCache $resultCache, array $freshExport
* @param array<string, array<Error>> $errors
* @param array<string, array<CollectedData>> $collectedData
* @param array<string, array<string>> $dependencies
* @param array<string, array<ExportedNode>> $exportedNodes
* @param array<string, array<RootExportedNode>> $exportedNodes
* @param mixed[] $meta
*/
private function save(
Expand Down
13 changes: 12 additions & 1 deletion src/Dependency/ExportedNode/ExportedClassNode.php
Expand Up @@ -4,12 +4,13 @@

use JsonSerializable;
use PHPStan\Dependency\ExportedNode;
use PHPStan\Dependency\RootExportedNode;
use PHPStan\ShouldNotHappenException;
use ReturnTypeWillChange;
use function array_map;
use function count;

class ExportedClassNode implements ExportedNode, JsonSerializable
class ExportedClassNode implements RootExportedNode, JsonSerializable
{

/**
Expand Down Expand Up @@ -170,4 +171,14 @@ public static function decode(array $data): ExportedNode
);
}

public function getType(): string
{
return self::TYPE_CLASS;
}

public function getName(): string
{
return $this->name;
}

}
13 changes: 12 additions & 1 deletion src/Dependency/ExportedNode/ExportedEnumNode.php
Expand Up @@ -4,12 +4,13 @@

use JsonSerializable;
use PHPStan\Dependency\ExportedNode;
use PHPStan\Dependency\RootExportedNode;
use PHPStan\ShouldNotHappenException;
use ReturnTypeWillChange;
use function array_map;
use function count;

class ExportedEnumNode implements ExportedNode, JsonSerializable
class ExportedEnumNode implements RootExportedNode, JsonSerializable
{

/**
Expand Down Expand Up @@ -133,4 +134,14 @@ public static function decode(array $data): ExportedNode
);
}

public function getType(): string
{
return self::TYPE_ENUM;
}

public function getName(): string
{
return $this->name;
}

}
13 changes: 12 additions & 1 deletion src/Dependency/ExportedNode/ExportedFunctionNode.php
Expand Up @@ -4,12 +4,13 @@

use JsonSerializable;
use PHPStan\Dependency\ExportedNode;
use PHPStan\Dependency\RootExportedNode;
use PHPStan\ShouldNotHappenException;
use ReturnTypeWillChange;
use function array_map;
use function count;

class ExportedFunctionNode implements ExportedNode, JsonSerializable
class ExportedFunctionNode implements RootExportedNode, JsonSerializable
{

/**
Expand Down Expand Up @@ -132,4 +133,14 @@ public static function decode(array $data): ExportedNode
);
}

public function getType(): string
{
return self::TYPE_FUNCTION;
}

public function getName(): string
{
return $this->name;
}

}
13 changes: 12 additions & 1 deletion src/Dependency/ExportedNode/ExportedInterfaceNode.php
Expand Up @@ -4,11 +4,12 @@

use JsonSerializable;
use PHPStan\Dependency\ExportedNode;
use PHPStan\Dependency\RootExportedNode;
use ReturnTypeWillChange;
use function array_map;
use function count;

class ExportedInterfaceNode implements ExportedNode, JsonSerializable
class ExportedInterfaceNode implements RootExportedNode, JsonSerializable
{

/**
Expand Down Expand Up @@ -102,4 +103,14 @@ public static function decode(array $data): ExportedNode
);
}

public function getType(): string
{
return self::TYPE_INTERFACE;
}

public function getName(): string
{
return $this->name;
}

}
13 changes: 12 additions & 1 deletion src/Dependency/ExportedNode/ExportedTraitNode.php
Expand Up @@ -4,9 +4,10 @@

use JsonSerializable;
use PHPStan\Dependency\ExportedNode;
use PHPStan\Dependency\RootExportedNode;
use ReturnTypeWillChange;

class ExportedTraitNode implements ExportedNode, JsonSerializable
class ExportedTraitNode implements RootExportedNode, JsonSerializable
{

public function __construct(private string $traitName)
Expand Down Expand Up @@ -50,4 +51,14 @@ public function jsonSerialize()
];
}

public function getType(): string
{
return self::TYPE_TRAIT;
}

public function getName(): string
{
return $this->traitName;
}

}
2 changes: 1 addition & 1 deletion src/Dependency/ExportedNodeFetcher.php
Expand Up @@ -18,7 +18,7 @@ public function __construct(
}

/**
* @return ExportedNode[]
* @return RootExportedNode[]
*/
public function fetchNodes(string $fileName): array
{
Expand Down
2 changes: 1 addition & 1 deletion src/Dependency/ExportedNodeResolver.php
Expand Up @@ -35,7 +35,7 @@ public function __construct(private FileTypeMapper $fileTypeMapper, private Expr
{
}

public function resolve(string $fileName, Node $node): ?ExportedNode
public function resolve(string $fileName, Node $node): ?RootExportedNode
{
if ($node instanceof Class_ && isset($node->namespacedName)) {
$docComment = $node->getDocComment();
Expand Down
4 changes: 2 additions & 2 deletions src/Dependency/ExportedNodeVisitor.php
Expand Up @@ -12,7 +12,7 @@ class ExportedNodeVisitor extends NodeVisitorAbstract

private ?string $fileName = null;

/** @var ExportedNode[] */
/** @var RootExportedNode[] */
private array $currentNodes = [];

/**
Expand All @@ -30,7 +30,7 @@ public function reset(string $fileName): void
}

/**
* @return ExportedNode[]
* @return RootExportedNode[]
*/
public function getExportedNodes(): array
{
Expand Down
4 changes: 2 additions & 2 deletions src/Dependency/NodeDependencies.php
Expand Up @@ -16,7 +16,7 @@ class NodeDependencies
public function __construct(
private FileHelper $fileHelper,
private array $reflections,
private ?ExportedNode $exportedNode,
private ?RootExportedNode $exportedNode,
)
{
}
Expand Down Expand Up @@ -50,7 +50,7 @@ public function getFileDependencies(string $currentFile, array $analysedFiles):
return array_values($dependencies);
}

public function getExportedNode(): ?ExportedNode
public function getExportedNode(): ?RootExportedNode
{
return $this->exportedNode;
}
Expand Down
23 changes: 23 additions & 0 deletions src/Dependency/RootExportedNode.php
@@ -0,0 +1,23 @@
<?php declare(strict_types = 1);

namespace PHPStan\Dependency;

interface RootExportedNode extends ExportedNode
{

public const TYPE_CLASS = 'class';

public const TYPE_INTERFACE = 'interface';

public const TYPE_ENUM = 'enum';

public const TYPE_TRAIT = 'trait';

public const TYPE_FUNCTION = 'function';

/** @return self::TYPE_* */
public function getType(): string;

public function getName(): string;

}

0 comments on commit bc9301d

Please sign in to comment.