diff --git a/conf/config.neon b/conf/config.neon index 54f4ff3186..e764d064eb 100644 --- a/conf/config.neon +++ b/conf/config.neon @@ -189,6 +189,19 @@ parameters: - '1.1.1.2' tmpDir: %sysGetTempDir%/phpstan-fixer __validate: true + parametersNotInvalidatingCache: + - parameters.editorUrl + - parameters.editorUrlTitle + - parameters.errorFormat + - parameters.ignoreErrors + - parameters.reportUnmatchedIgnoredErrors + - parameters.tipsOfTheDay + - parameters.parallel + - parameters.internalErrorsCountLimit + - parameters.cache + - parameters.memoryLimitFile + - parameters.pro + - parametersSchema extensions: rules: PHPStan\DependencyInjection\RulesExtension @@ -502,6 +515,7 @@ services: scanFiles: %scanFiles% scanDirectories: %scanDirectories% checkDependenciesOfProjectExtensionFiles: %resultCacheChecksProjectExtensionFilesDependencies% + parametersNotInvalidatingCache: %parametersNotInvalidatingCache% - class: PHPStan\Analyser\ResultCache\ResultCacheClearer diff --git a/conf/parametersSchema.neon b/conf/parametersSchema.neon index f7328f7863..3791c293a1 100644 --- a/conf/parametersSchema.neon +++ b/conf/parametersSchema.neon @@ -166,6 +166,7 @@ parametersSchema: ]) env: arrayOf(string(), anyOf(int(), string())) sysGetTempDir: string() + parametersNotInvalidatingCache: listOf(string()) # playground mode sourceLocatorPlaygroundMode: bool() diff --git a/src/Analyser/ResultCache/ResultCacheManager.php b/src/Analyser/ResultCache/ResultCacheManager.php index 7e997503a3..0db2ffc546 100644 --- a/src/Analyser/ResultCache/ResultCacheManager.php +++ b/src/Analyser/ResultCache/ResultCacheManager.php @@ -16,6 +16,7 @@ use PHPStan\File\FileFinder; use PHPStan\File\FileHelper; use PHPStan\File\FileWriter; +use PHPStan\Internal\ArrayHelper; use PHPStan\Internal\ComposerHelper; use PHPStan\PhpDoc\StubFilesProvider; use PHPStan\Reflection\ReflectionProvider; @@ -29,6 +30,7 @@ use function array_unique; use function array_values; use function count; +use function explode; use function get_loaded_extensions; use function implode; use function is_array; @@ -65,6 +67,7 @@ final class ResultCacheManager * @param string[] $bootstrapFiles * @param string[] $scanFiles * @param string[] $scanDirectories + * @param list $parametersNotInvalidatingCache */ public function __construct( private Container $container, @@ -82,6 +85,7 @@ public function __construct( private array $scanFiles, private array $scanDirectories, private bool $checkDependenciesOfProjectExtensionFiles, + private array $parametersNotInvalidatingCache, ) { } @@ -887,18 +891,9 @@ private function getMeta(array $allAnalysedFiles, ?array $projectConfigArray): a sort($extensions); if ($projectConfigArray !== null) { - unset($projectConfigArray['parameters']['editorUrl']); - unset($projectConfigArray['parameters']['editorUrlTitle']); - unset($projectConfigArray['parameters']['errorFormat']); - unset($projectConfigArray['parameters']['ignoreErrors']); - unset($projectConfigArray['parameters']['reportUnmatchedIgnoredErrors']); - unset($projectConfigArray['parameters']['tipsOfTheDay']); - unset($projectConfigArray['parameters']['parallel']); - unset($projectConfigArray['parameters']['internalErrorsCountLimit']); - unset($projectConfigArray['parameters']['cache']); - unset($projectConfigArray['parameters']['memoryLimitFile']); - unset($projectConfigArray['parameters']['pro']); - unset($projectConfigArray['parametersSchema']); + foreach ($this->parametersNotInvalidatingCache as $parameterPath) { + ArrayHelper::unsetKeyAtPath($projectConfigArray, explode('.', $parameterPath)); + } ksort($projectConfigArray); } diff --git a/src/Internal/ArrayHelper.php b/src/Internal/ArrayHelper.php new file mode 100644 index 0000000000..2498f61efb --- /dev/null +++ b/src/Internal/ArrayHelper.php @@ -0,0 +1,27 @@ + $path + */ + public static function unsetKeyAtPath(array &$array, array $path): void + { + [$head, $tail] = [$path[0], array_slice($path, 1)]; + + if (count($tail) === 0) { + unset($array[$head]); + + } elseif (isset($array[$head])) { + self::unsetKeyAtPath($array[$head], $tail); + } + } + +} diff --git a/tests/PHPStan/Internal/ArrayHelperTest.php b/tests/PHPStan/Internal/ArrayHelperTest.php new file mode 100644 index 0000000000..6cf63b46a7 --- /dev/null +++ b/tests/PHPStan/Internal/ArrayHelperTest.php @@ -0,0 +1,61 @@ + [ + 'dep2a' => [ + 'dep3a' => null, + ], + 'dep2b' => null, + ], + 'dep1b' => null, + ]; + + ArrayHelper::unsetKeyAtPath($array, ['dep1a', 'dep2a', 'dep3a']); + + $this->assertSame([ + 'dep1a' => [ + 'dep2a' => [], + 'dep2b' => null, + ], + 'dep1b' => null, + ], $array); + + ArrayHelper::unsetKeyAtPath($array, ['dep1a', 'dep2a']); + + $this->assertSame([ + 'dep1a' => [ + 'dep2b' => null, + ], + 'dep1b' => null, + ], $array); + + ArrayHelper::unsetKeyAtPath($array, ['dep1a']); + + $this->assertSame([ + 'dep1b' => null, + ], $array); + + ArrayHelper::unsetKeyAtPath($array, ['dep1b']); + + $this->assertSame([], $array); + } + + public function testUnsetKeyAtPathEmpty(): void + { + $array = []; + + ArrayHelper::unsetKeyAtPath($array, ['foo', 'bar']); + + $this->assertSame([], $array); + } + +}