diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml
index 0c4ab80cff..8bb5208532 100644
--- a/.github/workflows/build.yml
+++ b/.github/workflows/build.yml
@@ -209,6 +209,7 @@ jobs:
script:
- "vendor/bin/phing phpstan"
- "vendor/bin/phing phpstan-static-reflection"
+ - "vendor/bin/phing phpstan-validate-stub-files"
exclude:
- operating-system: windows-latest
script: "vendor/bin/phing phpstan-static-reflection"
diff --git a/build.xml b/build.xml
index a0007c1918..4e6086ede4 100644
--- a/build.xml
+++ b/build.xml
@@ -437,6 +437,27 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/conf/config.neon b/conf/config.neon
index bd425941a9..356b14f7bf 100644
--- a/conf/config.neon
+++ b/conf/config.neon
@@ -1,3 +1,5 @@
+includes:
+ - config.stubFiles.neon
parameters:
bootstrap: null
bootstrapFiles:
@@ -77,18 +79,6 @@ parameters:
typeAliases: []
universalObjectCratesClasses:
- stdClass
- stubFiles:
- - ../stubs/ReflectionClass.stub
- - ../stubs/iterable.stub
- - ../stubs/ArrayObject.stub
- - ../stubs/WeakReference.stub
- - ../stubs/ext-ds.stub
- - ../stubs/PDOStatement.stub
- - ../stubs/ReflectionFunctionAbstract.stub
- - ../stubs/date.stub
- - ../stubs/zip.stub
- - ../stubs/dom.stub
- - ../stubs/spl.stub
earlyTerminatingMethodCalls: []
earlyTerminatingFunctionCalls: []
memoryLimitFile: %tmpDir%/.memory_limit
@@ -353,8 +343,6 @@ services:
-
class: PHPStan\PhpDoc\StubValidator
- arguments:
- stubFiles: %stubFiles%
-
class: PHPStan\Analyser\Analyser
diff --git a/conf/config.stubFiles.neon b/conf/config.stubFiles.neon
new file mode 100644
index 0000000000..4485fb6699
--- /dev/null
+++ b/conf/config.stubFiles.neon
@@ -0,0 +1,13 @@
+parameters:
+ stubFiles:
+ - ../stubs/ReflectionClass.stub
+ - ../stubs/iterable.stub
+ - ../stubs/ArrayObject.stub
+ - ../stubs/WeakReference.stub
+ - ../stubs/ext-ds.stub
+ - ../stubs/PDOStatement.stub
+ - ../stubs/ReflectionFunctionAbstract.stub
+ - ../stubs/date.stub
+ - ../stubs/zip.stub
+ - ../stubs/dom.stub
+ - ../stubs/spl.stub
diff --git a/src/Command/AnalyseApplication.php b/src/Command/AnalyseApplication.php
index a28ef0cf4e..4a8eeb4e7a 100644
--- a/src/Command/AnalyseApplication.php
+++ b/src/Command/AnalyseApplication.php
@@ -65,7 +65,11 @@ public function analyse(
): AnalysisResult
{
$this->updateMemoryLimitFile();
- $stubErrors = $this->stubValidator->validate();
+ $projectStubFiles = [];
+ if ($projectConfigArray !== null) {
+ $projectStubFiles = $projectConfigArray['parameters']['stubFiles'] ?? [];
+ }
+ $stubErrors = $this->stubValidator->validate($projectStubFiles);
register_shutdown_function(function (): void {
$error = error_get_last();
diff --git a/src/PhpDoc/StubValidator.php b/src/PhpDoc/StubValidator.php
index db39713d4d..588d0501ca 100644
--- a/src/PhpDoc/StubValidator.php
+++ b/src/PhpDoc/StubValidator.php
@@ -47,28 +47,25 @@
class StubValidator
{
- /** @var string[] */
- private array $stubFiles;
-
private \PHPStan\DependencyInjection\DerivativeContainerFactory $derivativeContainerFactory;
- /**
- * @param string[] $stubFiles
- */
public function __construct(
- array $stubFiles,
DerivativeContainerFactory $derivativeContainerFactory
)
{
- $this->stubFiles = $stubFiles;
$this->derivativeContainerFactory = $derivativeContainerFactory;
}
/**
+ * @param string[] $stubFiles
* @return \PHPStan\Analyser\Error[]
*/
- public function validate(): array
+ public function validate(array $stubFiles): array
{
+ if (count($stubFiles) === 0) {
+ return [];
+ }
+
$originalBroker = Broker::getInstance();
$container = $this->derivativeContainerFactory->create([
__DIR__ . '/../../conf/config.stubValidator.neon',
@@ -81,12 +78,12 @@ public function validate(): array
/** @var NodeScopeResolver $nodeScopeResolver */
$nodeScopeResolver = $container->getByType(NodeScopeResolver::class);
- $nodeScopeResolver->setAnalysedFiles($this->stubFiles);
+ $nodeScopeResolver->setAnalysedFiles($stubFiles);
- $analysedFiles = array_fill_keys($this->stubFiles, true);
+ $analysedFiles = array_fill_keys($stubFiles, true);
$errors = [];
- foreach ($this->stubFiles as $stubFile) {
+ foreach ($stubFiles as $stubFile) {
$tmpErrors = $fileAnalyser->analyseFile(
$stubFile,
$analysedFiles,