From 909d8889610fa2ee20bf5a3a56f5d1a9175f9f53 Mon Sep 17 00:00:00 2001 From: Anders Jenbo Date: Sun, 30 Aug 2026 00:53:56 +0200 Subject: [PATCH] Proper handeling of unknown paths --- phpstan-baseline.neon | 12 ------------ src/Command/CommandHelper.php | 6 +++++- src/Diagnose/PHPStanDiagnoseExtension.php | 7 ++++++- src/Testing/TestCaseSourceLocatorFactory.php | 8 +++++++- 4 files changed, 18 insertions(+), 15 deletions(-) diff --git a/phpstan-baseline.neon b/phpstan-baseline.neon index fef664d8b33..1e37029b7d9 100644 --- a/phpstan-baseline.neon +++ b/phpstan-baseline.neon @@ -156,12 +156,6 @@ parameters: count: 2 path: src/Command/CommandHelper.php - - - rawMessage: 'Parameter #1 $path of function dirname expects string, string|false given.' - identifier: argument.type - count: 1 - path: src/Command/CommandHelper.php - - rawMessage: 'Static property PHPStan\Command\CommandHelper::$reservedMemory is never read, only written.' identifier: property.onlyWritten @@ -240,12 +234,6 @@ parameters: count: 1 path: src/DependencyInjection/NeonAdapter.php - - - rawMessage: 'Parameter #1 $path of function dirname expects string, string|false given.' - identifier: argument.type - count: 1 - path: src/Diagnose/PHPStanDiagnoseExtension.php - - rawMessage: 'Call to method getContent() of internal class PhpMerge\internal\Line from outside its root namespace PhpMerge.' identifier: method.internalClass diff --git a/src/Command/CommandHelper.php b/src/Command/CommandHelper.php index 5f89864098e..95ed0adfb0d 100644 --- a/src/Command/CommandHelper.php +++ b/src/Command/CommandHelper.php @@ -312,7 +312,11 @@ public static function begin( if (class_exists('PHPStan\ExtensionInstaller\GeneratedConfig')) { $generatedConfigReflection = new ReflectionClass('PHPStan\ExtensionInstaller\GeneratedConfig'); - $generatedConfigDirectory = dirname($generatedConfigReflection->getFileName()); + $generatedConfigFileName = $generatedConfigReflection->getFileName(); + if ($generatedConfigFileName === false) { + throw new ShouldNotHappenException('PHPStan\ExtensionInstaller\GeneratedConfig is not defined in a file.'); + } + $generatedConfigDirectory = dirname($generatedConfigFileName); foreach (GeneratedConfig::EXTENSIONS as $name => $extensionConfig) { foreach ($extensionConfig['extra']['includes'] ?? [] as $includedFile) { if (!is_string($includedFile)) { diff --git a/src/Diagnose/PHPStanDiagnoseExtension.php b/src/Diagnose/PHPStanDiagnoseExtension.php index 3cc1e817551..acad0709918 100644 --- a/src/Diagnose/PHPStanDiagnoseExtension.php +++ b/src/Diagnose/PHPStanDiagnoseExtension.php @@ -12,6 +12,7 @@ use PHPStan\Internal\ComposerHelper; use PHPStan\Php\ComposerPhpVersionFactory; use PHPStan\Php\PhpVersion; +use PHPStan\ShouldNotHappenException; use ReflectionClass; use function array_count_values; use function array_key_exists; @@ -133,7 +134,11 @@ public function print(Output $output, array $processedFiles): void } $generatedConfigReflection = new ReflectionClass('PHPStan\ExtensionInstaller\GeneratedConfig'); - $generatedConfigDirectory = dirname($generatedConfigReflection->getFileName()); + $generatedConfigFileName = $generatedConfigReflection->getFileName(); + if ($generatedConfigFileName === false) { + throw new ShouldNotHappenException('PHPStan\ExtensionInstaller\GeneratedConfig is not defined in a file.'); + } + $generatedConfigDirectory = dirname($generatedConfigFileName); foreach (GeneratedConfig::EXTENSIONS as $name => $extensionConfig) { $output->writeLineFormatted(sprintf('%s: %s', $name, $extensionConfig['version'] ?? 'Unknown version')); foreach ($extensionConfig['extra']['includes'] ?? [] as $includedFile) { diff --git a/src/Testing/TestCaseSourceLocatorFactory.php b/src/Testing/TestCaseSourceLocatorFactory.php index 3b01851e462..33bb3b10b55 100644 --- a/src/Testing/TestCaseSourceLocatorFactory.php +++ b/src/Testing/TestCaseSourceLocatorFactory.php @@ -22,6 +22,7 @@ use function dirname; use function hash; use function is_file; +use function is_string; use function serialize; use const PHP_VERSION_ID; @@ -72,7 +73,12 @@ public function create(): SourceLocator $vendorDirProperty->setAccessible(true); } foreach ($classLoaders as $classLoader) { - $composerProjectPath = dirname($vendorDirProperty->getValue($classLoader)); + $vendorDir = $vendorDirProperty->getValue($classLoader); + if (!is_string($vendorDir)) { + continue; + } + + $composerProjectPath = dirname($vendorDir); if (!is_file($composerProjectPath . '/composer.json')) { continue; }