diff --git a/phpstan.neon b/phpstan.neon index 074f6074e01..9263e562c50 100644 --- a/phpstan.neon +++ b/phpstan.neon @@ -17,6 +17,10 @@ services: class: Rector\PHPStanRules\Rules\PhpUpgradeDowngradeRegisteredInSetRule tags: [phpstan.rules.rule] + - + class: Rector\PHPStanRules\Rules\PhpUpgradeImplementsMinPhpVersionInterfaceRule + tags: [phpstan.rules.rule] + parameters: level: max diff --git a/rules-tests/Php73/Rector/BinaryOr/IsCountableRector/FixtureWithPolyfill/polyfill_function.php.inc b/rules-tests/Php73/Rector/BinaryOr/IsCountableRector/FixtureWithPolyfill/polyfill_function.php.inc deleted file mode 100644 index 70fad49f739..00000000000 --- a/rules-tests/Php73/Rector/BinaryOr/IsCountableRector/FixtureWithPolyfill/polyfill_function.php.inc +++ /dev/null @@ -1,47 +0,0 @@ - ------ - diff --git a/rules-tests/Php73/Rector/BinaryOr/IsCountableRector/PolyfillRectorTest.php b/rules-tests/Php73/Rector/BinaryOr/IsCountableRector/PolyfillRectorTest.php deleted file mode 100644 index a8abf572f17..00000000000 --- a/rules-tests/Php73/Rector/BinaryOr/IsCountableRector/PolyfillRectorTest.php +++ /dev/null @@ -1,33 +0,0 @@ -doTestFileInfo($fileInfo); - } - - /** - * @return Iterator - */ - public function provideData(): Iterator - { - return $this->yieldFilesFromDirectory(__DIR__ . '/FixtureWithPolyfill'); - } - - public function provideConfigFilePath(): string - { - return __DIR__ . '/config/polyfill_config.php'; - } -} diff --git a/rules-tests/Php73/Rector/BinaryOr/IsCountableRector/config/polyfill_config.php b/rules-tests/Php73/Rector/BinaryOr/IsCountableRector/config/polyfill_config.php deleted file mode 100644 index 05ba13e3436..00000000000 --- a/rules-tests/Php73/Rector/BinaryOr/IsCountableRector/config/polyfill_config.php +++ /dev/null @@ -1,16 +0,0 @@ -parameters(); - $parameters->set(Option::PHP_VERSION_FEATURES, PhpVersionFeature::IS_COUNTABLE - 1); - - $services = $containerConfigurator->services(); - $services->set(IsCountableRector::class); -}; diff --git a/rules/Php52/Rector/Property/VarToPublicPropertyRector.php b/rules/Php52/Rector/Property/VarToPublicPropertyRector.php index fb44f2a4e6d..37dbf524124 100644 --- a/rules/Php52/Rector/Property/VarToPublicPropertyRector.php +++ b/rules/Php52/Rector/Property/VarToPublicPropertyRector.php @@ -7,14 +7,21 @@ namespace Rector\Php52\Rector\Property; use PhpParser\Node; use PhpParser\Node\Stmt\Property; use Rector\Core\Rector\AbstractRector; +use Rector\Core\ValueObject\PhpVersionFeature; +use Rector\VersionBonding\Contract\MinPhpVersionInterface; use Symplify\RuleDocGenerator\ValueObject\CodeSample\CodeSample; use Symplify\RuleDocGenerator\ValueObject\RuleDefinition; /** * @see \Rector\Tests\Php52\Rector\Property\VarToPublicPropertyRector\VarToPublicPropertyRectorTest */ -final class VarToPublicPropertyRector extends AbstractRector +final class VarToPublicPropertyRector extends AbstractRector implements MinPhpVersionInterface { + public function provideMinPhpVersion(): int + { + return PhpVersionFeature::PROPERTY_MODIFIER; + } + public function getRuleDefinition(): RuleDefinition { return new RuleDefinition('Change property modifier from `var` to `public`', [ diff --git a/rules/Php52/Rector/Switch_/ContinueToBreakInSwitchRector.php b/rules/Php52/Rector/Switch_/ContinueToBreakInSwitchRector.php index 254bbc03769..d675ded93be 100644 --- a/rules/Php52/Rector/Switch_/ContinueToBreakInSwitchRector.php +++ b/rules/Php52/Rector/Switch_/ContinueToBreakInSwitchRector.php @@ -13,6 +13,8 @@ use PhpParser\Node\Stmt\Switch_; use PHPStan\Type\Constant\ConstantIntegerType; use PHPStan\Type\ConstantType; use Rector\Core\Rector\AbstractRector; +use Rector\Core\ValueObject\PhpVersionFeature; +use Rector\VersionBonding\Contract\MinPhpVersionInterface; use Symplify\RuleDocGenerator\ValueObject\CodeSample\CodeSample; use Symplify\RuleDocGenerator\ValueObject\RuleDefinition; @@ -20,8 +22,13 @@ use Symplify\RuleDocGenerator\ValueObject\RuleDefinition; * @changelog https://stackoverflow.com/a/12349889/1348344 * @see \Rector\Tests\Php52\Rector\Switch_\ContinueToBreakInSwitchRector\ContinueToBreakInSwitchRectorTest */ -final class ContinueToBreakInSwitchRector extends AbstractRector +final class ContinueToBreakInSwitchRector extends AbstractRector implements MinPhpVersionInterface { + public function provideMinPhpVersion(): int + { + return PhpVersionFeature::CONTINUE_TO_BREAK; + } + public function getRuleDefinition(): RuleDefinition { return new RuleDefinition('Use break instead of continue in switch statements', [ diff --git a/rules/Php53/Rector/AssignRef/ClearReturnNewByReferenceRector.php b/rules/Php53/Rector/AssignRef/ClearReturnNewByReferenceRector.php index 8e204f57f3a..bda07ff14a8 100644 --- a/rules/Php53/Rector/AssignRef/ClearReturnNewByReferenceRector.php +++ b/rules/Php53/Rector/AssignRef/ClearReturnNewByReferenceRector.php @@ -9,6 +9,8 @@ use PhpParser\Node\Expr\Assign; use PhpParser\Node\Expr\AssignRef; use PhpParser\Node\Expr\New_; use Rector\Core\Rector\AbstractRector; +use Rector\Core\ValueObject\PhpVersionFeature; +use Rector\VersionBonding\Contract\MinPhpVersionInterface; use Symplify\RuleDocGenerator\ValueObject\CodeSample\CodeSample; use Symplify\RuleDocGenerator\ValueObject\RuleDefinition; @@ -16,8 +18,13 @@ use Symplify\RuleDocGenerator\ValueObject\RuleDefinition; * @see https://3v4l.org/UJN6H * @see \Rector\Tests\Php53\Rector\AssignRef\ClearReturnNewByReferenceRector\ClearReturnNewByReferenceRectorTest */ -final class ClearReturnNewByReferenceRector extends AbstractRector +final class ClearReturnNewByReferenceRector extends AbstractRector implements MinPhpVersionInterface { + public function provideMinPhpVersion(): int + { + return PhpVersionFeature::NO_REFERENCE_IN_NEW; + } + public function getRuleDefinition(): RuleDefinition { return new RuleDefinition( diff --git a/rules/Php53/Rector/Variable/ReplaceHttpServerVarsByServerRector.php b/rules/Php53/Rector/Variable/ReplaceHttpServerVarsByServerRector.php index 90a4c818e62..9d20a9c4039 100644 --- a/rules/Php53/Rector/Variable/ReplaceHttpServerVarsByServerRector.php +++ b/rules/Php53/Rector/Variable/ReplaceHttpServerVarsByServerRector.php @@ -7,6 +7,8 @@ namespace Rector\Php53\Rector\Variable; use PhpParser\Node; use PhpParser\Node\Expr\Variable; use Rector\Core\Rector\AbstractRector; +use Rector\Core\ValueObject\PhpVersionFeature; +use Rector\VersionBonding\Contract\MinPhpVersionInterface; use Symplify\RuleDocGenerator\ValueObject\CodeSample\CodeSample; use Symplify\RuleDocGenerator\ValueObject\RuleDefinition; @@ -14,7 +16,7 @@ use Symplify\RuleDocGenerator\ValueObject\RuleDefinition; * @see \Rector\Tests\Php53\Rector\Variable\ReplaceHttpServerVarsByServerRector\ReplaceHttpServerVarsByServerRectorTest * @changelog https://blog.tigertech.net/posts/php-5-3-http-server-vars/ */ -final class ReplaceHttpServerVarsByServerRector extends AbstractRector +final class ReplaceHttpServerVarsByServerRector extends AbstractRector implements MinPhpVersionInterface { /** * @var array @@ -29,6 +31,11 @@ final class ReplaceHttpServerVarsByServerRector extends AbstractRector 'HTTP_COOKIE_VARS' => '_COOKIE', ]; + public function provideMinPhpVersion(): int + { + return PhpVersionFeature::SERVER_VAR; + } + public function getRuleDefinition(): RuleDefinition { return new RuleDefinition( diff --git a/rules/Php54/Rector/Break_/RemoveZeroBreakContinueRector.php b/rules/Php54/Rector/Break_/RemoveZeroBreakContinueRector.php index ae720304bd1..7b460b382d1 100644 --- a/rules/Php54/Rector/Break_/RemoveZeroBreakContinueRector.php +++ b/rules/Php54/Rector/Break_/RemoveZeroBreakContinueRector.php @@ -12,6 +12,8 @@ use PhpParser\Node\Stmt\Continue_; use PHPStan\Type\Constant\ConstantIntegerType; use PHPStan\Type\ConstantType; use Rector\Core\Rector\AbstractRector; +use Rector\Core\ValueObject\PhpVersionFeature; +use Rector\VersionBonding\Contract\MinPhpVersionInterface; use Symplify\RuleDocGenerator\ValueObject\CodeSample\CodeSample; use Symplify\RuleDocGenerator\ValueObject\RuleDefinition; @@ -20,8 +22,13 @@ use Symplify\RuleDocGenerator\ValueObject\RuleDefinition; * * @see \Rector\Tests\Php54\Rector\Break_\RemoveZeroBreakContinueRector\RemoveZeroBreakContinueRectorTest */ -final class RemoveZeroBreakContinueRector extends AbstractRector +final class RemoveZeroBreakContinueRector extends AbstractRector implements MinPhpVersionInterface { + public function provideMinPhpVersion(): int + { + return PhpVersionFeature::NO_ZERO_BREAK; + } + public function getRuleDefinition(): RuleDefinition { return new RuleDefinition('Remove 0 from break and continue', [ diff --git a/rules/Php54/Rector/FuncCall/RemoveReferenceFromCallRector.php b/rules/Php54/Rector/FuncCall/RemoveReferenceFromCallRector.php index 148b9127bf2..eeb82eb98b7 100644 --- a/rules/Php54/Rector/FuncCall/RemoveReferenceFromCallRector.php +++ b/rules/Php54/Rector/FuncCall/RemoveReferenceFromCallRector.php @@ -7,14 +7,21 @@ namespace Rector\Php54\Rector\FuncCall; use PhpParser\Node; use PhpParser\Node\Expr\FuncCall; use Rector\Core\Rector\AbstractRector; +use Rector\Core\ValueObject\PhpVersionFeature; +use Rector\VersionBonding\Contract\MinPhpVersionInterface; use Symplify\RuleDocGenerator\ValueObject\CodeSample\CodeSample; use Symplify\RuleDocGenerator\ValueObject\RuleDefinition; /** * @see \Rector\Tests\Php54\Rector\FuncCall\RemoveReferenceFromCallRector\RemoveReferenceFromCallRectorTest */ -final class RemoveReferenceFromCallRector extends AbstractRector +final class RemoveReferenceFromCallRector extends AbstractRector implements MinPhpVersionInterface { + public function provideMinPhpVersion(): int + { + return PhpVersionFeature::NO_REFERENCE_IN_ARG; + } + public function getRuleDefinition(): RuleDefinition { return new RuleDefinition('Remove & from function and method calls', [ diff --git a/rules/Php55/Rector/FuncCall/PregReplaceEModifierRector.php b/rules/Php55/Rector/FuncCall/PregReplaceEModifierRector.php index 23fbf6d1db0..e16fed8d24c 100644 --- a/rules/Php55/Rector/FuncCall/PregReplaceEModifierRector.php +++ b/rules/Php55/Rector/FuncCall/PregReplaceEModifierRector.php @@ -10,8 +10,10 @@ use PhpParser\Node\Expr\Closure; use PhpParser\Node\Expr\FuncCall; use PhpParser\Node\Name; use Rector\Core\Rector\AbstractRector; +use Rector\Core\ValueObject\PhpVersionFeature; use Rector\Php55\RegexMatcher; use Rector\Php72\NodeFactory\AnonymousFunctionFactory; +use Rector\VersionBonding\Contract\MinPhpVersionInterface; use Symplify\RuleDocGenerator\ValueObject\CodeSample\CodeSample; use Symplify\RuleDocGenerator\ValueObject\RuleDefinition; @@ -20,7 +22,7 @@ use Symplify\RuleDocGenerator\ValueObject\RuleDefinition; * * @see \Rector\Tests\Php55\Rector\FuncCall\PregReplaceEModifierRector\PregReplaceEModifierRectorTest */ -final class PregReplaceEModifierRector extends AbstractRector +final class PregReplaceEModifierRector extends AbstractRector implements MinPhpVersionInterface { public function __construct( private AnonymousFunctionFactory $anonymousFunctionFactory, @@ -28,6 +30,11 @@ final class PregReplaceEModifierRector extends AbstractRector ) { } + public function provideMinPhpVersion(): int + { + return PhpVersionFeature::PREG_REPLACE_CALLBACK_E_MODIFIER; + } + public function getRuleDefinition(): RuleDefinition { return new RuleDefinition( diff --git a/rules/Php56/Rector/FunctionLike/AddDefaultValueForUndefinedVariableRector.php b/rules/Php56/Rector/FunctionLike/AddDefaultValueForUndefinedVariableRector.php index b3923ed0c51..2aaec4778b1 100644 --- a/rules/Php56/Rector/FunctionLike/AddDefaultValueForUndefinedVariableRector.php +++ b/rules/Php56/Rector/FunctionLike/AddDefaultValueForUndefinedVariableRector.php @@ -16,7 +16,9 @@ use PhpParser\Node\Stmt\Expression; use PhpParser\Node\Stmt\Function_; use Rector\Core\NodeAnalyzer\InlineHTMLAnalyzer; use Rector\Core\Rector\AbstractRector; +use Rector\Core\ValueObject\PhpVersionFeature; use Rector\Php56\NodeAnalyzer\UndefinedVariableResolver; +use Rector\VersionBonding\Contract\MinPhpVersionInterface; use Symplify\RuleDocGenerator\ValueObject\CodeSample\CodeSample; use Symplify\RuleDocGenerator\ValueObject\RuleDefinition; @@ -26,7 +28,7 @@ use Symplify\RuleDocGenerator\ValueObject\RuleDefinition; * * @see \Rector\Tests\Php56\Rector\FunctionLike\AddDefaultValueForUndefinedVariableRector\AddDefaultValueForUndefinedVariableRectorTest */ -final class AddDefaultValueForUndefinedVariableRector extends AbstractRector +final class AddDefaultValueForUndefinedVariableRector extends AbstractRector implements MinPhpVersionInterface { /** * @var string @@ -39,6 +41,11 @@ final class AddDefaultValueForUndefinedVariableRector extends AbstractRector ) { } + public function provideMinPhpVersion(): int + { + return PhpVersionFeature::REQUIRE_DEFAULT_VALUE; + } + public function getRuleDefinition(): RuleDefinition { return new RuleDefinition('Adds default value for undefined variable', [ diff --git a/rules/Php70/Rector/Assign/ListSplitStringRector.php b/rules/Php70/Rector/Assign/ListSplitStringRector.php index b7bb0238150..050fd9f8662 100644 --- a/rules/Php70/Rector/Assign/ListSplitStringRector.php +++ b/rules/Php70/Rector/Assign/ListSplitStringRector.php @@ -9,6 +9,8 @@ use PhpParser\Node\Expr\Assign; use PhpParser\Node\Expr\List_; use PHPStan\Type\StringType; use Rector\Core\Rector\AbstractRector; +use Rector\Core\ValueObject\PhpVersionFeature; +use Rector\VersionBonding\Contract\MinPhpVersionInterface; use Symplify\RuleDocGenerator\ValueObject\CodeSample\CodeSample; use Symplify\RuleDocGenerator\ValueObject\RuleDefinition; @@ -18,7 +20,7 @@ use Symplify\RuleDocGenerator\ValueObject\RuleDefinition; * @changelog https://stackoverflow.com/a/47965344/1348344 * @see \Rector\Tests\Php70\Rector\Assign\ListSplitStringRector\ListSplitStringRectorTest */ -final class ListSplitStringRector extends AbstractRector +final class ListSplitStringRector extends AbstractRector implements MinPhpVersionInterface { public function getRuleDefinition(): RuleDefinition { @@ -28,6 +30,11 @@ final class ListSplitStringRector extends AbstractRector ); } + public function provideMinPhpVersion(): int + { + return PhpVersionFeature::NO_LIST_SPLIT_STRING; + } + /** * @return array> */ diff --git a/rules/Php70/Rector/Break_/BreakNotInLoopOrSwitchToReturnRector.php b/rules/Php70/Rector/Break_/BreakNotInLoopOrSwitchToReturnRector.php index a0932aa581b..85b8d40b502 100644 --- a/rules/Php70/Rector/Break_/BreakNotInLoopOrSwitchToReturnRector.php +++ b/rules/Php70/Rector/Break_/BreakNotInLoopOrSwitchToReturnRector.php @@ -8,7 +8,9 @@ use PhpParser\Node; use PhpParser\Node\Stmt\Break_; use PhpParser\Node\Stmt\Return_; use Rector\Core\Rector\AbstractRector; +use Rector\Core\ValueObject\PhpVersionFeature; use Rector\NodeNestingScope\ContextAnalyzer; +use Rector\VersionBonding\Contract\MinPhpVersionInterface; use Symplify\RuleDocGenerator\ValueObject\CodeSample\CodeSample; use Symplify\RuleDocGenerator\ValueObject\RuleDefinition; @@ -18,13 +20,18 @@ use Symplify\RuleDocGenerator\ValueObject\RuleDefinition; * @see https://3v4l.org/Qtelt * @see \Rector\Tests\Php70\Rector\Break_\BreakNotInLoopOrSwitchToReturnRector\BreakNotInLoopOrSwitchToReturnRectorTest */ -final class BreakNotInLoopOrSwitchToReturnRector extends AbstractRector +final class BreakNotInLoopOrSwitchToReturnRector extends AbstractRector implements MinPhpVersionInterface { public function __construct( private ContextAnalyzer $contextAnalyzer ) { } + public function provideMinPhpVersion(): int + { + return PhpVersionFeature::NO_BREAK_OUTSIDE_LOOP; + } + public function getRuleDefinition(): RuleDefinition { return new RuleDefinition( diff --git a/rules/Php70/Rector/ClassMethod/Php4ConstructorRector.php b/rules/Php70/Rector/ClassMethod/Php4ConstructorRector.php index a4df43d3e52..4420039e1be 100644 --- a/rules/Php70/Rector/ClassMethod/Php4ConstructorRector.php +++ b/rules/Php70/Rector/ClassMethod/Php4ConstructorRector.php @@ -17,8 +17,10 @@ use PHPStan\Analyser\Scope; use PHPStan\Reflection\ClassReflection; use Rector\Core\Rector\AbstractRector; use Rector\Core\ValueObject\MethodName; +use Rector\Core\ValueObject\PhpVersionFeature; use Rector\NodeTypeResolver\Node\AttributeKey; use Rector\Php70\NodeAnalyzer\Php4ConstructorClassMethodAnalyzer; +use Rector\VersionBonding\Contract\MinPhpVersionInterface; use Symplify\RuleDocGenerator\ValueObject\CodeSample\CodeSample; use Symplify\RuleDocGenerator\ValueObject\RuleDefinition; @@ -26,13 +28,18 @@ use Symplify\RuleDocGenerator\ValueObject\RuleDefinition; * @changelog https://wiki.php.net/rfc/remove_php4_constructors * @see \Rector\Tests\Php70\Rector\ClassMethod\Php4ConstructorRector\Php4ConstructorRectorTest */ -final class Php4ConstructorRector extends AbstractRector +final class Php4ConstructorRector extends AbstractRector implements MinPhpVersionInterface { public function __construct( private Php4ConstructorClassMethodAnalyzer $php4ConstructorClassMethodAnalyzer ) { } + public function provideMinPhpVersion(): int + { + return PhpVersionFeature::NO_PHP4_CONSTRUCTOR; + } + public function getRuleDefinition(): RuleDefinition { return new RuleDefinition( diff --git a/rules/Php70/Rector/FuncCall/CallUserMethodRector.php b/rules/Php70/Rector/FuncCall/CallUserMethodRector.php index 02bf8a7de50..d4c25691a2b 100644 --- a/rules/Php70/Rector/FuncCall/CallUserMethodRector.php +++ b/rules/Php70/Rector/FuncCall/CallUserMethodRector.php @@ -8,13 +8,15 @@ use PhpParser\Node; use PhpParser\Node\Expr\FuncCall; use PhpParser\Node\Name; use Rector\Core\Rector\AbstractRector; +use Rector\Core\ValueObject\PhpVersionFeature; +use Rector\VersionBonding\Contract\MinPhpVersionInterface; use Symplify\RuleDocGenerator\ValueObject\CodeSample\CodeSample; use Symplify\RuleDocGenerator\ValueObject\RuleDefinition; /** * @see \Rector\Tests\Php70\Rector\FuncCall\CallUserMethodRector\CallUserMethodRectorTest */ -final class CallUserMethodRector extends AbstractRector +final class CallUserMethodRector extends AbstractRector implements MinPhpVersionInterface { /** * @var array @@ -24,6 +26,11 @@ final class CallUserMethodRector extends AbstractRector 'call_user_method_array' => 'call_user_func_array', ]; + public function provideMinPhpVersion(): int + { + return PhpVersionFeature::NO_CALL_USER_METHOD; + } + public function getRuleDefinition(): RuleDefinition { return new RuleDefinition( diff --git a/rules/Php70/Rector/FuncCall/EregToPregMatchRector.php b/rules/Php70/Rector/FuncCall/EregToPregMatchRector.php index 027f34097d2..50fa4e088e5 100644 --- a/rules/Php70/Rector/FuncCall/EregToPregMatchRector.php +++ b/rules/Php70/Rector/FuncCall/EregToPregMatchRector.php @@ -16,8 +16,10 @@ use PhpParser\Node\Name; use PhpParser\Node\Scalar\LNumber; use PhpParser\Node\Scalar\String_; use Rector\Core\Rector\AbstractRector; +use Rector\Core\ValueObject\PhpVersionFeature; use Rector\NodeTypeResolver\Node\AttributeKey; use Rector\Php70\EregToPcreTransformer; +use Rector\VersionBonding\Contract\MinPhpVersionInterface; use Symplify\RuleDocGenerator\ValueObject\CodeSample\CodeSample; use Symplify\RuleDocGenerator\ValueObject\RuleDefinition; @@ -26,7 +28,7 @@ use Symplify\RuleDocGenerator\ValueObject\RuleDefinition; * * @see \Rector\Tests\Php70\Rector\FuncCall\EregToPregMatchRector\EregToPregMatchRectorTest */ -final class EregToPregMatchRector extends AbstractRector +final class EregToPregMatchRector extends AbstractRector implements MinPhpVersionInterface { /** * @var array @@ -45,6 +47,11 @@ final class EregToPregMatchRector extends AbstractRector ) { } + public function provideMinPhpVersion(): int + { + return PhpVersionFeature::NO_EREG_FUNCTION; + } + public function getRuleDefinition(): RuleDefinition { return new RuleDefinition( diff --git a/rules/Php70/Rector/FuncCall/NonVariableToVariableOnFunctionCallRector.php b/rules/Php70/Rector/FuncCall/NonVariableToVariableOnFunctionCallRector.php index 5ffd1957fe8..a3ff197b7ba 100644 --- a/rules/Php70/Rector/FuncCall/NonVariableToVariableOnFunctionCallRector.php +++ b/rules/Php70/Rector/FuncCall/NonVariableToVariableOnFunctionCallRector.php @@ -23,10 +23,12 @@ use PHPStan\Reflection\ParameterReflection; use PHPStan\Type\MixedType; use Rector\Core\Rector\AbstractRector; use Rector\Core\Reflection\ReflectionResolver; +use Rector\Core\ValueObject\PhpVersionFeature; use Rector\Naming\Naming\VariableNaming; use Rector\NodeNestingScope\ParentScopeFinder; use Rector\NodeTypeResolver\Node\AttributeKey; use Rector\Php70\ValueObject\VariableAssignPair; +use Rector\VersionBonding\Contract\MinPhpVersionInterface; use Symplify\RuleDocGenerator\ValueObject\CodeSample\CodeSample; use Symplify\RuleDocGenerator\ValueObject\RuleDefinition; @@ -35,7 +37,7 @@ use Symplify\RuleDocGenerator\ValueObject\RuleDefinition; * * @see \Rector\Tests\Php70\Rector\FuncCall\NonVariableToVariableOnFunctionCallRector\NonVariableToVariableOnFunctionCallRectorTest */ -final class NonVariableToVariableOnFunctionCallRector extends AbstractRector +final class NonVariableToVariableOnFunctionCallRector extends AbstractRector implements MinPhpVersionInterface { public function __construct( private VariableNaming $variableNaming, @@ -52,6 +54,11 @@ final class NonVariableToVariableOnFunctionCallRector extends AbstractRector ); } + public function provideMinPhpVersion(): int + { + return PhpVersionFeature::VARIABLE_ON_FUNC_CALL; + } + /** * @return array> */ diff --git a/rules/Php70/Rector/FuncCall/RenameMktimeWithoutArgsToTimeRector.php b/rules/Php70/Rector/FuncCall/RenameMktimeWithoutArgsToTimeRector.php index a800b3dda4b..d2f97302f8b 100644 --- a/rules/Php70/Rector/FuncCall/RenameMktimeWithoutArgsToTimeRector.php +++ b/rules/Php70/Rector/FuncCall/RenameMktimeWithoutArgsToTimeRector.php @@ -8,6 +8,8 @@ use PhpParser\Node; use PhpParser\Node\Expr\FuncCall; use PhpParser\Node\Name; use Rector\Core\Rector\AbstractRector; +use Rector\Core\ValueObject\PhpVersionFeature; +use Rector\VersionBonding\Contract\MinPhpVersionInterface; use Symplify\RuleDocGenerator\ValueObject\CodeSample\CodeSample; use Symplify\RuleDocGenerator\ValueObject\RuleDefinition; @@ -15,7 +17,7 @@ use Symplify\RuleDocGenerator\ValueObject\RuleDefinition; * @see https://3v4l.org/F5GE8 * @see \Rector\Tests\Php70\Rector\FuncCall\RenameMktimeWithoutArgsToTimeRector\RenameMktimeWithoutArgsToTimeRectorTest */ -final class RenameMktimeWithoutArgsToTimeRector extends AbstractRector +final class RenameMktimeWithoutArgsToTimeRector extends AbstractRector implements MinPhpVersionInterface { public function getRuleDefinition(): RuleDefinition { @@ -49,6 +51,11 @@ CODE_SAMPLE ); } + public function provideMinPhpVersion(): int + { + return PhpVersionFeature::NO_MKTIME_WITHOUT_ARG; + } + /** * @return array> */ diff --git a/rules/Php70/Rector/List_/EmptyListRector.php b/rules/Php70/Rector/List_/EmptyListRector.php index f4f56bb554c..044b8a94bb0 100644 --- a/rules/Php70/Rector/List_/EmptyListRector.php +++ b/rules/Php70/Rector/List_/EmptyListRector.php @@ -9,6 +9,8 @@ use PhpParser\Node\Expr\ArrayItem; use PhpParser\Node\Expr\List_; use PhpParser\Node\Expr\Variable; use Rector\Core\Rector\AbstractRector; +use Rector\Core\ValueObject\PhpVersionFeature; +use Rector\VersionBonding\Contract\MinPhpVersionInterface; use Symplify\RuleDocGenerator\ValueObject\CodeSample\CodeSample; use Symplify\RuleDocGenerator\ValueObject\RuleDefinition; @@ -16,7 +18,7 @@ use Symplify\RuleDocGenerator\ValueObject\RuleDefinition; * @changelog http://php.net/manual/en/migration70.incompatible.php#migration70.incompatible.variable-handling.list * @see \Rector\Tests\Php70\Rector\List_\EmptyListRector\EmptyListRectorTest */ -final class EmptyListRector extends AbstractRector +final class EmptyListRector extends AbstractRector implements MinPhpVersionInterface { public function getRuleDefinition(): RuleDefinition { @@ -34,6 +36,11 @@ CODE_SAMPLE ); } + public function provideMinPhpVersion(): int + { + return PhpVersionFeature::NO_EMPTY_LIST; + } + /** * @return array> */ diff --git a/rules/Php70/Rector/MethodCall/ThisCallOnStaticMethodToStaticCallRector.php b/rules/Php70/Rector/MethodCall/ThisCallOnStaticMethodToStaticCallRector.php index f0a63d766dc..0664b0e90a0 100644 --- a/rules/Php70/Rector/MethodCall/ThisCallOnStaticMethodToStaticCallRector.php +++ b/rules/Php70/Rector/MethodCall/ThisCallOnStaticMethodToStaticCallRector.php @@ -12,8 +12,10 @@ use PHPStan\Reflection\Php\PhpMethodReflection; use PHPStan\Type\ObjectType; use Rector\Core\Rector\AbstractRector; use Rector\Core\Reflection\ReflectionResolver; +use Rector\Core\ValueObject\PhpVersionFeature; use Rector\NodeCollector\StaticAnalyzer; use Rector\NodeTypeResolver\Node\AttributeKey; +use Rector\VersionBonding\Contract\MinPhpVersionInterface; use Symplify\RuleDocGenerator\ValueObject\CodeSample\CodeSample; use Symplify\RuleDocGenerator\ValueObject\RuleDefinition; @@ -21,7 +23,7 @@ use Symplify\RuleDocGenerator\ValueObject\RuleDefinition; * @see https://3v4l.org/rkiSC * @see \Rector\Tests\Php70\Rector\MethodCall\ThisCallOnStaticMethodToStaticCallRector\ThisCallOnStaticMethodToStaticCallRectorTest */ -final class ThisCallOnStaticMethodToStaticCallRector extends AbstractRector +final class ThisCallOnStaticMethodToStaticCallRector extends AbstractRector implements MinPhpVersionInterface { public function __construct( private StaticAnalyzer $staticAnalyzer, @@ -29,6 +31,11 @@ final class ThisCallOnStaticMethodToStaticCallRector extends AbstractRector ) { } + public function provideMinPhpVersion(): int + { + return PhpVersionFeature::STATIC_CALL; + } + public function getRuleDefinition(): RuleDefinition { return new RuleDefinition( diff --git a/rules/Php70/Rector/StaticCall/StaticCallOnNonStaticToInstanceCallRector.php b/rules/Php70/Rector/StaticCall/StaticCallOnNonStaticToInstanceCallRector.php index a0bf0103508..5b23ef07f71 100644 --- a/rules/Php70/Rector/StaticCall/StaticCallOnNonStaticToInstanceCallRector.php +++ b/rules/Php70/Rector/StaticCall/StaticCallOnNonStaticToInstanceCallRector.php @@ -15,8 +15,10 @@ use PHPStan\Reflection\ReflectionProvider; use PHPStan\Type\ObjectType; use Rector\Core\Rector\AbstractRector; use Rector\Core\Reflection\ReflectionResolver; +use Rector\Core\ValueObject\PhpVersionFeature; use Rector\NodeCollector\ScopeResolver\ParentClassScopeResolver; use Rector\NodeCollector\StaticAnalyzer; +use Rector\VersionBonding\Contract\MinPhpVersionInterface; use ReflectionMethod; use Symplify\RuleDocGenerator\ValueObject\CodeSample\CodeSample; use Symplify\RuleDocGenerator\ValueObject\RuleDefinition; @@ -26,7 +28,7 @@ use Symplify\RuleDocGenerator\ValueObject\RuleDefinition; * * @see \Rector\Tests\Php70\Rector\StaticCall\StaticCallOnNonStaticToInstanceCallRector\StaticCallOnNonStaticToInstanceCallRectorTest */ -final class StaticCallOnNonStaticToInstanceCallRector extends AbstractRector +final class StaticCallOnNonStaticToInstanceCallRector extends AbstractRector implements MinPhpVersionInterface { public function __construct( private StaticAnalyzer $staticAnalyzer, @@ -36,6 +38,11 @@ final class StaticCallOnNonStaticToInstanceCallRector extends AbstractRector ) { } + public function provideMinPhpVersion(): int + { + return PhpVersionFeature::INSTANCE_CALL; + } + public function getRuleDefinition(): RuleDefinition { return new RuleDefinition( diff --git a/rules/Php70/Rector/Switch_/ReduceMultipleDefaultSwitchRector.php b/rules/Php70/Rector/Switch_/ReduceMultipleDefaultSwitchRector.php index bb0aaee03d3..1a1756cac7f 100644 --- a/rules/Php70/Rector/Switch_/ReduceMultipleDefaultSwitchRector.php +++ b/rules/Php70/Rector/Switch_/ReduceMultipleDefaultSwitchRector.php @@ -8,7 +8,9 @@ use PhpParser\Node; use PhpParser\Node\Stmt\Case_; use PhpParser\Node\Stmt\Switch_; use Rector\Core\Rector\AbstractRector; +use Rector\Core\ValueObject\PhpVersionFeature; use Rector\NodeTypeResolver\Node\AttributeKey; +use Rector\VersionBonding\Contract\MinPhpVersionInterface; use Symplify\RuleDocGenerator\ValueObject\CodeSample\CodeSample; use Symplify\RuleDocGenerator\ValueObject\RuleDefinition; @@ -19,8 +21,13 @@ use Symplify\RuleDocGenerator\ValueObject\RuleDefinition; * * @see \Rector\Tests\Php70\Rector\Switch_\ReduceMultipleDefaultSwitchRector\ReduceMultipleDefaultSwitchRectorTest */ -final class ReduceMultipleDefaultSwitchRector extends AbstractRector +final class ReduceMultipleDefaultSwitchRector extends AbstractRector implements MinPhpVersionInterface { + public function provideMinPhpVersion(): int + { + return PhpVersionFeature::NO_MULTIPLE_DEFAULT_SWITCH; + } + public function getRuleDefinition(): RuleDefinition { return new RuleDefinition( diff --git a/rules/Php70/Rector/Variable/WrapVariableVariableNameInCurlyBracesRector.php b/rules/Php70/Rector/Variable/WrapVariableVariableNameInCurlyBracesRector.php index 9594a6cef33..e96ad387d67 100644 --- a/rules/Php70/Rector/Variable/WrapVariableVariableNameInCurlyBracesRector.php +++ b/rules/Php70/Rector/Variable/WrapVariableVariableNameInCurlyBracesRector.php @@ -8,6 +8,8 @@ use PhpParser\Node; use PhpParser\Node\Expr\PropertyFetch; use PhpParser\Node\Expr\Variable; use Rector\Core\Rector\AbstractRector; +use Rector\Core\ValueObject\PhpVersionFeature; +use Rector\VersionBonding\Contract\MinPhpVersionInterface; use Symplify\RuleDocGenerator\ValueObject\CodeSample\CodeSample; use Symplify\RuleDocGenerator\ValueObject\RuleDefinition; @@ -15,8 +17,13 @@ use Symplify\RuleDocGenerator\ValueObject\RuleDefinition; * @see \Rector\Tests\Php70\Rector\Variable\WrapVariableVariableNameInCurlyBracesRector\WrapVariableVariableNameInCurlyBracesRectorTest * @changelog https://www.php.net/manual/en/language.variables.variable.php */ -final class WrapVariableVariableNameInCurlyBracesRector extends AbstractRector +final class WrapVariableVariableNameInCurlyBracesRector extends AbstractRector implements MinPhpVersionInterface { + public function provideMinPhpVersion(): int + { + return PhpVersionFeature::WRAP_VARIABLE_VARIABLE; + } + public function getRuleDefinition(): RuleDefinition { return new RuleDefinition( diff --git a/rules/Php71/Rector/Assign/AssignArrayToStringRector.php b/rules/Php71/Rector/Assign/AssignArrayToStringRector.php index 6a2c1bf6a89..9d70ef00968 100644 --- a/rules/Php71/Rector/Assign/AssignArrayToStringRector.php +++ b/rules/Php71/Rector/Assign/AssignArrayToStringRector.php @@ -15,7 +15,9 @@ use PhpParser\Node\Expr\Variable; use PhpParser\Node\Scalar\String_; use PhpParser\Node\Stmt\Property; use Rector\Core\Rector\AbstractRector; +use Rector\Core\ValueObject\PhpVersionFeature; use Rector\NodeTypeResolver\Node\AttributeKey; +use Rector\VersionBonding\Contract\MinPhpVersionInterface; use Symplify\RuleDocGenerator\ValueObject\CodeSample\CodeSample; use Symplify\RuleDocGenerator\ValueObject\RuleDefinition; @@ -24,8 +26,13 @@ use Symplify\RuleDocGenerator\ValueObject\RuleDefinition; * * @see \Rector\Tests\Php71\Rector\Assign\AssignArrayToStringRector\AssignArrayToStringRectorTest */ -final class AssignArrayToStringRector extends AbstractRector +final class AssignArrayToStringRector extends AbstractRector implements MinPhpVersionInterface { + public function provideMinPhpVersion(): int + { + return PhpVersionFeature::NO_ASSIGN_ARRAY_TO_STRING; + } + public function getRuleDefinition(): RuleDefinition { return new RuleDefinition( diff --git a/rules/Php71/Rector/BinaryOp/BinaryOpBetweenNumberAndStringRector.php b/rules/Php71/Rector/BinaryOp/BinaryOpBetweenNumberAndStringRector.php index 3ed8d706622..23707c69a1b 100644 --- a/rules/Php71/Rector/BinaryOp/BinaryOpBetweenNumberAndStringRector.php +++ b/rules/Php71/Rector/BinaryOp/BinaryOpBetweenNumberAndStringRector.php @@ -16,6 +16,8 @@ use PhpParser\Node\Scalar\MagicConst\Line; use PhpParser\Node\Scalar\String_; use PHPStan\Type\Constant\ConstantStringType; use Rector\Core\Rector\AbstractRector; +use Rector\Core\ValueObject\PhpVersionFeature; +use Rector\VersionBonding\Contract\MinPhpVersionInterface; use Symplify\RuleDocGenerator\ValueObject\CodeSample\CodeSample; use Symplify\RuleDocGenerator\ValueObject\RuleDefinition; @@ -24,8 +26,13 @@ use Symplify\RuleDocGenerator\ValueObject\RuleDefinition; * @see https://3v4l.org/ObNQZ * @see \Rector\Tests\Php71\Rector\BinaryOp\BinaryOpBetweenNumberAndStringRector\BinaryOpBetweenNumberAndStringRectorTest */ -final class BinaryOpBetweenNumberAndStringRector extends AbstractRector +final class BinaryOpBetweenNumberAndStringRector extends AbstractRector implements MinPhpVersionInterface { + public function provideMinPhpVersion(): int + { + return PhpVersionFeature::BINARY_OP_NUMBER_STRING; + } + public function getRuleDefinition(): RuleDefinition { return new RuleDefinition( diff --git a/rules/Php71/Rector/BooleanOr/IsIterableRector.php b/rules/Php71/Rector/BooleanOr/IsIterableRector.php index f3232c6345f..15ff0471e41 100644 --- a/rules/Php71/Rector/BooleanOr/IsIterableRector.php +++ b/rules/Php71/Rector/BooleanOr/IsIterableRector.php @@ -11,13 +11,14 @@ use PHPStan\Reflection\ReflectionProvider; use Rector\Core\Rector\AbstractRector; use Rector\Core\ValueObject\PhpVersionFeature; use Rector\Php71\IsArrayAndDualCheckToAble; +use Rector\VersionBonding\Contract\MinPhpVersionInterface; use Symplify\RuleDocGenerator\ValueObject\CodeSample\CodeSample; use Symplify\RuleDocGenerator\ValueObject\RuleDefinition; /** * @see \Rector\Tests\Php71\Rector\BooleanOr\IsIterableRector\IsIterableRectorTest */ -final class IsIterableRector extends AbstractRector +final class IsIterableRector extends AbstractRector implements MinPhpVersionInterface { public function __construct( private IsArrayAndDualCheckToAble $isArrayAndDualCheckToAble, @@ -25,6 +26,11 @@ final class IsIterableRector extends AbstractRector ) { } + public function provideMinPhpVersion(): int + { + return PhpVersionFeature::IS_ITERABLE; + } + public function getRuleDefinition(): RuleDefinition { return new RuleDefinition( diff --git a/rules/Php71/Rector/FuncCall/CountOnNullRector.php b/rules/Php71/Rector/FuncCall/CountOnNullRector.php index 446c145b226..8ced84845da 100644 --- a/rules/Php71/Rector/FuncCall/CountOnNullRector.php +++ b/rules/Php71/Rector/FuncCall/CountOnNullRector.php @@ -25,6 +25,7 @@ use Rector\Core\ValueObject\PhpVersionFeature; use Rector\NodeTypeResolver\Node\AttributeKey; use Rector\NodeTypeResolver\TypeAnalyzer\CountableTypeAnalyzer; use Rector\Php71\NodeAnalyzer\CountableAnalyzer; +use Rector\VersionBonding\Contract\MinPhpVersionInterface; use Symplify\RuleDocGenerator\ValueObject\CodeSample\CodeSample; use Symplify\RuleDocGenerator\ValueObject\RuleDefinition; @@ -33,7 +34,7 @@ use Symplify\RuleDocGenerator\ValueObject\RuleDefinition; * * @see \Rector\Tests\Php71\Rector\FuncCall\CountOnNullRector\CountOnNullRectorTest */ -final class CountOnNullRector extends AbstractRector +final class CountOnNullRector extends AbstractRector implements MinPhpVersionInterface { /** * @var string @@ -46,6 +47,11 @@ final class CountOnNullRector extends AbstractRector ) { } + public function provideMinPhpVersion(): int + { + return PhpVersionFeature::COUNT_ON_NULL; + } + public function getRuleDefinition(): RuleDefinition { return new RuleDefinition( diff --git a/rules/Php71/Rector/FuncCall/RemoveExtraParametersRector.php b/rules/Php71/Rector/FuncCall/RemoveExtraParametersRector.php index 9391fcc5d58..3853da5001c 100644 --- a/rules/Php71/Rector/FuncCall/RemoveExtraParametersRector.php +++ b/rules/Php71/Rector/FuncCall/RemoveExtraParametersRector.php @@ -16,6 +16,8 @@ use PHPStan\Reflection\Type\UnionTypeMethodReflection; use Rector\Core\NodeAnalyzer\VariadicAnalyzer; use Rector\Core\Rector\AbstractRector; use Rector\Core\Reflection\ReflectionResolver; +use Rector\Core\ValueObject\PhpVersionFeature; +use Rector\VersionBonding\Contract\MinPhpVersionInterface; use Symplify\RuleDocGenerator\ValueObject\CodeSample\CodeSample; use Symplify\RuleDocGenerator\ValueObject\RuleDefinition; @@ -25,7 +27,7 @@ use Symplify\RuleDocGenerator\ValueObject\RuleDefinition; * * @see \Rector\Tests\Php71\Rector\FuncCall\RemoveExtraParametersRector\RemoveExtraParametersRectorTest */ -final class RemoveExtraParametersRector extends AbstractRector +final class RemoveExtraParametersRector extends AbstractRector implements MinPhpVersionInterface { public function __construct( private VariadicAnalyzer $variadicAnalyzer, @@ -33,6 +35,11 @@ final class RemoveExtraParametersRector extends AbstractRector ) { } + public function provideMinPhpVersion(): int + { + return PhpVersionFeature::NO_EXTRA_PARAMETERS; + } + public function getRuleDefinition(): RuleDefinition { return new RuleDefinition('Remove extra parameters', [ diff --git a/rules/Php71/Rector/Name/ReservedObjectRector.php b/rules/Php71/Rector/Name/ReservedObjectRector.php index fb2f1f17c26..823f78c3bda 100644 --- a/rules/Php71/Rector/Name/ReservedObjectRector.php +++ b/rules/Php71/Rector/Name/ReservedObjectRector.php @@ -10,7 +10,9 @@ use PhpParser\Node\Name; use PhpParser\Node\Stmt\Namespace_; use Rector\Core\Contract\Rector\ConfigurableRectorInterface; use Rector\Core\Rector\AbstractRector; +use Rector\Core\ValueObject\PhpVersionFeature; use Rector\NodeTypeResolver\Node\AttributeKey; +use Rector\VersionBonding\Contract\MinPhpVersionInterface; use Symplify\RuleDocGenerator\ValueObject\CodeSample\ConfiguredCodeSample; use Symplify\RuleDocGenerator\ValueObject\RuleDefinition; @@ -19,7 +21,7 @@ use Symplify\RuleDocGenerator\ValueObject\RuleDefinition; * * @see \Rector\Tests\Php71\Rector\Name\ReservedObjectRector\ReservedObjectRectorTest */ -final class ReservedObjectRector extends AbstractRector implements ConfigurableRectorInterface +final class ReservedObjectRector extends AbstractRector implements ConfigurableRectorInterface, MinPhpVersionInterface { /** * @var string @@ -31,6 +33,11 @@ final class ReservedObjectRector extends AbstractRector implements ConfigurableR */ private array $reservedKeywordsToReplacements = []; + public function provideMinPhpVersion(): int + { + return PhpVersionFeature::RESERVED_OBJECT_KEYWORD; + } + public function getRuleDefinition(): RuleDefinition { return new RuleDefinition( diff --git a/rules/Php72/Rector/Assign/ListEachRector.php b/rules/Php72/Rector/Assign/ListEachRector.php index 278c6672538..904c8462ef8 100644 --- a/rules/Php72/Rector/Assign/ListEachRector.php +++ b/rules/Php72/Rector/Assign/ListEachRector.php @@ -13,7 +13,9 @@ use PhpParser\Node\Stmt\Expression; use Rector\Core\Exception\ShouldNotHappenException; use Rector\Core\NodeManipulator\AssignManipulator; use Rector\Core\Rector\AbstractRector; +use Rector\Core\ValueObject\PhpVersionFeature; use Rector\NodeTypeResolver\Node\AttributeKey; +use Rector\VersionBonding\Contract\MinPhpVersionInterface; use Symplify\RuleDocGenerator\ValueObject\CodeSample\CodeSample; use Symplify\RuleDocGenerator\ValueObject\RuleDefinition; @@ -22,13 +24,18 @@ use Symplify\RuleDocGenerator\ValueObject\RuleDefinition; * * @see \Rector\Tests\Php72\Rector\Assign\ListEachRector\ListEachRectorTest */ -final class ListEachRector extends AbstractRector +final class ListEachRector extends AbstractRector implements MinPhpVersionInterface { public function __construct( private AssignManipulator $assignManipulator ) { } + public function provideMinPhpVersion(): int + { + return PhpVersionFeature::DEPRECATE_EACH; + } + public function getRuleDefinition(): RuleDefinition { return new RuleDefinition( diff --git a/rules/Php72/Rector/Assign/ReplaceEachAssignmentWithKeyCurrentRector.php b/rules/Php72/Rector/Assign/ReplaceEachAssignmentWithKeyCurrentRector.php index aef6b9ed220..3455aff69a1 100644 --- a/rules/Php72/Rector/Assign/ReplaceEachAssignmentWithKeyCurrentRector.php +++ b/rules/Php72/Rector/Assign/ReplaceEachAssignmentWithKeyCurrentRector.php @@ -14,20 +14,27 @@ use PhpParser\Node\Expr\FuncCall; use PhpParser\Node\Expr\List_; use PhpParser\Node\Stmt\While_; use Rector\Core\Rector\AbstractRector; +use Rector\Core\ValueObject\PhpVersionFeature; use Rector\NodeTypeResolver\Node\AttributeKey; +use Rector\VersionBonding\Contract\MinPhpVersionInterface; use Symplify\RuleDocGenerator\ValueObject\CodeSample\CodeSample; use Symplify\RuleDocGenerator\ValueObject\RuleDefinition; /** * @see \Rector\Tests\Php72\Rector\Assign\ReplaceEachAssignmentWithKeyCurrentRector\ReplaceEachAssignmentWithKeyCurrentRectorTest */ -final class ReplaceEachAssignmentWithKeyCurrentRector extends AbstractRector +final class ReplaceEachAssignmentWithKeyCurrentRector extends AbstractRector implements MinPhpVersionInterface { /** * @var string */ private const KEY = 'key'; + public function provideMinPhpVersion(): int + { + return PhpVersionFeature::NO_EACH_OUTSIDE_LOOP; + } + public function getRuleDefinition(): RuleDefinition { return new RuleDefinition('Replace each() assign outside loop', [ diff --git a/rules/Php72/Rector/FuncCall/CreateFunctionToAnonymousFunctionRector.php b/rules/Php72/Rector/FuncCall/CreateFunctionToAnonymousFunctionRector.php index 83edf84e3e2..b58e3a45453 100644 --- a/rules/Php72/Rector/FuncCall/CreateFunctionToAnonymousFunctionRector.php +++ b/rules/Php72/Rector/FuncCall/CreateFunctionToAnonymousFunctionRector.php @@ -21,7 +21,9 @@ use Rector\Core\Exception\ShouldNotHappenException; use Rector\Core\Php\ReservedKeywordAnalyzer; use Rector\Core\PhpParser\Parser\InlineCodeParser; use Rector\Core\Rector\AbstractRector; +use Rector\Core\ValueObject\PhpVersionFeature; use Rector\Php72\NodeFactory\AnonymousFunctionFactory; +use Rector\VersionBonding\Contract\MinPhpVersionInterface; use Symplify\RuleDocGenerator\ValueObject\CodeSample\CodeSample; use Symplify\RuleDocGenerator\ValueObject\RuleDefinition; @@ -30,7 +32,7 @@ use Symplify\RuleDocGenerator\ValueObject\RuleDefinition; * * @see \Rector\Tests\Php72\Rector\FuncCall\CreateFunctionToAnonymousFunctionRector\CreateFunctionToAnonymousFunctionRectorTest */ -final class CreateFunctionToAnonymousFunctionRector extends AbstractRector +final class CreateFunctionToAnonymousFunctionRector extends AbstractRector implements MinPhpVersionInterface { public function __construct( private InlineCodeParser $inlineCodeParser, @@ -39,6 +41,11 @@ final class CreateFunctionToAnonymousFunctionRector extends AbstractRector ) { } + public function provideMinPhpVersion(): int + { + return PhpVersionFeature::DEPRECATE_CREATE_FUNCTION; + } + public function getRuleDefinition(): RuleDefinition { return new RuleDefinition( diff --git a/rules/Php72/Rector/FuncCall/GetClassOnNullRector.php b/rules/Php72/Rector/FuncCall/GetClassOnNullRector.php index 5f450bc9c8a..f2de8745995 100644 --- a/rules/Php72/Rector/FuncCall/GetClassOnNullRector.php +++ b/rules/Php72/Rector/FuncCall/GetClassOnNullRector.php @@ -13,7 +13,9 @@ use PhpParser\Node\Stmt\Class_; use PHPStan\Analyser\Scope; use PHPStan\Type\NullType; use Rector\Core\Rector\AbstractRector; +use Rector\Core\ValueObject\PhpVersionFeature; use Rector\NodeTypeResolver\Node\AttributeKey; +use Rector\VersionBonding\Contract\MinPhpVersionInterface; use Symplify\RuleDocGenerator\ValueObject\CodeSample\CodeSample; use Symplify\RuleDocGenerator\ValueObject\RuleDefinition; @@ -22,8 +24,13 @@ use Symplify\RuleDocGenerator\ValueObject\RuleDefinition; * * @see \Rector\Tests\Php72\Rector\FuncCall\GetClassOnNullRector\GetClassOnNullRectorTest */ -final class GetClassOnNullRector extends AbstractRector +final class GetClassOnNullRector extends AbstractRector implements MinPhpVersionInterface { + public function provideMinPhpVersion(): int + { + return PhpVersionFeature::NO_NULL_ON_GET_CLASS; + } + public function getRuleDefinition(): RuleDefinition { return new RuleDefinition('Null is no more allowed in get_class()', [ diff --git a/rules/Php72/Rector/FuncCall/IsObjectOnIncompleteClassRector.php b/rules/Php72/Rector/FuncCall/IsObjectOnIncompleteClassRector.php index a16c24f3827..26814eaf875 100644 --- a/rules/Php72/Rector/FuncCall/IsObjectOnIncompleteClassRector.php +++ b/rules/Php72/Rector/FuncCall/IsObjectOnIncompleteClassRector.php @@ -9,7 +9,9 @@ use PhpParser\Node\Expr\BooleanNot; use PhpParser\Node\Expr\FuncCall; use PHPStan\Type\ObjectType; use Rector\Core\Rector\AbstractRector; +use Rector\Core\ValueObject\PhpVersionFeature; use Rector\NodeTypeResolver\Node\AttributeKey; +use Rector\VersionBonding\Contract\MinPhpVersionInterface; use Symplify\RuleDocGenerator\ValueObject\CodeSample\CodeSample; use Symplify\RuleDocGenerator\ValueObject\RuleDefinition; @@ -18,8 +20,13 @@ use Symplify\RuleDocGenerator\ValueObject\RuleDefinition; * * @see \Rector\Tests\Php72\Rector\FuncCall\IsObjectOnIncompleteClassRector\IsObjectOnIncompleteClassRectorTest */ -final class IsObjectOnIncompleteClassRector extends AbstractRector +final class IsObjectOnIncompleteClassRector extends AbstractRector implements MinPhpVersionInterface { + public function provideMinPhpVersion(): int + { + return PhpVersionFeature::INVERTED_BOOL_IS_OBJECT_INCOMPLETE_CLASS; + } + public function getRuleDefinition(): RuleDefinition { return new RuleDefinition( diff --git a/rules/Php72/Rector/FuncCall/ParseStrWithResultArgumentRector.php b/rules/Php72/Rector/FuncCall/ParseStrWithResultArgumentRector.php index 602ad12fd68..55659f1623a 100644 --- a/rules/Php72/Rector/FuncCall/ParseStrWithResultArgumentRector.php +++ b/rules/Php72/Rector/FuncCall/ParseStrWithResultArgumentRector.php @@ -9,7 +9,9 @@ use PhpParser\Node\Arg; use PhpParser\Node\Expr\FuncCall; use PhpParser\Node\Expr\Variable; use Rector\Core\Rector\AbstractRector; +use Rector\Core\ValueObject\PhpVersionFeature; use Rector\NodeTypeResolver\Node\AttributeKey; +use Rector\VersionBonding\Contract\MinPhpVersionInterface; use Symplify\RuleDocGenerator\ValueObject\CodeSample\CodeSample; use Symplify\RuleDocGenerator\ValueObject\RuleDefinition; @@ -18,8 +20,13 @@ use Symplify\RuleDocGenerator\ValueObject\RuleDefinition; * * @see \Rector\Tests\Php72\Rector\FuncCall\ParseStrWithResultArgumentRector\ParseStrWithResultArgumentRectorTest */ -final class ParseStrWithResultArgumentRector extends AbstractRector +final class ParseStrWithResultArgumentRector extends AbstractRector implements MinPhpVersionInterface { + public function provideMinPhpVersion(): int + { + return PhpVersionFeature::RESULT_ARG_IN_PARSE_STR; + } + public function getRuleDefinition(): RuleDefinition { return new RuleDefinition( diff --git a/rules/Php72/Rector/FuncCall/StringifyDefineRector.php b/rules/Php72/Rector/FuncCall/StringifyDefineRector.php index 6e02c1477e8..91bad44f884 100644 --- a/rules/Php72/Rector/FuncCall/StringifyDefineRector.php +++ b/rules/Php72/Rector/FuncCall/StringifyDefineRector.php @@ -9,7 +9,9 @@ use PhpParser\Node\Expr\ConstFetch; use PhpParser\Node\Expr\FuncCall; use PhpParser\Node\Scalar\String_; use Rector\Core\Rector\AbstractRector; +use Rector\Core\ValueObject\PhpVersionFeature; use Rector\NodeTypeResolver\TypeAnalyzer\StringTypeAnalyzer; +use Rector\VersionBonding\Contract\MinPhpVersionInterface; use Symplify\RuleDocGenerator\ValueObject\CodeSample\CodeSample; use Symplify\RuleDocGenerator\ValueObject\RuleDefinition; @@ -17,13 +19,18 @@ use Symplify\RuleDocGenerator\ValueObject\RuleDefinition; * @see https://3v4l.org/YiTeP * @see \Rector\Tests\Php72\Rector\FuncCall\StringifyDefineRector\StringifyDefineRectorTest */ -final class StringifyDefineRector extends AbstractRector +final class StringifyDefineRector extends AbstractRector implements MinPhpVersionInterface { public function __construct( private StringTypeAnalyzer $stringTypeAnalyzer ) { } + public function provideMinPhpVersion(): int + { + return PhpVersionFeature::STRING_IN_FIRST_DEFINE_ARG; + } + public function getRuleDefinition(): RuleDefinition { return new RuleDefinition('Make first argument of define() string', [ diff --git a/rules/Php72/Rector/FuncCall/StringsAssertNakedRector.php b/rules/Php72/Rector/FuncCall/StringsAssertNakedRector.php index e2d8e13c930..dfb2a166e5e 100644 --- a/rules/Php72/Rector/FuncCall/StringsAssertNakedRector.php +++ b/rules/Php72/Rector/FuncCall/StringsAssertNakedRector.php @@ -11,6 +11,8 @@ use PhpParser\Node\Scalar\String_; use PhpParser\Node\Stmt\Expression; use PhpParser\Parser; use Rector\Core\Rector\AbstractRector; +use Rector\Core\ValueObject\PhpVersionFeature; +use Rector\VersionBonding\Contract\MinPhpVersionInterface; use Symplify\RuleDocGenerator\ValueObject\CodeSample\CodeSample; use Symplify\RuleDocGenerator\ValueObject\RuleDefinition; @@ -19,13 +21,18 @@ use Symplify\RuleDocGenerator\ValueObject\RuleDefinition; * * @see \Rector\Tests\Php72\Rector\FuncCall\StringsAssertNakedRector\StringsAssertNakedRectorTest */ -final class StringsAssertNakedRector extends AbstractRector +final class StringsAssertNakedRector extends AbstractRector implements MinPhpVersionInterface { public function __construct( private Parser $parser ) { } + public function provideMinPhpVersion(): int + { + return PhpVersionFeature::STRING_IN_ASSERT_ARG; + } + public function getRuleDefinition(): RuleDefinition { return new RuleDefinition( diff --git a/rules/Php72/Rector/Unset_/UnsetCastRector.php b/rules/Php72/Rector/Unset_/UnsetCastRector.php index 90ccebbe249..842848d461a 100644 --- a/rules/Php72/Rector/Unset_/UnsetCastRector.php +++ b/rules/Php72/Rector/Unset_/UnsetCastRector.php @@ -9,15 +9,22 @@ use PhpParser\Node\Expr\Assign; use PhpParser\Node\Expr\Cast\Unset_; use PhpParser\Node\Stmt\Expression; use Rector\Core\Rector\AbstractRector; +use Rector\Core\ValueObject\PhpVersionFeature; use Rector\NodeTypeResolver\Node\AttributeKey; +use Rector\VersionBonding\Contract\MinPhpVersionInterface; use Symplify\RuleDocGenerator\ValueObject\CodeSample\CodeSample; use Symplify\RuleDocGenerator\ValueObject\RuleDefinition; /** * @see \Rector\Tests\Php72\Rector\Unset_\UnsetCastRector\UnsetCastRectorTest */ -final class UnsetCastRector extends AbstractRector +final class UnsetCastRector extends AbstractRector implements MinPhpVersionInterface { + public function provideMinPhpVersion(): int + { + return PhpVersionFeature::NO_UNSET_CAST; + } + public function getRuleDefinition(): RuleDefinition { return new RuleDefinition('Removes (unset) cast', [ diff --git a/rules/Php72/Rector/While_/WhileEachToForeachRector.php b/rules/Php72/Rector/While_/WhileEachToForeachRector.php index 3c4efbd98c0..517a7fdd2be 100644 --- a/rules/Php72/Rector/While_/WhileEachToForeachRector.php +++ b/rules/Php72/Rector/While_/WhileEachToForeachRector.php @@ -13,6 +13,8 @@ use PhpParser\Node\Stmt\Foreach_; use PhpParser\Node\Stmt\While_; use Rector\Core\NodeManipulator\AssignManipulator; use Rector\Core\Rector\AbstractRector; +use Rector\Core\ValueObject\PhpVersionFeature; +use Rector\VersionBonding\Contract\MinPhpVersionInterface; use Symplify\RuleDocGenerator\ValueObject\CodeSample\CodeSample; use Symplify\RuleDocGenerator\ValueObject\RuleDefinition; @@ -21,13 +23,18 @@ use Symplify\RuleDocGenerator\ValueObject\RuleDefinition; * * @see \Rector\Tests\Php72\Rector\While_\WhileEachToForeachRector\WhileEachToForeachRectorTest */ -final class WhileEachToForeachRector extends AbstractRector +final class WhileEachToForeachRector extends AbstractRector implements MinPhpVersionInterface { public function __construct( private AssignManipulator $assignManipulator ) { } + public function provideMinPhpVersion(): int + { + return PhpVersionFeature::DEPRECATE_EACH; + } + public function getRuleDefinition(): RuleDefinition { return new RuleDefinition( diff --git a/rules/Php73/Rector/BooleanOr/IsCountableRector.php b/rules/Php73/Rector/BooleanOr/IsCountableRector.php index 2402fa107fb..c9d1dc6adb2 100644 --- a/rules/Php73/Rector/BooleanOr/IsCountableRector.php +++ b/rules/Php73/Rector/BooleanOr/IsCountableRector.php @@ -11,13 +11,14 @@ use PHPStan\Reflection\ReflectionProvider; use Rector\Core\Rector\AbstractRector; use Rector\Core\ValueObject\PhpVersionFeature; use Rector\Php71\IsArrayAndDualCheckToAble; +use Rector\VersionBonding\Contract\MinPhpVersionInterface; use Symplify\RuleDocGenerator\ValueObject\CodeSample\CodeSample; use Symplify\RuleDocGenerator\ValueObject\RuleDefinition; /** * @see \Rector\Tests\Php73\Rector\BinaryOr\IsCountableRector\IsCountableRectorTest */ -final class IsCountableRector extends AbstractRector +final class IsCountableRector extends AbstractRector implements MinPhpVersionInterface { public function __construct( private IsArrayAndDualCheckToAble $isArrayAndDualCheckToAble, diff --git a/rules/Php73/Rector/ConstFetch/SensitiveConstantNameRector.php b/rules/Php73/Rector/ConstFetch/SensitiveConstantNameRector.php index 3f1da60b7ab..3f150b32bce 100644 --- a/rules/Php73/Rector/ConstFetch/SensitiveConstantNameRector.php +++ b/rules/Php73/Rector/ConstFetch/SensitiveConstantNameRector.php @@ -10,7 +10,9 @@ use PhpParser\Node\Name; use PhpParser\Node\Name\FullyQualified; use PHPStan\Reflection\ReflectionProvider; use Rector\Core\Rector\AbstractRector; +use Rector\Core\ValueObject\PhpVersionFeature; use Rector\NodeTypeResolver\Node\AttributeKey; +use Rector\VersionBonding\Contract\MinPhpVersionInterface; use Symplify\RuleDocGenerator\ValueObject\CodeSample\CodeSample; use Symplify\RuleDocGenerator\ValueObject\RuleDefinition; @@ -19,7 +21,7 @@ use Symplify\RuleDocGenerator\ValueObject\RuleDefinition; * * @see \Rector\Tests\Php73\Rector\ConstFetch\SensitiveConstantNameRector\SensitiveConstantNameRectorTest */ -final class SensitiveConstantNameRector extends AbstractRector +final class SensitiveConstantNameRector extends AbstractRector implements MinPhpVersionInterface { /** * @see http://php.net/manual/en/reserved.constants.php @@ -89,6 +91,11 @@ final class SensitiveConstantNameRector extends AbstractRector ) { } + public function provideMinPhpVersion(): int + { + return PhpVersionFeature::DEPRECATE_INSENSITIVE_CONSTANT_NAME; + } + public function getRuleDefinition(): RuleDefinition { return new RuleDefinition( diff --git a/rules/Php73/Rector/FuncCall/RegexDashEscapeRector.php b/rules/Php73/Rector/FuncCall/RegexDashEscapeRector.php index 50b1ed7a1fd..b5949d4dcce 100644 --- a/rules/Php73/Rector/FuncCall/RegexDashEscapeRector.php +++ b/rules/Php73/Rector/FuncCall/RegexDashEscapeRector.php @@ -11,7 +11,9 @@ use PhpParser\Node\Expr\StaticCall; use PhpParser\Node\Scalar\String_; use Rector\Core\Php\Regex\RegexPatternArgumentManipulator; use Rector\Core\Rector\AbstractRector; +use Rector\Core\ValueObject\PhpVersionFeature; use Rector\NodeTypeResolver\Node\AttributeKey; +use Rector\VersionBonding\Contract\MinPhpVersionInterface; use Symplify\RuleDocGenerator\ValueObject\CodeSample\CodeSample; use Symplify\RuleDocGenerator\ValueObject\RuleDefinition; @@ -19,7 +21,7 @@ use Symplify\RuleDocGenerator\ValueObject\RuleDefinition; * @see https://3v4l.org/dRG8U * @see \Rector\Tests\Php73\Rector\FuncCall\RegexDashEscapeRector\RegexDashEscapeRectorTest */ -final class RegexDashEscapeRector extends AbstractRector +final class RegexDashEscapeRector extends AbstractRector implements MinPhpVersionInterface { /** * @var string @@ -46,6 +48,11 @@ final class RegexDashEscapeRector extends AbstractRector ) { } + public function provideMinPhpVersion(): int + { + return PhpVersionFeature::ESCAPE_DASH_IN_REGEX; + } + public function getRuleDefinition(): RuleDefinition { return new RuleDefinition('Escape - in some cases', [ diff --git a/rules/Php73/Rector/FuncCall/SensitiveDefineRector.php b/rules/Php73/Rector/FuncCall/SensitiveDefineRector.php index 091bdf5bfaa..0fa1929a45d 100644 --- a/rules/Php73/Rector/FuncCall/SensitiveDefineRector.php +++ b/rules/Php73/Rector/FuncCall/SensitiveDefineRector.php @@ -7,6 +7,8 @@ namespace Rector\Php73\Rector\FuncCall; use PhpParser\Node; use PhpParser\Node\Expr\FuncCall; use Rector\Core\Rector\AbstractRector; +use Rector\Core\ValueObject\PhpVersionFeature; +use Rector\VersionBonding\Contract\MinPhpVersionInterface; use Symplify\RuleDocGenerator\ValueObject\CodeSample\CodeSample; use Symplify\RuleDocGenerator\ValueObject\RuleDefinition; @@ -15,8 +17,13 @@ use Symplify\RuleDocGenerator\ValueObject\RuleDefinition; * * @see \Rector\Tests\Php73\Rector\FuncCall\SensitiveDefineRector\SensitiveDefineRectorTest */ -final class SensitiveDefineRector extends AbstractRector +final class SensitiveDefineRector extends AbstractRector implements MinPhpVersionInterface { + public function provideMinPhpVersion(): int + { + return PhpVersionFeature::DEPRECATE_INSENSITIVE_CONSTANT_DEFINE; + } + public function getRuleDefinition(): RuleDefinition { return new RuleDefinition( diff --git a/rules/Php73/Rector/FuncCall/StringifyStrNeedlesRector.php b/rules/Php73/Rector/FuncCall/StringifyStrNeedlesRector.php index 14d48107057..7f284810a69 100644 --- a/rules/Php73/Rector/FuncCall/StringifyStrNeedlesRector.php +++ b/rules/Php73/Rector/FuncCall/StringifyStrNeedlesRector.php @@ -8,7 +8,9 @@ use PhpParser\Node; use PhpParser\Node\Expr\Cast\String_; use PhpParser\Node\Expr\FuncCall; use Rector\Core\Rector\AbstractRector; +use Rector\Core\ValueObject\PhpVersionFeature; use Rector\Php73\NodeTypeAnalyzer\NodeTypeAnalyzer; +use Rector\VersionBonding\Contract\MinPhpVersionInterface; use Symplify\RuleDocGenerator\ValueObject\CodeSample\CodeSample; use Symplify\RuleDocGenerator\ValueObject\RuleDefinition; @@ -16,7 +18,7 @@ use Symplify\RuleDocGenerator\ValueObject\RuleDefinition; * @changelog https://wiki.php.net/rfc/deprecations_php_7_3#string_search_functions_with_integer_needle * @see \Rector\Tests\Php73\Rector\FuncCall\StringifyStrNeedlesRector\StringifyStrNeedlesRectorTest */ -final class StringifyStrNeedlesRector extends AbstractRector +final class StringifyStrNeedlesRector extends AbstractRector implements MinPhpVersionInterface { /** * @var string[] @@ -39,6 +41,11 @@ final class StringifyStrNeedlesRector extends AbstractRector ) { } + public function provideMinPhpVersion(): int + { + return PhpVersionFeature::DEPRECATE_INT_IN_STR_NEEDLES; + } + public function getRuleDefinition(): RuleDefinition { return new RuleDefinition('Makes needles explicit strings', [ diff --git a/rules/Php73/Rector/String_/SensitiveHereNowDocRector.php b/rules/Php73/Rector/String_/SensitiveHereNowDocRector.php index 84d1faf60f6..46dd70f821e 100644 --- a/rules/Php73/Rector/String_/SensitiveHereNowDocRector.php +++ b/rules/Php73/Rector/String_/SensitiveHereNowDocRector.php @@ -7,7 +7,9 @@ namespace Rector\Php73\Rector\String_; use PhpParser\Node; use PhpParser\Node\Scalar\String_; use Rector\Core\Rector\AbstractRector; +use Rector\Core\ValueObject\PhpVersionFeature; use Rector\NodeTypeResolver\Node\AttributeKey; +use Rector\VersionBonding\Contract\MinPhpVersionInterface; use Symplify\RuleDocGenerator\ValueObject\CodeSample\CodeSample; use Symplify\RuleDocGenerator\ValueObject\RuleDefinition; @@ -15,7 +17,7 @@ use Symplify\RuleDocGenerator\ValueObject\RuleDefinition; * @changelog https://wiki.php.net/rfc/flexible_heredoc_nowdoc_syntaxes * @see \Rector\Tests\Php73\Rector\String_\SensitiveHereNowDocRector\SensitiveHereNowDocRectorTest */ -final class SensitiveHereNowDocRector extends AbstractRector +final class SensitiveHereNowDocRector extends AbstractRector implements MinPhpVersionInterface { /** * @var string @@ -27,6 +29,11 @@ final class SensitiveHereNowDocRector extends AbstractRector */ private const ATTRIBUTE_DOC_LABEL = 'docLabel'; + public function provideMinPhpVersion(): int + { + return PhpVersionFeature::SENSITIVE_HERE_NOW_DOC; + } + public function getRuleDefinition(): RuleDefinition { return new RuleDefinition( diff --git a/rules/Php74/Rector/ArrayDimFetch/CurlyToSquareBracketArrayStringRector.php b/rules/Php74/Rector/ArrayDimFetch/CurlyToSquareBracketArrayStringRector.php index 0ffd3f83872..d09c9faac45 100644 --- a/rules/Php74/Rector/ArrayDimFetch/CurlyToSquareBracketArrayStringRector.php +++ b/rules/Php74/Rector/ArrayDimFetch/CurlyToSquareBracketArrayStringRector.php @@ -7,8 +7,10 @@ namespace Rector\Php74\Rector\ArrayDimFetch; use PhpParser\Node; use PhpParser\Node\Expr\ArrayDimFetch; use Rector\Core\Rector\AbstractRector; +use Rector\Core\ValueObject\PhpVersionFeature; use Rector\NodeTypeResolver\Node\AttributeKey; use Rector\Php74\Tokenizer\FollowedByCurlyBracketAnalyzer; +use Rector\VersionBonding\Contract\MinPhpVersionInterface; use Symplify\RuleDocGenerator\ValueObject\CodeSample\CodeSample; use Symplify\RuleDocGenerator\ValueObject\RuleDefinition; @@ -16,13 +18,18 @@ use Symplify\RuleDocGenerator\ValueObject\RuleDefinition; * @changelog https://www.php.net/manual/en/migration74.deprecated.php * @see \Rector\Tests\Php74\Rector\ArrayDimFetch\CurlyToSquareBracketArrayStringRector\CurlyToSquareBracketArrayStringRectorTest */ -final class CurlyToSquareBracketArrayStringRector extends AbstractRector +final class CurlyToSquareBracketArrayStringRector extends AbstractRector implements MinPhpVersionInterface { public function __construct( private FollowedByCurlyBracketAnalyzer $followedByCurlyBracketAnalyzer ) { } + public function provideMinPhpVersion(): int + { + return PhpVersionFeature::DEPRECATE_CURLY_BRACKET_ARRAY_STRING; + } + public function getRuleDefinition(): RuleDefinition { return new RuleDefinition( diff --git a/rules/Php74/Rector/Double/RealToFloatTypeCastRector.php b/rules/Php74/Rector/Double/RealToFloatTypeCastRector.php index 11523a6c4ff..2bc68296705 100644 --- a/rules/Php74/Rector/Double/RealToFloatTypeCastRector.php +++ b/rules/Php74/Rector/Double/RealToFloatTypeCastRector.php @@ -7,7 +7,9 @@ namespace Rector\Php74\Rector\Double; use PhpParser\Node; use PhpParser\Node\Expr\Cast\Double; use Rector\Core\Rector\AbstractRector; +use Rector\Core\ValueObject\PhpVersionFeature; use Rector\NodeTypeResolver\Node\AttributeKey; +use Rector\VersionBonding\Contract\MinPhpVersionInterface; use Symplify\RuleDocGenerator\ValueObject\CodeSample\CodeSample; use Symplify\RuleDocGenerator\ValueObject\RuleDefinition; @@ -15,8 +17,13 @@ use Symplify\RuleDocGenerator\ValueObject\RuleDefinition; * @changelog https://wiki.php.net/rfc/deprecations_php_7_4 * @see \Rector\Tests\Php74\Rector\Double\RealToFloatTypeCastRector\RealToFloatTypeCastRectorTest */ -final class RealToFloatTypeCastRector extends AbstractRector +final class RealToFloatTypeCastRector extends AbstractRector implements MinPhpVersionInterface { + public function provideMinPhpVersion(): int + { + return PhpVersionFeature::DEPRECATE_REAL; + } + public function getRuleDefinition(): RuleDefinition { return new RuleDefinition('Change deprecated (real) to (float)', [ diff --git a/rules/Php74/Rector/FuncCall/ArrayKeyExistsOnPropertyRector.php b/rules/Php74/Rector/FuncCall/ArrayKeyExistsOnPropertyRector.php index 08e0f6b4370..ca4a99e9ffd 100644 --- a/rules/Php74/Rector/FuncCall/ArrayKeyExistsOnPropertyRector.php +++ b/rules/Php74/Rector/FuncCall/ArrayKeyExistsOnPropertyRector.php @@ -9,6 +9,8 @@ use PhpParser\Node\Expr\FuncCall; use PhpParser\Node\Name; use PHPStan\Type\ObjectType; use Rector\Core\Rector\AbstractRector; +use Rector\Core\ValueObject\PhpVersionFeature; +use Rector\VersionBonding\Contract\MinPhpVersionInterface; use Symplify\RuleDocGenerator\ValueObject\CodeSample\CodeSample; use Symplify\RuleDocGenerator\ValueObject\RuleDefinition; @@ -17,8 +19,13 @@ use Symplify\RuleDocGenerator\ValueObject\RuleDefinition; * @see https://3v4l.org/69mpd * @see \Rector\Tests\Php74\Rector\FuncCall\ArrayKeyExistsOnPropertyRector\ArrayKeyExistsOnPropertyRectorTest */ -final class ArrayKeyExistsOnPropertyRector extends AbstractRector +final class ArrayKeyExistsOnPropertyRector extends AbstractRector implements MinPhpVersionInterface { + public function provideMinPhpVersion(): int + { + return PhpVersionFeature::ARRAY_KEY_EXISTS_TO_PROPERTY_EXISTS; + } + public function getRuleDefinition(): RuleDefinition { return new RuleDefinition( diff --git a/rules/Php74/Rector/FuncCall/FilterVarToAddSlashesRector.php b/rules/Php74/Rector/FuncCall/FilterVarToAddSlashesRector.php index f46bb328da9..5e80ded09a0 100644 --- a/rules/Php74/Rector/FuncCall/FilterVarToAddSlashesRector.php +++ b/rules/Php74/Rector/FuncCall/FilterVarToAddSlashesRector.php @@ -8,6 +8,8 @@ use PhpParser\Node; use PhpParser\Node\Expr\FuncCall; use PhpParser\Node\Name; use Rector\Core\Rector\AbstractRector; +use Rector\Core\ValueObject\PhpVersionFeature; +use Rector\VersionBonding\Contract\MinPhpVersionInterface; use Symplify\RuleDocGenerator\ValueObject\CodeSample\CodeSample; use Symplify\RuleDocGenerator\ValueObject\RuleDefinition; @@ -16,8 +18,13 @@ use Symplify\RuleDocGenerator\ValueObject\RuleDefinition; * @see https://3v4l.org/9rLjE * @see \Rector\Tests\Php74\Rector\FuncCall\FilterVarToAddSlashesRector\FilterVarToAddSlashesRectorTest */ -final class FilterVarToAddSlashesRector extends AbstractRector +final class FilterVarToAddSlashesRector extends AbstractRector implements MinPhpVersionInterface { + public function provideMinPhpVersion(): int + { + return PhpVersionFeature::FILTER_VAR_TO_ADD_SLASHES; + } + public function getRuleDefinition(): RuleDefinition { return new RuleDefinition( diff --git a/rules/Php74/Rector/FuncCall/MbStrrposEncodingArgumentPositionRector.php b/rules/Php74/Rector/FuncCall/MbStrrposEncodingArgumentPositionRector.php index 989c30afef7..590df0d1bf1 100644 --- a/rules/Php74/Rector/FuncCall/MbStrrposEncodingArgumentPositionRector.php +++ b/rules/Php74/Rector/FuncCall/MbStrrposEncodingArgumentPositionRector.php @@ -10,6 +10,8 @@ use PhpParser\Node\Expr\FuncCall; use PhpParser\Node\Scalar\LNumber; use PHPStan\Type\IntegerType; use Rector\Core\Rector\AbstractRector; +use Rector\Core\ValueObject\PhpVersionFeature; +use Rector\VersionBonding\Contract\MinPhpVersionInterface; use Symplify\RuleDocGenerator\ValueObject\CodeSample\CodeSample; use Symplify\RuleDocGenerator\ValueObject\RuleDefinition; @@ -18,8 +20,13 @@ use Symplify\RuleDocGenerator\ValueObject\RuleDefinition; * * @see \Rector\Tests\Php74\Rector\FuncCall\MbStrrposEncodingArgumentPositionRector\MbStrrposEncodingArgumentPositionRectorTest */ -final class MbStrrposEncodingArgumentPositionRector extends AbstractRector +final class MbStrrposEncodingArgumentPositionRector extends AbstractRector implements MinPhpVersionInterface { + public function provideMinPhpVersion(): int + { + return PhpVersionFeature::CHANGE_MB_STRPOS_ARG_POSITION; + } + public function getRuleDefinition(): RuleDefinition { return new RuleDefinition( diff --git a/rules/Php74/Rector/Function_/ReservedFnFunctionRector.php b/rules/Php74/Rector/Function_/ReservedFnFunctionRector.php index e755678b2fd..bcbf592d5cb 100644 --- a/rules/Php74/Rector/Function_/ReservedFnFunctionRector.php +++ b/rules/Php74/Rector/Function_/ReservedFnFunctionRector.php @@ -11,6 +11,8 @@ use PhpParser\Node\Name; use PhpParser\Node\Stmt\Function_; use Rector\Core\Contract\Rector\ConfigurableRectorInterface; use Rector\Core\Rector\AbstractRector; +use Rector\Core\ValueObject\PhpVersionFeature; +use Rector\VersionBonding\Contract\MinPhpVersionInterface; use Symplify\RuleDocGenerator\ValueObject\CodeSample\ConfiguredCodeSample; use Symplify\RuleDocGenerator\ValueObject\RuleDefinition; @@ -18,7 +20,7 @@ use Symplify\RuleDocGenerator\ValueObject\RuleDefinition; * @changelog https://github.com/php/php-src/pull/3941/files#diff-7e3a1a5df28a1cbd8c0fb6db68f243da * @see \Rector\Tests\Php74\Rector\Function_\ReservedFnFunctionRector\ReservedFnFunctionRectorTest */ -final class ReservedFnFunctionRector extends AbstractRector implements ConfigurableRectorInterface +final class ReservedFnFunctionRector extends AbstractRector implements ConfigurableRectorInterface, MinPhpVersionInterface { /** * @api @@ -31,6 +33,11 @@ final class ReservedFnFunctionRector extends AbstractRector implements Configura */ private array $reservedNamesToNewOnes = []; + public function provideMinPhpVersion(): int + { + return PhpVersionFeature::RESERVED_FN_FUNCTION_NAME; + } + public function getRuleDefinition(): RuleDefinition { return new RuleDefinition('Change fn() function name, since it will be reserved keyword', [ diff --git a/rules/Php74/Rector/MethodCall/ChangeReflectionTypeToStringToGetNameRector.php b/rules/Php74/Rector/MethodCall/ChangeReflectionTypeToStringToGetNameRector.php index d01dd9acee6..eb909a79a1f 100644 --- a/rules/Php74/Rector/MethodCall/ChangeReflectionTypeToStringToGetNameRector.php +++ b/rules/Php74/Rector/MethodCall/ChangeReflectionTypeToStringToGetNameRector.php @@ -14,7 +14,9 @@ use PHPStan\Analyser\Scope; use PHPStan\Type\ObjectType; use PHPStan\Type\UnionType; use Rector\Core\Rector\AbstractRector; +use Rector\Core\ValueObject\PhpVersionFeature; use Rector\NodeTypeResolver\Node\AttributeKey; +use Rector\VersionBonding\Contract\MinPhpVersionInterface; use Symplify\RuleDocGenerator\ValueObject\CodeSample\CodeSample; use Symplify\RuleDocGenerator\ValueObject\RuleDefinition; @@ -26,7 +28,7 @@ use Symplify\RuleDocGenerator\ValueObject\RuleDefinition; * * @see \Rector\Tests\Php74\Rector\MethodCall\ChangeReflectionTypeToStringToGetNameRector\ChangeReflectionTypeToStringToGetNameRectorTest */ -final class ChangeReflectionTypeToStringToGetNameRector extends AbstractRector +final class ChangeReflectionTypeToStringToGetNameRector extends AbstractRector implements MinPhpVersionInterface { /** * @var string @@ -39,6 +41,11 @@ final class ChangeReflectionTypeToStringToGetNameRector extends AbstractRector */ private array $callsByVariable = []; + public function provideMinPhpVersion(): int + { + return PhpVersionFeature::REFLECTION_TYPE_GETNAME; + } + public function getRuleDefinition(): RuleDefinition { return new RuleDefinition('Change string calls on ReflectionType', [ diff --git a/rules/Php74/Rector/StaticCall/ExportToReflectionFunctionRector.php b/rules/Php74/Rector/StaticCall/ExportToReflectionFunctionRector.php index 0de169c2560..30ffe7cfced 100644 --- a/rules/Php74/Rector/StaticCall/ExportToReflectionFunctionRector.php +++ b/rules/Php74/Rector/StaticCall/ExportToReflectionFunctionRector.php @@ -12,6 +12,8 @@ use PhpParser\Node\Expr\StaticCall; use PhpParser\Node\Name; use PHPStan\Type\ObjectType; use Rector\Core\Rector\AbstractRector; +use Rector\Core\ValueObject\PhpVersionFeature; +use Rector\VersionBonding\Contract\MinPhpVersionInterface; use Symplify\RuleDocGenerator\ValueObject\CodeSample\CodeSample; use Symplify\RuleDocGenerator\ValueObject\RuleDefinition; @@ -20,8 +22,13 @@ use Symplify\RuleDocGenerator\ValueObject\RuleDefinition; * @see https://3v4l.org/RTCUq * @see \Rector\Tests\Php74\Rector\StaticCall\ExportToReflectionFunctionRector\ExportToReflectionFunctionRectorTest */ -final class ExportToReflectionFunctionRector extends AbstractRector +final class ExportToReflectionFunctionRector extends AbstractRector implements MinPhpVersionInterface { + public function provideMinPhpVersion(): int + { + return PhpVersionFeature::EXPORT_TO_REFLECTION_FUNCTION; + } + public function getRuleDefinition(): RuleDefinition { return new RuleDefinition( diff --git a/rules/Php80/Rector/ClassMethod/FinalPrivateToPrivateVisibilityRector.php b/rules/Php80/Rector/ClassMethod/FinalPrivateToPrivateVisibilityRector.php index 0664fc56486..d901c2b72c3 100644 --- a/rules/Php80/Rector/ClassMethod/FinalPrivateToPrivateVisibilityRector.php +++ b/rules/Php80/Rector/ClassMethod/FinalPrivateToPrivateVisibilityRector.php @@ -7,14 +7,21 @@ namespace Rector\Php80\Rector\ClassMethod; use PhpParser\Node; use PhpParser\Node\Stmt\ClassMethod; use Rector\Core\Rector\AbstractRector; +use Rector\Core\ValueObject\PhpVersionFeature; +use Rector\VersionBonding\Contract\MinPhpVersionInterface; use Symplify\RuleDocGenerator\ValueObject\CodeSample\CodeSample; use Symplify\RuleDocGenerator\ValueObject\RuleDefinition; /** * @see \Rector\Tests\Php80\Rector\ClassMethod\FinalPrivateToPrivateVisibilityRector\FinalPrivateToPrivateVisibilityRectorTest */ -final class FinalPrivateToPrivateVisibilityRector extends AbstractRector +final class FinalPrivateToPrivateVisibilityRector extends AbstractRector implements MinPhpVersionInterface { + public function provideMinPhpVersion(): int + { + return PhpVersionFeature::NO_FINAL_PRIVATE; + } + public function getRuleDefinition(): RuleDefinition { return new RuleDefinition('Changes method visibility from final private to only private', [ diff --git a/rules/Php80/Rector/ClassMethod/OptionalParametersAfterRequiredRector.php b/rules/Php80/Rector/ClassMethod/OptionalParametersAfterRequiredRector.php index a9ec261df5d..1c095b24d46 100644 --- a/rules/Php80/Rector/ClassMethod/OptionalParametersAfterRequiredRector.php +++ b/rules/Php80/Rector/ClassMethod/OptionalParametersAfterRequiredRector.php @@ -13,9 +13,11 @@ use PHPStan\Reflection\ParametersAcceptorSelector; use Rector\CodingStyle\Reflection\VendorLocationDetector; use Rector\Core\Rector\AbstractRector; use Rector\Core\Reflection\ReflectionResolver; +use Rector\Core\ValueObject\PhpVersionFeature; use Rector\NodeTypeResolver\Node\AttributeKey; use Rector\Php80\NodeResolver\ArgumentSorter; use Rector\Php80\NodeResolver\RequireOptionalParamResolver; +use Rector\VersionBonding\Contract\MinPhpVersionInterface; use Symplify\RuleDocGenerator\ValueObject\CodeSample\CodeSample; use Symplify\RuleDocGenerator\ValueObject\RuleDefinition; @@ -24,7 +26,7 @@ use Symplify\RuleDocGenerator\ValueObject\RuleDefinition; * * @see \Rector\Tests\Php80\Rector\ClassMethod\OptionalParametersAfterRequiredRector\OptionalParametersAfterRequiredRectorTest */ -final class OptionalParametersAfterRequiredRector extends AbstractRector +final class OptionalParametersAfterRequiredRector extends AbstractRector implements MinPhpVersionInterface { /** * @var string @@ -39,6 +41,11 @@ final class OptionalParametersAfterRequiredRector extends AbstractRector ) { } + public function provideMinPhpVersion(): int + { + return PhpVersionFeature::DEPRECATE_REQUIRED_PARAMETER_AFTER_OPTIONAL; + } + public function getRuleDefinition(): RuleDefinition { return new RuleDefinition('Move required parameters after optional ones', [ diff --git a/rules/Php80/Rector/ClassMethod/SetStateToStaticRector.php b/rules/Php80/Rector/ClassMethod/SetStateToStaticRector.php index 7b47c5c07e9..0679e2ed2c3 100644 --- a/rules/Php80/Rector/ClassMethod/SetStateToStaticRector.php +++ b/rules/Php80/Rector/ClassMethod/SetStateToStaticRector.php @@ -8,14 +8,21 @@ use PhpParser\Node; use PhpParser\Node\Stmt\ClassMethod; use Rector\Core\Rector\AbstractRector; use Rector\Core\ValueObject\MethodName; +use Rector\Core\ValueObject\PhpVersionFeature; +use Rector\VersionBonding\Contract\MinPhpVersionInterface; use Symplify\RuleDocGenerator\ValueObject\CodeSample\CodeSample; use Symplify\RuleDocGenerator\ValueObject\RuleDefinition; /** * @see \Rector\Tests\Php80\Rector\ClassMethod\SetStateToStaticRector\SetStateToStaticRectorTest */ -final class SetStateToStaticRector extends AbstractRector +final class SetStateToStaticRector extends AbstractRector implements MinPhpVersionInterface { + public function provideMinPhpVersion(): int + { + return PhpVersionFeature::STATIC_VISIBILITY_SET_STATE; + } + public function getRuleDefinition(): RuleDefinition { return new RuleDefinition('Adds static visibility to __set_state() methods', [ diff --git a/rules/Php80/Rector/Class_/DoctrineAnnotationClassToAttributeRector.php b/rules/Php80/Rector/Class_/DoctrineAnnotationClassToAttributeRector.php index 82c70eda421..429d4f72fb2 100644 --- a/rules/Php80/Rector/Class_/DoctrineAnnotationClassToAttributeRector.php +++ b/rules/Php80/Rector/Class_/DoctrineAnnotationClassToAttributeRector.php @@ -16,11 +16,13 @@ use Rector\BetterPhpDocParser\PhpDocManipulator\PhpDocTagRemover; use Rector\BetterPhpDocParser\ValueObject\PhpDoc\DoctrineAnnotation\CurlyListNode; use Rector\Core\Contract\Rector\ConfigurableRectorInterface; use Rector\Core\Rector\AbstractRector; +use Rector\Core\ValueObject\PhpVersionFeature; use Rector\Php80\NodeAnalyzer\PhpAttributeAnalyzer; use Rector\Php80\NodeFactory\AttributeFlagFactory; use Rector\PhpAttribute\Printer\PhpAttributeGroupFactory; use Rector\PostRector\Collector\PropertyToAddCollector; use Rector\PostRector\ValueObject\PropertyMetadata; +use Rector\VersionBonding\Contract\MinPhpVersionInterface; use Symplify\RuleDocGenerator\ValueObject\CodeSample\ConfiguredCodeSample; use Symplify\RuleDocGenerator\ValueObject\RuleDefinition; use Webmozart\Assert\Assert; @@ -33,7 +35,7 @@ use Webmozart\Assert\Assert; * * @see \Rector\Tests\Php80\Rector\Class_\DoctrineAnnotationClassToAttributeRector\DoctrineAnnotationClassToAttributeRectorTest */ -final class DoctrineAnnotationClassToAttributeRector extends AbstractRector implements ConfigurableRectorInterface +final class DoctrineAnnotationClassToAttributeRector extends AbstractRector implements ConfigurableRectorInterface, MinPhpVersionInterface { /** * @var string @@ -70,6 +72,11 @@ final class DoctrineAnnotationClassToAttributeRector extends AbstractRector impl ) { } + public function provideMinPhpVersion(): int + { + return PhpVersionFeature::ATTRIBUTES; + } + public function getRuleDefinition(): RuleDefinition { return new RuleDefinition('Refactor Doctrine @annotation annotated class to a PHP 8.0 attribute class', [ diff --git a/rules/Php80/Rector/Class_/StringableForToStringRector.php b/rules/Php80/Rector/Class_/StringableForToStringRector.php index 6bbc1f4268f..e5d75d4e76c 100644 --- a/rules/Php80/Rector/Class_/StringableForToStringRector.php +++ b/rules/Php80/Rector/Class_/StringableForToStringRector.php @@ -11,7 +11,9 @@ use PhpParser\Node\Stmt\Class_; use PhpParser\Node\Stmt\ClassMethod; use Rector\Core\Rector\AbstractRector; use Rector\Core\ValueObject\MethodName; +use Rector\Core\ValueObject\PhpVersionFeature; use Rector\FamilyTree\Reflection\FamilyRelationsAnalyzer; +use Rector\VersionBonding\Contract\MinPhpVersionInterface; use Symplify\RuleDocGenerator\ValueObject\CodeSample\CodeSample; use Symplify\RuleDocGenerator\ValueObject\RuleDefinition; @@ -20,7 +22,7 @@ use Symplify\RuleDocGenerator\ValueObject\RuleDefinition; * * @see \Rector\Tests\Php80\Rector\Class_\StringableForToStringRector\StringableForToStringRectorTest */ -final class StringableForToStringRector extends AbstractRector +final class StringableForToStringRector extends AbstractRector implements MinPhpVersionInterface { /** * @var string @@ -32,6 +34,11 @@ final class StringableForToStringRector extends AbstractRector ) { } + public function provideMinPhpVersion(): int + { + return PhpVersionFeature::STRINGABLE; + } + public function getRuleDefinition(): RuleDefinition { return new RuleDefinition( diff --git a/rules/Php80/Rector/FuncCall/TokenGetAllToObjectRector.php b/rules/Php80/Rector/FuncCall/TokenGetAllToObjectRector.php index d9be8bd5b9e..2ecbce0d688 100644 --- a/rules/Php80/Rector/FuncCall/TokenGetAllToObjectRector.php +++ b/rules/Php80/Rector/FuncCall/TokenGetAllToObjectRector.php @@ -14,9 +14,11 @@ use PhpParser\Node\Stmt\Foreach_; use PhpParser\Node\Stmt\Function_; use PhpParser\Node\Stmt\If_; use Rector\Core\Rector\AbstractRector; +use Rector\Core\ValueObject\PhpVersionFeature; use Rector\NodeNestingScope\ParentFinder; use Rector\NodeTypeResolver\Node\AttributeKey; use Rector\Php80\NodeManipulator\TokenManipulator; +use Rector\VersionBonding\Contract\MinPhpVersionInterface; use Symplify\RuleDocGenerator\ValueObject\CodeSample\CodeSample; use Symplify\RuleDocGenerator\ValueObject\RuleDefinition; @@ -25,7 +27,7 @@ use Symplify\RuleDocGenerator\ValueObject\RuleDefinition; * * @see \Rector\Tests\Php80\Rector\FuncCall\TokenGetAllToObjectRector\TokenGetAllToObjectRectorTest */ -final class TokenGetAllToObjectRector extends AbstractRector +final class TokenGetAllToObjectRector extends AbstractRector implements MinPhpVersionInterface { public function __construct( private TokenManipulator $tokenManipulator, @@ -33,6 +35,11 @@ final class TokenGetAllToObjectRector extends AbstractRector ) { } + public function provideMinPhpVersion(): int + { + return PhpVersionFeature::PHP_TOKEN; + } + public function getRuleDefinition(): RuleDefinition { return new RuleDefinition( diff --git a/rules/Php80/Rector/Identical/StrEndsWithRector.php b/rules/Php80/Rector/Identical/StrEndsWithRector.php index 6b2a2032112..b3ada88500a 100644 --- a/rules/Php80/Rector/Identical/StrEndsWithRector.php +++ b/rules/Php80/Rector/Identical/StrEndsWithRector.php @@ -15,8 +15,10 @@ use PhpParser\Node\Expr\UnaryMinus; use PhpParser\Node\Scalar\LNumber; use PhpParser\Node\Scalar\String_; use Rector\Core\Rector\AbstractRector; +use Rector\Core\ValueObject\PhpVersionFeature; use Rector\Nette\NodeAnalyzer\BinaryOpAnalyzer; use Rector\Nette\ValueObject\FuncCallAndExpr; +use Rector\VersionBonding\Contract\MinPhpVersionInterface; use Symplify\RuleDocGenerator\ValueObject\CodeSample\CodeSample; use Symplify\RuleDocGenerator\ValueObject\RuleDefinition; @@ -25,13 +27,18 @@ use Symplify\RuleDocGenerator\ValueObject\RuleDefinition; * * @see \Rector\Tests\Php80\Rector\Identical\StrEndsWithRector\StrEndsWithRectorTest */ -final class StrEndsWithRector extends AbstractRector +final class StrEndsWithRector extends AbstractRector implements MinPhpVersionInterface { public function __construct( private BinaryOpAnalyzer $binaryOpAnalyzer ) { } + public function provideMinPhpVersion(): int + { + return PhpVersionFeature::STR_ENDS_WITH; + } + public function getRuleDefinition(): RuleDefinition { return new RuleDefinition('Change helper functions to str_ends_with()', [ diff --git a/rules/Php80/Rector/Identical/StrStartsWithRector.php b/rules/Php80/Rector/Identical/StrStartsWithRector.php index 27b8bce1959..dec19f005f1 100644 --- a/rules/Php80/Rector/Identical/StrStartsWithRector.php +++ b/rules/Php80/Rector/Identical/StrStartsWithRector.php @@ -8,8 +8,10 @@ use PhpParser\Node; use PhpParser\Node\Expr\BinaryOp\Identical; use PhpParser\Node\Expr\BinaryOp\NotIdentical; use Rector\Core\Rector\AbstractRector; +use Rector\Core\ValueObject\PhpVersionFeature; use Rector\Php80\Contract\StrStartWithMatchAndRefactorInterface; use Rector\Php80\ValueObject\StrStartsWith; +use Rector\VersionBonding\Contract\MinPhpVersionInterface; use Symplify\RuleDocGenerator\ValueObject\CodeSample\CodeSample; use Symplify\RuleDocGenerator\ValueObject\RuleDefinition; @@ -21,7 +23,7 @@ use Symplify\RuleDocGenerator\ValueObject\RuleDefinition; * * @see \Rector\Tests\Php80\Rector\Identical\StrStartsWithRector\StrStartsWithRectorTest */ -final class StrStartsWithRector extends AbstractRector +final class StrStartsWithRector extends AbstractRector implements MinPhpVersionInterface { /** * @param StrStartWithMatchAndRefactorInterface[] $strStartWithMatchAndRefactors @@ -31,6 +33,11 @@ final class StrStartsWithRector extends AbstractRector ) { } + public function provideMinPhpVersion(): int + { + return PhpVersionFeature::STR_STARTS_WITH; + } + public function getRuleDefinition(): RuleDefinition { return new RuleDefinition( diff --git a/rules/Php80/Rector/NotIdentical/StrContainsRector.php b/rules/Php80/Rector/NotIdentical/StrContainsRector.php index 10b4948bc3e..8d82dc3e1d6 100644 --- a/rules/Php80/Rector/NotIdentical/StrContainsRector.php +++ b/rules/Php80/Rector/NotIdentical/StrContainsRector.php @@ -11,6 +11,8 @@ use PhpParser\Node\Expr\BooleanNot; use PhpParser\Node\Expr\FuncCall; use PhpParser\Node\Name; use Rector\Core\Rector\AbstractRector; +use Rector\Core\ValueObject\PhpVersionFeature; +use Rector\VersionBonding\Contract\MinPhpVersionInterface; use Symplify\RuleDocGenerator\ValueObject\CodeSample\CodeSample; use Symplify\RuleDocGenerator\ValueObject\RuleDefinition; @@ -19,13 +21,18 @@ use Symplify\RuleDocGenerator\ValueObject\RuleDefinition; * * @see \Rector\Tests\Php80\Rector\NotIdentical\StrContainsRector\StrContainsRectorTest */ -final class StrContainsRector extends AbstractRector +final class StrContainsRector extends AbstractRector implements MinPhpVersionInterface { /** * @var string[] */ private const OLD_STR_NAMES = ['strpos', 'strstr']; + public function provideMinPhpVersion(): int + { + return PhpVersionFeature::STR_CONTAINS; + } + public function getRuleDefinition(): RuleDefinition { return new RuleDefinition( diff --git a/rules/Php80/Rector/Ternary/GetDebugTypeRector.php b/rules/Php80/Rector/Ternary/GetDebugTypeRector.php index 15f02122183..ab3347086b2 100644 --- a/rules/Php80/Rector/Ternary/GetDebugTypeRector.php +++ b/rules/Php80/Rector/Ternary/GetDebugTypeRector.php @@ -8,6 +8,8 @@ use PhpParser\Node; use PhpParser\Node\Expr\FuncCall; use PhpParser\Node\Expr\Ternary; use Rector\Core\Rector\AbstractRector; +use Rector\Core\ValueObject\PhpVersionFeature; +use Rector\VersionBonding\Contract\MinPhpVersionInterface; use Symplify\RuleDocGenerator\ValueObject\CodeSample\CodeSample; use Symplify\RuleDocGenerator\ValueObject\RuleDefinition; @@ -16,8 +18,13 @@ use Symplify\RuleDocGenerator\ValueObject\RuleDefinition; * * @see \Rector\Tests\Php80\Rector\Ternary\GetDebugTypeRector\GetDebugTypeRectorTest */ -final class GetDebugTypeRector extends AbstractRector +final class GetDebugTypeRector extends AbstractRector implements MinPhpVersionInterface { + public function provideMinPhpVersion(): int + { + return PhpVersionFeature::GET_DEBUG_TYPE; + } + public function getRuleDefinition(): RuleDefinition { return new RuleDefinition( diff --git a/rules/Php81/Rector/Class_/SpatieEnumClassToEnumRector.php b/rules/Php81/Rector/Class_/SpatieEnumClassToEnumRector.php index 378933c20da..456c4b256a2 100644 --- a/rules/Php81/Rector/Class_/SpatieEnumClassToEnumRector.php +++ b/rules/Php81/Rector/Class_/SpatieEnumClassToEnumRector.php @@ -8,7 +8,9 @@ use PhpParser\Node; use PhpParser\Node\Stmt\Class_; use PHPStan\Type\ObjectType; use Rector\Core\Rector\AbstractRector; +use Rector\Core\ValueObject\PhpVersionFeature; use Rector\Php81\NodeFactory\EnumFactory; +use Rector\VersionBonding\Contract\MinPhpVersionInterface; use Symplify\RuleDocGenerator\ValueObject\CodeSample\CodeSample; use Symplify\RuleDocGenerator\ValueObject\RuleDefinition; @@ -18,13 +20,18 @@ use Symplify\RuleDocGenerator\ValueObject\RuleDefinition; * * @see \Rector\Tests\Php81\Rector\Class_\SpatieEnumClassToEnumRector\SpatieEnumClassToEnumRectorTest */ -final class SpatieEnumClassToEnumRector extends AbstractRector +final class SpatieEnumClassToEnumRector extends AbstractRector implements MinPhpVersionInterface { public function __construct( private EnumFactory $enumFactory ) { } + public function provideMinPhpVersion(): int + { + return PhpVersionFeature::ENUM; + } + public function getRuleDefinition(): RuleDefinition { return new RuleDefinition('Refactor Spatie enum class to native Enum', [ diff --git a/src/ValueObject/PhpVersion.php b/src/ValueObject/PhpVersion.php index beee70ec641..ab10b38bacc 100644 --- a/src/ValueObject/PhpVersion.php +++ b/src/ValueObject/PhpVersion.php @@ -6,6 +6,12 @@ namespace Rector\Core\ValueObject; final class PhpVersion { + /** + * @api + * @var int + */ + public const PHP_52 = 50200; + /** * @api * @var int diff --git a/src/ValueObject/PhpVersionFeature.php b/src/ValueObject/PhpVersionFeature.php index d803aecf1d4..a6b97b9cf9d 100644 --- a/src/ValueObject/PhpVersionFeature.php +++ b/src/ValueObject/PhpVersionFeature.php @@ -6,6 +6,26 @@ namespace Rector\Core\ValueObject; final class PhpVersionFeature { + /** + * @var int + */ + public const PROPERTY_MODIFIER = PhpVersion::PHP_52; + + /** + * @var int + */ + public const CONTINUE_TO_BREAK = PhpVersion::PHP_52; + + /** + * @var int + */ + public const NO_REFERENCE_IN_NEW = PhpVersion::PHP_53; + + /** + * @var int + */ + public const SERVER_VAR = PhpVersion::PHP_53; + /** * @var int */ @@ -16,6 +36,16 @@ final class PhpVersionFeature */ public const ELVIS_OPERATOR = PhpVersion::PHP_53; + /** + * @var int + */ + public const NO_ZERO_BREAK = PhpVersion::PHP_54; + + /** + * @var int + */ + public const NO_REFERENCE_IN_ARG = PhpVersion::PHP_54; + /** * @var int */ @@ -27,11 +57,25 @@ final class PhpVersionFeature */ public const CLASSNAME_CONSTANT = PhpVersion::PHP_55; + /* + * @var int + */ + + /** + * @var int + */ + public const PREG_REPLACE_CALLBACK_E_MODIFIER = PhpVersion::PHP_55; + /** * @var int */ public const EXP_OPERATOR = PhpVersion::PHP_56; + /** + * @var int + */ + public const REQUIRE_DEFAULT_VALUE = PhpVersion::PHP_56; + /** * @var int */ @@ -67,6 +111,66 @@ final class PhpVersionFeature */ public const THROWABLE_TYPE = PhpVersion::PHP_70; + /** + * @var int + */ + public const NO_LIST_SPLIT_STRING = PhpVersion::PHP_70; + + /** + * @var int + */ + public const NO_BREAK_OUTSIDE_LOOP = PhpVersion::PHP_70; + + /** + * @var int + */ + public const NO_PHP4_CONSTRUCTOR = PhpVersion::PHP_70; + + /** + * @var int + */ + public const NO_CALL_USER_METHOD = PhpVersion::PHP_70; + + /** + * @var int + */ + public const NO_EREG_FUNCTION = PhpVersion::PHP_70; + + /** + * @var int + */ + public const VARIABLE_ON_FUNC_CALL = PhpVersion::PHP_70; + + /** + * @var int + */ + public const NO_MKTIME_WITHOUT_ARG = PhpVersion::PHP_70; + + /** + * @var int + */ + public const NO_EMPTY_LIST = PhpVersion::PHP_70; + + /** + * @var int + */ + public const STATIC_CALL = PhpVersion::PHP_70; + + /** + * @var int + */ + public const INSTANCE_CALL = PhpVersion::PHP_70; + + /** + * @var int + */ + public const NO_MULTIPLE_DEFAULT_SWITCH = PhpVersion::PHP_70; + + /** + * @var int + */ + public const WRAP_VARIABLE_VARIABLE = PhpVersion::PHP_70; + /** * @var int */ @@ -92,11 +196,76 @@ final class PhpVersionFeature */ public const MULTI_EXCEPTION_CATCH = PhpVersion::PHP_71; + /** + * @var int + */ + public const NO_ASSIGN_ARRAY_TO_STRING = PhpVersion::PHP_71; + + /** + * @var int + */ + public const BINARY_OP_NUMBER_STRING = PhpVersion::PHP_71; + + /** + * @var int + */ + public const NO_EXTRA_PARAMETERS = PhpVersion::PHP_71; + + /** + * @var int + */ + public const RESERVED_OBJECT_KEYWORD = PhpVersion::PHP_71; + + /** + * @var int + */ + public const DEPRECATE_EACH = PhpVersion::PHP_72; + /** * @var int */ public const OBJECT_TYPE = PhpVersion::PHP_72; + /** + * @var int + */ + public const NO_EACH_OUTSIDE_LOOP = PhpVersion::PHP_72; + + /** + * @var int + */ + public const DEPRECATE_CREATE_FUNCTION = PhpVersion::PHP_72; + + /** + * @var int + */ + public const NO_NULL_ON_GET_CLASS = PhpVersion::PHP_72; + + /** + * @var int + */ + public const INVERTED_BOOL_IS_OBJECT_INCOMPLETE_CLASS = PhpVersion::PHP_72; + + /** + * @var int + */ + public const RESULT_ARG_IN_PARSE_STR = PhpVersion::PHP_72; + + /** + * @var int + */ + public const STRING_IN_FIRST_DEFINE_ARG = PhpVersion::PHP_72; + + /** + * @var int + */ + public const STRING_IN_ASSERT_ARG = PhpVersion::PHP_72; + + /** + * @var int + */ + public const NO_UNSET_CAST = PhpVersion::PHP_72; + /** * @var int */ @@ -117,6 +286,31 @@ final class PhpVersionFeature */ public const SETCOOKIE_ACCEPT_ARRAY_OPTIONS = PhpVersion::PHP_73; + /** + * @var int + */ + public const DEPRECATE_INSENSITIVE_CONSTANT_NAME = PhpVersion::PHP_73; + + /** + * @var int + */ + public const ESCAPE_DASH_IN_REGEX = PhpVersion::PHP_73; + + /** + * @var int + */ + public const DEPRECATE_INSENSITIVE_CONSTANT_DEFINE = PhpVersion::PHP_73; + + /** + * @var int + */ + public const DEPRECATE_INT_IN_STR_NEEDLES = PhpVersion::PHP_73; + + /** + * @var int + */ + public const SENSITIVE_HERE_NOW_DOC = PhpVersion::PHP_73; + /** * @var int */ @@ -148,6 +342,46 @@ final class PhpVersionFeature */ public const ARRAY_SPREAD = PhpVersion::PHP_74; + /** + * @var int + */ + public const DEPRECATE_CURLY_BRACKET_ARRAY_STRING = PhpVersion::PHP_74; + + /** + * @var int + */ + public const DEPRECATE_REAL = PhpVersion::PHP_74; + + /** + * @var int + */ + public const ARRAY_KEY_EXISTS_TO_PROPERTY_EXISTS = PhpVersion::PHP_74; + + /** + * @var int + */ + public const FILTER_VAR_TO_ADD_SLASHES = PhpVersion::PHP_74; + + /** + * @var int + */ + public const CHANGE_MB_STRPOS_ARG_POSITION = PhpVersion::PHP_74; + + /** + * @var int + */ + public const RESERVED_FN_FUNCTION_NAME = PhpVersion::PHP_74; + + /** + * @var int + */ + public const REFLECTION_TYPE_GETNAME = PhpVersion::PHP_74; + + /** + * @var int + */ + public const EXPORT_TO_REFLECTION_FUNCTION = PhpVersion::PHP_74; + /** * @var int */ @@ -163,6 +397,21 @@ final class PhpVersionFeature */ public const STATIC_RETURN_TYPE = PhpVersion::PHP_80; + /** + * @var int + */ + public const NO_FINAL_PRIVATE = PhpVersion::PHP_80; + + /** + * @var int + */ + public const DEPRECATE_REQUIRED_PARAMETER_AFTER_OPTIONAL = PhpVersion::PHP_80; + + /** + * @var int + */ + public const STATIC_VISIBILITY_SET_STATE = PhpVersion::PHP_80; + /** * @var int */ @@ -195,6 +444,36 @@ final class PhpVersionFeature */ public const ATTRIBUTES = PhpVersion::PHP_80; + /** + * @var int + */ + public const STRINGABLE = PhpVersion::PHP_80; + + /** + * @var int + */ + public const PHP_TOKEN = PhpVersion::PHP_80; + + /** + * @var int + */ + public const STR_ENDS_WITH = PhpVersion::PHP_80; + + /** + * @var int + */ + public const STR_STARTS_WITH = PhpVersion::PHP_80; + + /** + * @var int + */ + public const STR_CONTAINS = PhpVersion::PHP_80; + + /** + * @var int + */ + public const GET_DEBUG_TYPE = PhpVersion::PHP_80; + /** * @see https://wiki.php.net/rfc/noreturn_type * @var int diff --git a/utils/phpstan-rules/src/Rules/PhpUpgradeImplementsMinPhpVersionInterfaceRule.php b/utils/phpstan-rules/src/Rules/PhpUpgradeImplementsMinPhpVersionInterfaceRule.php new file mode 100644 index 00000000000..6a80dab928d --- /dev/null +++ b/utils/phpstan-rules/src/Rules/PhpUpgradeImplementsMinPhpVersionInterfaceRule.php @@ -0,0 +1,96 @@ +> + */ + public function getNodeTypes(): array + { + return [Class_::class]; + } + + /** + * @param Class_ $node + * @return string[] + */ + public function process(Node $node, Scope $scope): array + { + /** @var string $className */ + $className = (string) $node->namespacedName; + if (! str_ends_with($className, 'Rector')) { + return []; + } + + if (! Strings::match($className, self::PREFIX_REGEX)) { + return []; + } + + $implements = $node->implements; + foreach ($implements as $implement) { + if (! $implement instanceof FullyQualified) { + continue; + } + + if ($implement->toString() !== 'Rector\VersionBonding\Contract\MinPhpVersionInterface') { + continue; + } + + return []; + } + + return [sprintf(self::ERROR_MESSAGE, $className)]; + } + + public function getRuleDefinition(): RuleDefinition + { + return new RuleDefinition(self::ERROR_MESSAGE, [ + new CodeSample( + <<<'CODE_SAMPLE' +namespace Rector\Php80\Rector\Switch_; + +final class ChangeSwitchToMatchRector extends AbstractRector +{ +} +CODE_SAMPLE + , + <<<'CODE_SAMPLE' +namespace Rector\Php80\Rector\Switch_; + +use Rector\VersionBonding\Contract\MinPhpVersionInterface; + +final class ChangeSwitchToMatchRector extends AbstractRector implements MinPhpVersionInterface +{ +} +CODE_SAMPLE + ), + ]); + } +} diff --git a/utils/phpstan-rules/tests/Rules/PhpUpgradeImplementsMinPhpVersionInterfaceRule/Fixture/SkipAlreadyImplementsMinPhpVersionRector.php b/utils/phpstan-rules/tests/Rules/PhpUpgradeImplementsMinPhpVersionInterfaceRule/Fixture/SkipAlreadyImplementsMinPhpVersionRector.php new file mode 100644 index 00000000000..56a1cd2f9e3 --- /dev/null +++ b/utils/phpstan-rules/tests/Rules/PhpUpgradeImplementsMinPhpVersionInterfaceRule/Fixture/SkipAlreadyImplementsMinPhpVersionRector.php @@ -0,0 +1,11 @@ + + */ +final class PhpUpgradeImplementsMinPhpVersionInterfaceRuleTest extends AbstractServiceAwareRuleTestCase +{ + /** + * @dataProvider provideData() + * @param array $expectedErrorMessagesWithLines + */ + public function testRule(string $filePath, array $expectedErrorMessagesWithLines): void + { + $this->analyse([$filePath], $expectedErrorMessagesWithLines); + } + + /** + * @return Iterator> + */ + public function provideData(): Iterator + { + yield [__DIR__ . '/Fixture/SkipDowngradeRector.php', []]; + yield [__DIR__ . '/Fixture/SkipAlreadyImplementsMinPhpVersionRector.php', []]; + yield [__DIR__ . '/Fixture/SomePhpFeatureRector.php', [ + [sprintf(PhpUpgradeImplementsMinPhpVersionInterfaceRule::ERROR_MESSAGE, 'Rector\Php80\Rector\Class_\SomePhpFeatureRector'), 7] + ]]; + } + + protected function getRule(): Rule + { + return $this->getRuleFromConfig( + PhpUpgradeImplementsMinPhpVersionInterfaceRule::class, + __DIR__ . '/config/configured_rule.neon' + ); + } +} diff --git a/utils/phpstan-rules/tests/Rules/PhpUpgradeImplementsMinPhpVersionInterfaceRule/config/configured_rule.neon b/utils/phpstan-rules/tests/Rules/PhpUpgradeImplementsMinPhpVersionInterfaceRule/config/configured_rule.neon new file mode 100644 index 00000000000..4346520c6f8 --- /dev/null +++ b/utils/phpstan-rules/tests/Rules/PhpUpgradeImplementsMinPhpVersionInterfaceRule/config/configured_rule.neon @@ -0,0 +1,5 @@ +services: + - Symplify\SmartFileSystem\SmartFileSystem + - + class: Rector\PHPStanRules\Rules\PhpUpgradeImplementsMinPhpVersionInterfaceRule + tags: [phpstan.rules.rule]