From 5e33a6faaa80f236ee5f35f9c514a0aea0c6f2fd Mon Sep 17 00:00:00 2001 From: Tomas Votruba Date: Fri, 31 Jul 2026 19:07:59 +0200 Subject: [PATCH 1/2] Bond annotation to attribute rules to phpunit/phpunit >=10.0 --- .../DataProviderAnnotationToAttributeRector.php | 9 ++++++++- .../DependsAnnotationWithValueToAttributeRector.php | 9 ++++++++- .../ClassMethod/TestWithAnnotationToAttributeRector.php | 9 ++++++++- .../Class_/AnnotationWithValueToAttributeRector.php | 9 ++++++++- .../CoversAnnotationWithValueToAttributeRector.php | 9 ++++++++- .../RequiresAnnotationWithValueToAttributeRector.php | 9 ++++++++- .../Rector/Class_/TicketAnnotationToAttributeRector.php | 9 ++++++++- 7 files changed, 56 insertions(+), 7 deletions(-) diff --git a/rules/AnnotationsToAttributes/Rector/ClassMethod/DataProviderAnnotationToAttributeRector.php b/rules/AnnotationsToAttributes/Rector/ClassMethod/DataProviderAnnotationToAttributeRector.php index 735c4e58..51d8a6e5 100644 --- a/rules/AnnotationsToAttributes/Rector/ClassMethod/DataProviderAnnotationToAttributeRector.php +++ b/rules/AnnotationsToAttributes/Rector/ClassMethod/DataProviderAnnotationToAttributeRector.php @@ -22,14 +22,16 @@ use Rector\Rector\AbstractRector; use Rector\Reflection\ReflectionResolver; use Rector\ValueObject\PhpVersion; +use Rector\VersionBonding\Contract\ComposerPackageConstraintInterface; use Rector\VersionBonding\Contract\MinPhpVersionInterface; +use Rector\VersionBonding\ValueObject\ComposerPackageConstraint; use Symplify\RuleDocGenerator\ValueObject\CodeSample\CodeSample; use Symplify\RuleDocGenerator\ValueObject\RuleDefinition; /** * @see \Rector\PHPUnit\Tests\AnnotationsToAttributes\Rector\ClassMethod\DataProviderAnnotationToAttributeRector\DataProviderAnnotationToAttributeRectorTest */ -final class DataProviderAnnotationToAttributeRector extends AbstractRector implements MinPhpVersionInterface +final class DataProviderAnnotationToAttributeRector extends AbstractRector implements MinPhpVersionInterface, ComposerPackageConstraintInterface { public function __construct( private readonly TestsNodeAnalyzer $testsNodeAnalyzer, @@ -84,6 +86,11 @@ public function getNodeTypes(): array return [ClassMethod::class]; } + public function provideComposerPackageConstraint(): ComposerPackageConstraint + { + return new ComposerPackageConstraint('phpunit/phpunit', '>=10.0'); + } + public function provideMinPhpVersion(): int { /** diff --git a/rules/AnnotationsToAttributes/Rector/ClassMethod/DependsAnnotationWithValueToAttributeRector.php b/rules/AnnotationsToAttributes/Rector/ClassMethod/DependsAnnotationWithValueToAttributeRector.php index 547f7a4a..8d2e6a7c 100644 --- a/rules/AnnotationsToAttributes/Rector/ClassMethod/DependsAnnotationWithValueToAttributeRector.php +++ b/rules/AnnotationsToAttributes/Rector/ClassMethod/DependsAnnotationWithValueToAttributeRector.php @@ -18,14 +18,16 @@ use Rector\PHPUnit\NodeAnalyzer\TestsNodeAnalyzer; use Rector\Rector\AbstractRector; use Rector\ValueObject\PhpVersionFeature; +use Rector\VersionBonding\Contract\ComposerPackageConstraintInterface; use Rector\VersionBonding\Contract\MinPhpVersionInterface; +use Rector\VersionBonding\ValueObject\ComposerPackageConstraint; use Symplify\RuleDocGenerator\ValueObject\CodeSample\CodeSample; use Symplify\RuleDocGenerator\ValueObject\RuleDefinition; /** * @see \Rector\PHPUnit\Tests\AnnotationsToAttributes\Rector\ClassMethod\DependsAnnotationWithValueToAttributeRector\DependsAnnotationWithValueToAttributeRectorTest */ -final class DependsAnnotationWithValueToAttributeRector extends AbstractRector implements MinPhpVersionInterface +final class DependsAnnotationWithValueToAttributeRector extends AbstractRector implements MinPhpVersionInterface, ComposerPackageConstraintInterface { private const string DEPENDS_ATTRIBUTE = 'PHPUnit\Framework\Attributes\Depends'; @@ -85,6 +87,11 @@ public function getNodeTypes(): array return [Class_::class]; } + public function provideComposerPackageConstraint(): ComposerPackageConstraint + { + return new ComposerPackageConstraint('phpunit/phpunit', '>=10.0'); + } + public function provideMinPhpVersion(): int { return PhpVersionFeature::ATTRIBUTES; diff --git a/rules/AnnotationsToAttributes/Rector/ClassMethod/TestWithAnnotationToAttributeRector.php b/rules/AnnotationsToAttributes/Rector/ClassMethod/TestWithAnnotationToAttributeRector.php index 763cfda7..3751915d 100644 --- a/rules/AnnotationsToAttributes/Rector/ClassMethod/TestWithAnnotationToAttributeRector.php +++ b/rules/AnnotationsToAttributes/Rector/ClassMethod/TestWithAnnotationToAttributeRector.php @@ -18,7 +18,9 @@ use Rector\PHPUnit\NodeAnalyzer\TestsNodeAnalyzer; use Rector\Rector\AbstractRector; use Rector\ValueObject\PhpVersionFeature; +use Rector\VersionBonding\Contract\ComposerPackageConstraintInterface; use Rector\VersionBonding\Contract\MinPhpVersionInterface; +use Rector\VersionBonding\ValueObject\ComposerPackageConstraint; use Symplify\RuleDocGenerator\ValueObject\CodeSample\CodeSample; use Symplify\RuleDocGenerator\ValueObject\RuleDefinition; @@ -28,7 +30,7 @@ * * @see \Rector\PHPUnit\Tests\AnnotationsToAttributes\Rector\ClassMethod\TestWithAnnotationToAttributeRector\TestWithAnnotationToAttributeRectorTest */ -final class TestWithAnnotationToAttributeRector extends AbstractRector implements MinPhpVersionInterface +final class TestWithAnnotationToAttributeRector extends AbstractRector implements MinPhpVersionInterface, ComposerPackageConstraintInterface { private const string TEST_WITH_ATTRIBUTE = 'PHPUnit\Framework\Attributes\TestWith'; @@ -148,6 +150,11 @@ public function refactor(Node $node): ?Node return $node; } + public function provideComposerPackageConstraint(): ComposerPackageConstraint + { + return new ComposerPackageConstraint('phpunit/phpunit', '>=10.0'); + } + public function provideMinPhpVersion(): int { return PhpVersionFeature::ATTRIBUTES; diff --git a/rules/AnnotationsToAttributes/Rector/Class_/AnnotationWithValueToAttributeRector.php b/rules/AnnotationsToAttributes/Rector/Class_/AnnotationWithValueToAttributeRector.php index f206d943..66c7ac5b 100644 --- a/rules/AnnotationsToAttributes/Rector/Class_/AnnotationWithValueToAttributeRector.php +++ b/rules/AnnotationsToAttributes/Rector/Class_/AnnotationWithValueToAttributeRector.php @@ -19,7 +19,9 @@ use Rector\PHPUnit\ValueObject\AnnotationWithValueToAttribute; use Rector\Rector\AbstractRector; use Rector\ValueObject\PhpVersionFeature; +use Rector\VersionBonding\Contract\ComposerPackageConstraintInterface; use Rector\VersionBonding\Contract\MinPhpVersionInterface; +use Rector\VersionBonding\ValueObject\ComposerPackageConstraint; use Symplify\RuleDocGenerator\ValueObject\CodeSample\ConfiguredCodeSample; use Symplify\RuleDocGenerator\ValueObject\RuleDefinition; use Webmozart\Assert\Assert; @@ -27,7 +29,7 @@ /** * @see \Rector\PHPUnit\Tests\AnnotationsToAttributes\Rector\Class_\AnnotationWithValueToAttributeRector\AnnotationWithValueToAttributeRectorTest */ -final class AnnotationWithValueToAttributeRector extends AbstractRector implements ConfigurableRectorInterface, MinPhpVersionInterface +final class AnnotationWithValueToAttributeRector extends AbstractRector implements ConfigurableRectorInterface, MinPhpVersionInterface, ComposerPackageConstraintInterface { /** * @var AnnotationWithValueToAttribute[] @@ -89,6 +91,11 @@ public function getNodeTypes(): array return [Class_::class]; } + public function provideComposerPackageConstraint(): ComposerPackageConstraint + { + return new ComposerPackageConstraint('phpunit/phpunit', '>=10.0'); + } + public function provideMinPhpVersion(): int { return PhpVersionFeature::ATTRIBUTES; diff --git a/rules/AnnotationsToAttributes/Rector/Class_/CoversAnnotationWithValueToAttributeRector.php b/rules/AnnotationsToAttributes/Rector/Class_/CoversAnnotationWithValueToAttributeRector.php index aa1cd15f..d4ad0ed0 100644 --- a/rules/AnnotationsToAttributes/Rector/Class_/CoversAnnotationWithValueToAttributeRector.php +++ b/rules/AnnotationsToAttributes/Rector/Class_/CoversAnnotationWithValueToAttributeRector.php @@ -19,14 +19,16 @@ use Rector\PHPUnit\NodeAnalyzer\TestsNodeAnalyzer; use Rector\Rector\AbstractRector; use Rector\ValueObject\PhpVersionFeature; +use Rector\VersionBonding\Contract\ComposerPackageConstraintInterface; use Rector\VersionBonding\Contract\MinPhpVersionInterface; +use Rector\VersionBonding\ValueObject\ComposerPackageConstraint; use Symplify\RuleDocGenerator\ValueObject\CodeSample\CodeSample; use Symplify\RuleDocGenerator\ValueObject\RuleDefinition; /** * @see \Rector\PHPUnit\Tests\AnnotationsToAttributes\Rector\Class_\CoversAnnotationWithValueToAttributeRector\CoversAnnotationWithValueToAttributeRectorTest */ -final class CoversAnnotationWithValueToAttributeRector extends AbstractRector implements MinPhpVersionInterface +final class CoversAnnotationWithValueToAttributeRector extends AbstractRector implements MinPhpVersionInterface, ComposerPackageConstraintInterface { private const string COVERS_FUNCTION_ATTRIBUTE = 'PHPUnit\Framework\Attributes\CoversFunction'; @@ -94,6 +96,11 @@ public function getNodeTypes(): array return [Class_::class, ClassMethod::class]; } + public function provideComposerPackageConstraint(): ComposerPackageConstraint + { + return new ComposerPackageConstraint('phpunit/phpunit', '>=10.0'); + } + public function provideMinPhpVersion(): int { return PhpVersionFeature::ATTRIBUTES; diff --git a/rules/AnnotationsToAttributes/Rector/Class_/RequiresAnnotationWithValueToAttributeRector.php b/rules/AnnotationsToAttributes/Rector/Class_/RequiresAnnotationWithValueToAttributeRector.php index 402517f3..7d081e31 100644 --- a/rules/AnnotationsToAttributes/Rector/Class_/RequiresAnnotationWithValueToAttributeRector.php +++ b/rules/AnnotationsToAttributes/Rector/Class_/RequiresAnnotationWithValueToAttributeRector.php @@ -17,14 +17,16 @@ use Rector\PHPUnit\NodeAnalyzer\TestsNodeAnalyzer; use Rector\Rector\AbstractRector; use Rector\ValueObject\PhpVersionFeature; +use Rector\VersionBonding\Contract\ComposerPackageConstraintInterface; use Rector\VersionBonding\Contract\MinPhpVersionInterface; +use Rector\VersionBonding\ValueObject\ComposerPackageConstraint; use Symplify\RuleDocGenerator\ValueObject\CodeSample\CodeSample; use Symplify\RuleDocGenerator\ValueObject\RuleDefinition; /** * @see \Rector\PHPUnit\Tests\AnnotationsToAttributes\Rector\Class_\RequiresAnnotationWithValueToAttributeRector\RequiresAnnotationWithValueToAttributeRectorTest */ -final class RequiresAnnotationWithValueToAttributeRector extends AbstractRector implements MinPhpVersionInterface +final class RequiresAnnotationWithValueToAttributeRector extends AbstractRector implements MinPhpVersionInterface, ComposerPackageConstraintInterface { public function __construct( private readonly PhpDocTagRemover $phpDocTagRemover, @@ -84,6 +86,11 @@ public function getNodeTypes(): array return [Class_::class, ClassMethod::class]; } + public function provideComposerPackageConstraint(): ComposerPackageConstraint + { + return new ComposerPackageConstraint('phpunit/phpunit', '>=10.0'); + } + public function provideMinPhpVersion(): int { return PhpVersionFeature::ATTRIBUTES; diff --git a/rules/AnnotationsToAttributes/Rector/Class_/TicketAnnotationToAttributeRector.php b/rules/AnnotationsToAttributes/Rector/Class_/TicketAnnotationToAttributeRector.php index 2e18c3ae..b978b9ad 100644 --- a/rules/AnnotationsToAttributes/Rector/Class_/TicketAnnotationToAttributeRector.php +++ b/rules/AnnotationsToAttributes/Rector/Class_/TicketAnnotationToAttributeRector.php @@ -22,7 +22,9 @@ use Rector\PHPUnit\NodeAnalyzer\TestsNodeAnalyzer; use Rector\Rector\AbstractRector; use Rector\ValueObject\PhpVersionFeature; +use Rector\VersionBonding\Contract\ComposerPackageConstraintInterface; use Rector\VersionBonding\Contract\MinPhpVersionInterface; +use Rector\VersionBonding\ValueObject\ComposerPackageConstraint; use Symplify\RuleDocGenerator\ValueObject\CodeSample\CodeSample; use Symplify\RuleDocGenerator\ValueObject\RuleDefinition; @@ -31,7 +33,7 @@ * * @see \Rector\PHPUnit\Tests\AnnotationsToAttributes\Rector\Class_\TicketAnnotationToAttributeRector\TicketAnnotationToAttributeRectorTest */ -final class TicketAnnotationToAttributeRector extends AbstractRector implements MinPhpVersionInterface +final class TicketAnnotationToAttributeRector extends AbstractRector implements MinPhpVersionInterface, ComposerPackageConstraintInterface { private const string TICKET_CLASS = 'PHPUnit\Framework\Attributes\Ticket'; @@ -81,6 +83,11 @@ public function getNodeTypes(): array return [Class_::class, ClassMethod::class]; } + public function provideComposerPackageConstraint(): ComposerPackageConstraint + { + return new ComposerPackageConstraint('phpunit/phpunit', '>=10.0'); + } + public function provideMinPhpVersion(): int { return PhpVersionFeature::ATTRIBUTES; From ff5f45b91824a0bfb1444048021b2bf01dc408da Mon Sep 17 00:00:00 2001 From: Tomas Votruba Date: Fri, 31 Jul 2026 19:42:34 +0200 Subject: [PATCH 2/2] Bond attribute-adding PHPUnit 12 rules to PHP 8.0 attributes --- .../Class_/AllowMockObjectsForDataProviderRector.php | 9 ++++++++- .../Class_/AllowMockObjectsWhereParentClassRector.php | 9 ++++++++- ...llowMockObjectsWithoutExpectationsAttributeRector.php | 9 ++++++++- 3 files changed, 24 insertions(+), 3 deletions(-) diff --git a/rules/PHPUnit120/Rector/Class_/AllowMockObjectsForDataProviderRector.php b/rules/PHPUnit120/Rector/Class_/AllowMockObjectsForDataProviderRector.php index 6612e7c5..ff717fa2 100644 --- a/rules/PHPUnit120/Rector/Class_/AllowMockObjectsForDataProviderRector.php +++ b/rules/PHPUnit120/Rector/Class_/AllowMockObjectsForDataProviderRector.php @@ -15,13 +15,15 @@ use Rector\PHPUnit\Enum\PHPUnitAttribute; use Rector\PHPUnit\NodeAnalyzer\TestsNodeAnalyzer; use Rector\Rector\AbstractRector; +use Rector\ValueObject\PhpVersionFeature; +use Rector\VersionBonding\Contract\MinPhpVersionInterface; use Symplify\RuleDocGenerator\ValueObject\CodeSample\CodeSample; use Symplify\RuleDocGenerator\ValueObject\RuleDefinition; /** * @see \Rector\PHPUnit\Tests\PHPUnit120\Rector\Class_\AllowMockObjectsForDataProviderRector\AllowMockObjectsForDataProviderRectorTest */ -final class AllowMockObjectsForDataProviderRector extends AbstractRector +final class AllowMockObjectsForDataProviderRector extends AbstractRector implements MinPhpVersionInterface { public function __construct( private readonly TestsNodeAnalyzer $testsNodeAnalyzer, @@ -36,6 +38,11 @@ public function getNodeTypes(): array return [Class_::class]; } + public function provideMinPhpVersion(): int + { + return PhpVersionFeature::ATTRIBUTES; + } + /** * @param Class_ $node */ diff --git a/rules/PHPUnit120/Rector/Class_/AllowMockObjectsWhereParentClassRector.php b/rules/PHPUnit120/Rector/Class_/AllowMockObjectsWhereParentClassRector.php index 10260a32..38cbcd2f 100644 --- a/rules/PHPUnit120/Rector/Class_/AllowMockObjectsWhereParentClassRector.php +++ b/rules/PHPUnit120/Rector/Class_/AllowMockObjectsWhereParentClassRector.php @@ -17,6 +17,8 @@ use Rector\PHPUnit\Enum\PHPUnitClassName; use Rector\PHPUnit\NodeAnalyzer\TestsNodeAnalyzer; use Rector\Rector\AbstractRector; +use Rector\ValueObject\PhpVersionFeature; +use Rector\VersionBonding\Contract\MinPhpVersionInterface; use Symplify\RuleDocGenerator\ValueObject\CodeSample\CodeSample; use Symplify\RuleDocGenerator\ValueObject\RuleDefinition; @@ -25,7 +27,7 @@ * * @see https://github.com/sebastianbergmann/phpunit/commit/24c208d6a340c3071f28a9b5cce02b9377adfd43 */ -final class AllowMockObjectsWhereParentClassRector extends AbstractRector +final class AllowMockObjectsWhereParentClassRector extends AbstractRector implements MinPhpVersionInterface { /** * @var string[] @@ -44,6 +46,11 @@ public function getNodeTypes(): array return [Class_::class]; } + public function provideMinPhpVersion(): int + { + return PhpVersionFeature::ATTRIBUTES; + } + /** * @param Class_ $node */ diff --git a/rules/PHPUnit120/Rector/Class_/AllowMockObjectsWithoutExpectationsAttributeRector.php b/rules/PHPUnit120/Rector/Class_/AllowMockObjectsWithoutExpectationsAttributeRector.php index 87cf2f6c..136467c4 100644 --- a/rules/PHPUnit120/Rector/Class_/AllowMockObjectsWithoutExpectationsAttributeRector.php +++ b/rules/PHPUnit120/Rector/Class_/AllowMockObjectsWithoutExpectationsAttributeRector.php @@ -24,6 +24,8 @@ use Rector\PHPUnit\NodeAnalyzer\TestsNodeAnalyzer; use Rector\Rector\AbstractRector; use Rector\ValueObject\MethodName; +use Rector\ValueObject\PhpVersionFeature; +use Rector\VersionBonding\Contract\MinPhpVersionInterface; use Symplify\RuleDocGenerator\ValueObject\CodeSample\CodeSample; use Symplify\RuleDocGenerator\ValueObject\RuleDefinition; @@ -32,7 +34,7 @@ * * @see https://github.com/sebastianbergmann/phpunit/commit/24c208d6a340c3071f28a9b5cce02b9377adfd43 */ -final class AllowMockObjectsWithoutExpectationsAttributeRector extends AbstractRector +final class AllowMockObjectsWithoutExpectationsAttributeRector extends AbstractRector implements MinPhpVersionInterface { public function __construct( private readonly TestsNodeAnalyzer $testsNodeAnalyzer, @@ -47,6 +49,11 @@ public function getNodeTypes(): array return [Class_::class]; } + public function provideMinPhpVersion(): int + { + return PhpVersionFeature::ATTRIBUTES; + } + /** * @param Class_ $node */