From 1973c87c44bb5ebf2525f470ac806f9d697ee7d1 Mon Sep 17 00:00:00 2001 From: APX403 Date: Fri, 6 Nov 2026 00:48:45 +0200 Subject: [PATCH] [Core] Pass withFileExtensions() to the PHPStan directory scan PHPStan indexes the directories in paths for static reflection, but only looks at *.php files by default. A class in a processed *.inc file was not known by name, and since 2.8.0 fetchClassLikeReflection() throws "Class ... should be known at this point" for it. --- .github/workflows/e2e.yaml | 1 + e2e/custom-file-extensions/.gitignore | 1 + e2e/custom-file-extensions/composer.json | 5 +++++ .../expected-output.diff | 22 +++++++++++++++++++ e2e/custom-file-extensions/rector.php | 11 ++++++++++ .../src/ChildService.inc | 10 +++++++++ .../src/ParentService.inc | 10 +++++++++ .../PHPStanServicesFactory.php | 6 ++++- 8 files changed, 65 insertions(+), 1 deletion(-) create mode 100644 e2e/custom-file-extensions/.gitignore create mode 100644 e2e/custom-file-extensions/composer.json create mode 100644 e2e/custom-file-extensions/expected-output.diff create mode 100644 e2e/custom-file-extensions/rector.php create mode 100644 e2e/custom-file-extensions/src/ChildService.inc create mode 100644 e2e/custom-file-extensions/src/ParentService.inc diff --git a/.github/workflows/e2e.yaml b/.github/workflows/e2e.yaml index 7a32cfbdef1..5dd3f0159f3 100644 --- a/.github/workflows/e2e.yaml +++ b/.github/workflows/e2e.yaml @@ -28,6 +28,7 @@ jobs: - 'e2e/applied-polyfill-php80' - 'e2e/config-dist-fallback' - 'e2e/config-file-priority' + - 'e2e/custom-file-extensions' - 'e2e/only-option' - 'e2e/parallel-custom-config' - 'e2e/parallel-unused-skips' diff --git a/e2e/custom-file-extensions/.gitignore b/e2e/custom-file-extensions/.gitignore new file mode 100644 index 00000000000..61ead86667c --- /dev/null +++ b/e2e/custom-file-extensions/.gitignore @@ -0,0 +1 @@ +/vendor diff --git a/e2e/custom-file-extensions/composer.json b/e2e/custom-file-extensions/composer.json new file mode 100644 index 00000000000..8b5ca727be7 --- /dev/null +++ b/e2e/custom-file-extensions/composer.json @@ -0,0 +1,5 @@ +{ + "require": { + "php": "^8.1" + } +} diff --git a/e2e/custom-file-extensions/expected-output.diff b/e2e/custom-file-extensions/expected-output.diff new file mode 100644 index 00000000000..1d3e214b4a4 --- /dev/null +++ b/e2e/custom-file-extensions/expected-output.diff @@ -0,0 +1,22 @@ +1 file with changes +=================== + +1) src/ChildService.inc:4 + + ---------- begin diff ---------- +@@ Line 4 @@ + + class ChildService extends ParentService + { +- public function run($value) ++ public function run($value, $flag = false) + { + } + } + ----------- end diff ----------- + +Applied rules: + * AddParamBasedOnParentClassMethodRector + + + [OK] 1 file would have been changed (dry-run) by Rector diff --git a/e2e/custom-file-extensions/rector.php b/e2e/custom-file-extensions/rector.php new file mode 100644 index 00000000000..5382146d0ac --- /dev/null +++ b/e2e/custom-file-extensions/rector.php @@ -0,0 +1,11 @@ +withPaths([__DIR__ . '/src']) + ->withFileExtensions(['php', 'inc']) + ->withRules([AddParamBasedOnParentClassMethodRector::class]); diff --git a/e2e/custom-file-extensions/src/ChildService.inc b/e2e/custom-file-extensions/src/ChildService.inc new file mode 100644 index 00000000000..b16860183a5 --- /dev/null +++ b/e2e/custom-file-extensions/src/ChildService.inc @@ -0,0 +1,10 @@ +container = $containerFactory->create( SimpleParameterProvider::provideStringParameter(Option::CONTAINER_CACHE_DIRECTORY), $additionalConfigFiles, - [] + [], + // let PHPStan find classes in files with any configured extension, not only in *.php ones + additionalParameters: [ + 'fileExtensions' => SimpleParameterProvider::provideArrayParameter(Option::FILE_EXTENSIONS), + ] ); } catch (Throwable $throwable) { if ($throwable->getMessage() === "File 'phar://phpstan.phar/conf/bleedingEdge.neon' is missing or is not readable.") {