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,