diff --git a/extension.neon b/extension.neon index 5c6a90d..cea2b15 100644 --- a/extension.neon +++ b/extension.neon @@ -57,6 +57,9 @@ services: class: PHPStan\Rules\PHPUnit\AnnotationHelper - class: PHPStan\Rules\PHPUnit\DataProviderHelper + factory: @PHPStan\Rules\PHPUnit\DataProviderHelperFactory::create() + - + class: PHPStan\Rules\PHPUnit\DataProviderHelperFactory conditionalTags: PHPStan\PhpDoc\PHPUnit\MockObjectTypeNodeResolverExtension: diff --git a/src/Rules/PHPUnit/DataProviderHelper.php b/src/Rules/PHPUnit/DataProviderHelper.php index a224cb7..3007960 100644 --- a/src/Rules/PHPUnit/DataProviderHelper.php +++ b/src/Rules/PHPUnit/DataProviderHelper.php @@ -26,9 +26,13 @@ class DataProviderHelper */ private $reflectionProvider; - public function __construct(ReflectionProvider $reflectionProvider) + /** @var bool */ + private $phpunit10OrNewer; + + public function __construct(ReflectionProvider $reflectionProvider, bool $phpunit10OrNewer) { $this->reflectionProvider = $reflectionProvider; + $this->phpunit10OrNewer = $phpunit10OrNewer; } /** @@ -108,9 +112,9 @@ public function processDataProvider( ))->build(); } - if ($deprecationRulesInstalled && !$dataProviderMethodReflection->isStatic()) { + if ($deprecationRulesInstalled && $this->phpunit10OrNewer && !$dataProviderMethodReflection->isStatic()) { $errors[] = RuleErrorBuilder::message(sprintf( - '@dataProvider %s related method must be static.', + '@dataProvider %s related method must be static in PHPUnit 10 and newer.', $dataProviderValue ))->build(); } diff --git a/src/Rules/PHPUnit/DataProviderHelperFactory.php b/src/Rules/PHPUnit/DataProviderHelperFactory.php new file mode 100644 index 0000000..a93ecfd --- /dev/null +++ b/src/Rules/PHPUnit/DataProviderHelperFactory.php @@ -0,0 +1,52 @@ +reflectionProvider = $reflectionProvider; + } + + public function create(): DataProviderHelper + { + $phpUnit10OrNewer = false; + if ($this->reflectionProvider->hasClass(TestCase::class)) { + $testCase = $this->reflectionProvider->getClass(TestCase::class); + $file = $testCase->getFileName(); + if ($file !== null) { + $phpUnitRoot = dirname($file, 3); + $phpUnitComposer = $phpUnitRoot . '/composer.json'; + if (is_file($phpUnitComposer)) { + $composerJson = @file_get_contents($phpUnitComposer); + if ($composerJson !== false) { + $json = json_decode($composerJson, true); + $version = $json['extra']['branch-alias']['dev-main'] ?? null; + if ($version !== null) { + $majorVersion = (int) explode('.', $version)[0]; + if ($majorVersion >= 10) { + $phpUnit10OrNewer = true; + } + } + } + } + } + } + + return new DataProviderHelper($this->reflectionProvider, $phpUnit10OrNewer); + } + +} diff --git a/tests/Rules/PHPUnit/DataProviderDeclarationRuleTest.php b/tests/Rules/PHPUnit/DataProviderDeclarationRuleTest.php index 04dad8d..03c44ec 100644 --- a/tests/Rules/PHPUnit/DataProviderDeclarationRuleTest.php +++ b/tests/Rules/PHPUnit/DataProviderDeclarationRuleTest.php @@ -17,7 +17,7 @@ protected function getRule(): Rule $reflection = $this->createReflectionProvider(); return new DataProviderDeclarationRule( - new DataProviderHelper($reflection), + new DataProviderHelper($reflection, true), self::getContainer()->getByType(FileTypeMapper::class), true, true @@ -32,7 +32,7 @@ public function testRule(): void 14, ], [ - '@dataProvider provideQux related method must be static.', + '@dataProvider provideQux related method must be static in PHPUnit 10 and newer.', 14, ], [