[DX] Add PhpUpgradeImplementsMinPhpVersionInterfaceRule (#910)

Co-authored-by: GitHub Action <action@github.com>
This commit is contained in:
Abdul Malik Ikhsan 2021-09-24 19:25:49 +07:00 committed by GitHub
parent ef779c9ced
commit 49314dc3d4
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
73 changed files with 944 additions and 157 deletions

View File

@ -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

View File

@ -1,47 +0,0 @@
<?php
namespace Rector\Tests\Php73\Rector\BinaryOr\IsCountableRector\Fixture;
use Countable;
class PolyfillFunction
{
public function run($foo)
{
return is_array($foo) || $foo instanceof Countable;
}
}
// dummy
if (! function_exists('is_countable')) {
function is_countable($args)
{
return true;
}
}
?>
-----
<?php
namespace Rector\Tests\Php73\Rector\BinaryOr\IsCountableRector\Fixture;
use Countable;
class PolyfillFunction
{
public function run($foo)
{
return is_countable($foo);
}
}
// dummy
if (! function_exists('is_countable')) {
function is_countable($args)
{
return true;
}
}
?>

View File

@ -1,33 +0,0 @@
<?php
declare(strict_types=1);
namespace Rector\Tests\Php73\Rector\BinaryOr\IsCountableRector;
use Iterator;
use Rector\Testing\PHPUnit\AbstractRectorTestCase;
use Symplify\SmartFileSystem\SmartFileInfo;
final class PolyfillRectorTest extends AbstractRectorTestCase
{
/**
* @dataProvider provideData()
*/
public function test(SmartFileInfo $fileInfo): void
{
$this->doTestFileInfo($fileInfo);
}
/**
* @return Iterator<SmartFileInfo>
*/
public function provideData(): Iterator
{
return $this->yieldFilesFromDirectory(__DIR__ . '/FixtureWithPolyfill');
}
public function provideConfigFilePath(): string
{
return __DIR__ . '/config/polyfill_config.php';
}
}

View File

@ -1,16 +0,0 @@
<?php
declare(strict_types=1);
use Rector\Core\Configuration\Option;
use Rector\Core\ValueObject\PhpVersionFeature;
use Rector\Php73\Rector\BooleanOr\IsCountableRector;
use Symfony\Component\DependencyInjection\Loader\Configurator\ContainerConfigurator;
return static function (ContainerConfigurator $containerConfigurator): void {
$parameters = $containerConfigurator->parameters();
$parameters->set(Option::PHP_VERSION_FEATURES, PhpVersionFeature::IS_COUNTABLE - 1);
$services = $containerConfigurator->services();
$services->set(IsCountableRector::class);
};

View File

@ -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`', [

View File

@ -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', [

View File

@ -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(

View File

@ -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<string, string>
@ -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(

View File

@ -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', [

View File

@ -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', [

View File

@ -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(

View File

@ -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', [

View File

@ -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<class-string<Node>>
*/

View File

@ -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(

View File

@ -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(

View File

@ -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<string, string>
@ -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(

View File

@ -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<string, string>
@ -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(

View File

@ -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<class-string<Node>>
*/

View File

@ -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<class-string<Node>>
*/

View File

@ -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<class-string<Node>>
*/

View File

@ -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(

View File

@ -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(

View File

@ -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(

View File

@ -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(

View File

@ -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(

View File

@ -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(

View File

@ -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(

View File

@ -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(

View File

@ -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', [

View File

@ -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(

View File

@ -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(

View File

@ -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', [

View File

@ -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(

View File

@ -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()', [

View File

@ -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(

View File

@ -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(

View File

@ -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', [

View File

@ -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(

View File

@ -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', [

View File

@ -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(

View File

@ -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,

View File

@ -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(

View File

@ -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', [

View File

@ -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(

View File

@ -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', [

View File

@ -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(

View File

@ -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(

View File

@ -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)', [

View File

@ -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(

View File

@ -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(

View File

@ -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(

View File

@ -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', [

View File

@ -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', [

View File

@ -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(

View File

@ -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', [

View File

@ -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', [

View File

@ -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', [

View File

@ -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', [

View File

@ -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(

View File

@ -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(

View File

@ -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()', [

View File

@ -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(

View File

@ -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(

View File

@ -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(

View File

@ -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', [

View File

@ -6,6 +6,12 @@ namespace Rector\Core\ValueObject;
final class PhpVersion
{
/**
* @api
* @var int
*/
public const PHP_52 = 50200;
/**
* @api
* @var int

View File

@ -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

View File

@ -0,0 +1,96 @@
<?php
declare(strict_types=1);
namespace Rector\PHPStanRules\Rules;
use Nette\Utils\Strings;
use PhpParser\Node;
use PhpParser\Node\Name\FullyQualified;
use PhpParser\Node\Stmt\Class_;
use PHPStan\Analyser\Scope;
use Symplify\PHPStanRules\Rules\AbstractSymplifyRule;
use Symplify\RuleDocGenerator\ValueObject\CodeSample\CodeSample;
use Symplify\RuleDocGenerator\ValueObject\RuleDefinition;
/**
* @see \Rector\PHPStanRules\Tests\Rules\PhpUpgradeImplementsMinPhpVersionInterfaceRule\PhpUpgradeImplementsMinPhpVersionInterfaceRuleTest
*/
final class PhpUpgradeImplementsMinPhpVersionInterfaceRule extends AbstractSymplifyRule
{
/**
* @var string
*/
public const ERROR_MESSAGE = 'Rule %s must implements Rector\VersionBonding\Contract\MinPhpVersionInterface';
/**
* @var string
* @see https://regex101.com/r/9d3jGP/2/
*/
private const PREFIX_REGEX = '#\\\\Php\d+\\\\#';
/**
* @return array<class-string<Node>>
*/
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
),
]);
}
}

View File

@ -0,0 +1,11 @@
<?php
declare(strict_types=1);
namespace Rector\DowngradePhp80\Rector\Class_;
use Rector\VersionBonding\Contract\MinPhpVersionInterface;
final class SkipAlreadyImplementsMinPhpVersionRector implements MinPhpVersionInterface
{
}

View File

@ -0,0 +1,9 @@
<?php
declare(strict_types=1);
namespace Rector\DowngradePhp80\Rector\Class_;
final class SkipDowngradeRector
{
}

View File

@ -0,0 +1,9 @@
<?php
declare(strict_types=1);
namespace Rector\Php80\Rector\Class_;
final class SomePhpFeatureRector
{
}

View File

@ -0,0 +1,45 @@
<?php
declare(strict_types=1);
namespace Rector\PHPStanRules\Tests\Rules\PhpUpgradeImplementsMinPhpVersionInterfaceRule;
use Iterator;
use PHPStan\Rules\Rule;
use Rector\PHPStanRules\Rules\PhpUpgradeImplementsMinPhpVersionInterfaceRule;
use Symplify\PHPStanExtensions\Testing\AbstractServiceAwareRuleTestCase;
/**
* @extends AbstractServiceAwareRuleTestCase<PhpUpgradeImplementsMinPhpVersionInterfaceRule>
*/
final class PhpUpgradeImplementsMinPhpVersionInterfaceRuleTest extends AbstractServiceAwareRuleTestCase
{
/**
* @dataProvider provideData()
* @param array<string|int> $expectedErrorMessagesWithLines
*/
public function testRule(string $filePath, array $expectedErrorMessagesWithLines): void
{
$this->analyse([$filePath], $expectedErrorMessagesWithLines);
}
/**
* @return Iterator<string[]|array<int, mixed[]>>
*/
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'
);
}
}

View File

@ -0,0 +1,5 @@
services:
- Symplify\SmartFileSystem\SmartFileSystem
-
class: Rector\PHPStanRules\Rules\PhpUpgradeImplementsMinPhpVersionInterfaceRule
tags: [phpstan.rules.rule]