Updated Rector to commit 86682e4848dcfaecdb6dac7d07ffcb4cd47e69bf

86682e4848 Less doc, move from NodeRemover from AbstractRector - use directly or remove nodes right at the moment - that creates safer tree (#2741)
This commit is contained in:
Tomas Votruba 2022-08-06 21:53:15 +00:00
parent 7e0a2dbc82
commit 089ad6e357
55 changed files with 370 additions and 1557 deletions

View File

@ -100,7 +100,7 @@ final class NodeRemover
*/
public function removeArg($node, int $key) : void
{
if ($node->args === null) {
if ($node->getArgs() === []) {
throw new ShouldNotHappenException();
}
// already removed
@ -111,13 +111,4 @@ final class NodeRemover
$this->rectorChangeCollector->notifyNodeFileInfo($node->args[$key]);
unset($node->args[$key]);
}
public function removeImplements(Class_ $class, int $key) : void
{
if ($class->implements === null) {
throw new ShouldNotHappenException();
}
// notify about remove node
$this->rectorChangeCollector->notifyNodeFileInfo($class->implements[$key]);
unset($class->implements[$key]);
}
}

View File

@ -55,7 +55,7 @@ CODE_SAMPLE
if ($removedFunctionArgument->getArgumentPosition() !== $position) {
continue;
}
$this->nodeRemover->removeArg($node, $position);
unset($node->args[$position]);
$hasChanged = \true;
}
}

View File

@ -3,6 +3,7 @@
declare (strict_types=1);
namespace Rector\Removing\ValueObject;
use Rector\Core\Validation\RectorAssert;
final class RemoveFuncCall
{
/**
@ -22,6 +23,7 @@ final class RemoveFuncCall
{
$this->funcCall = $funcCall;
$this->argumentPositionAndValues = $argumentPositionAndValues;
RectorAssert::functionName($funcCall);
}
public function getFuncCall() : string
{

View File

@ -3,6 +3,7 @@
declare (strict_types=1);
namespace Rector\Removing\ValueObject;
use Rector\Core\Validation\RectorAssert;
final class RemoveFuncCallArg
{
/**
@ -19,6 +20,7 @@ final class RemoveFuncCallArg
{
$this->function = $function;
$this->argumentPosition = $argumentPosition;
RectorAssert::functionName($function);
}
public function getFunction() : string
{

View File

@ -87,7 +87,7 @@ CODE_SAMPLE
foreach ($implements as $key => $name) {
$fqnName = $this->getName($name);
if (\in_array($fqnName, $alreadyAddedNames, \true)) {
$this->nodeRemover->removeImplements($class, $key);
unset($class->implements[$key]);
continue;
}
$alreadyAddedNames[] = $fqnName;

View File

@ -17,12 +17,12 @@ final class VersionResolver
* @api
* @var string
*/
public const PACKAGE_VERSION = '6ad7b03704e639c95759d14c67444009c3b93259';
public const PACKAGE_VERSION = '86682e4848dcfaecdb6dac7d07ffcb4cd47e69bf';
/**
* @api
* @var string
*/
public const RELEASE_DATE = '2022-08-06 15:18:49';
public const RELEASE_DATE = '2022-08-06 21:47:35';
/**
* @var int
*/

View File

@ -87,6 +87,7 @@ CODE_SAMPLE;
*/
protected $betterNodeFinder;
/**
* @deprecated Use service directly or return changes nodes
* @var \Rector\NodeRemoval\NodeRemover
*/
protected $nodeRemover;

2
vendor/autoload.php vendored
View File

@ -9,4 +9,4 @@ if (PHP_VERSION_ID < 50600) {
require_once __DIR__ . '/composer/autoload_real.php';
return ComposerAutoloaderInit222c68caf75058fc89c482e6539adcba::getLoader();
return ComposerAutoloaderInit15b3e3f37c257ff0b0f8af72563cf505::getLoader();

View File

@ -2072,24 +2072,10 @@ return array(
'Rector\\Naming\\ValueObject\\VariableAndCallAssign' => $baseDir . '/rules/Naming/ValueObject/VariableAndCallAssign.php',
'Rector\\Naming\\ValueObject\\VariableAndCallForeach' => $baseDir . '/rules/Naming/ValueObject/VariableAndCallForeach.php',
'Rector\\Naming\\VariableRenamer' => $baseDir . '/rules/Naming/VariableRenamer.php',
'Rector\\Nette\\Contract\\FormControlTypeResolverInterface' => $vendorDir . '/rector/rector-nette/src/Contract/FormControlTypeResolverInterface.php',
'Rector\\Nette\\Contract\\Rector\\LatteRectorInterface' => $vendorDir . '/rector/rector-nette/src/Contract/Rector/LatteRectorInterface.php',
'Rector\\Nette\\Contract\\Rector\\NeonRectorInterface' => $vendorDir . '/rector/rector-nette/src/Contract/Rector/NeonRectorInterface.php',
'Rector\\Nette\\Enum\\NetteFormMethodNameToControlType' => $vendorDir . '/rector/rector-nette/src/Enum/NetteFormMethodNameToControlType.php',
'Rector\\Nette\\FileProcessor\\LatteFileProcessor' => $vendorDir . '/rector/rector-nette/src/FileProcessor/LatteFileProcessor.php',
'Rector\\Nette\\FileProcessor\\NeonFileProcessor' => $vendorDir . '/rector/rector-nette/src/FileProcessor/NeonFileProcessor.php',
'Rector\\Nette\\FormControlTypeResolver\\ArrayDimFetchControlTypeResolver' => $vendorDir . '/rector/rector-nette/src/FormControlTypeResolver/ArrayDimFetchControlTypeResolver.php',
'Rector\\Nette\\FormControlTypeResolver\\AssignDimFetchFormTypeResolver' => $vendorDir . '/rector/rector-nette/src/FormControlTypeResolver/AssignDimFetchFormTypeResolver.php',
'Rector\\Nette\\FormControlTypeResolver\\AssignedVariablesMethodCallsFormTypeResolver' => $vendorDir . '/rector/rector-nette/src/FormControlTypeResolver/AssignedVariablesMethodCallsFormTypeResolver.php',
'Rector\\Nette\\FormControlTypeResolver\\ClassMethodFormTypeResolver' => $vendorDir . '/rector/rector-nette/src/FormControlTypeResolver/ClassMethodFormTypeResolver.php',
'Rector\\Nette\\FormControlTypeResolver\\ConstructorFormControlTypeResolver' => $vendorDir . '/rector/rector-nette/src/FormControlTypeResolver/ConstructorFormControlTypeResolver.php',
'Rector\\Nette\\FormControlTypeResolver\\GetComponentMethodCallFormControlTypeResolver' => $vendorDir . '/rector/rector-nette/src/FormControlTypeResolver/GetComponentMethodCallFormControlTypeResolver.php',
'Rector\\Nette\\FormControlTypeResolver\\MagicNetteFactoryInterfaceFormControlTypeResolver' => $vendorDir . '/rector/rector-nette/src/FormControlTypeResolver/MagicNetteFactoryInterfaceFormControlTypeResolver.php',
'Rector\\Nette\\FormControlTypeResolver\\NewFormControlTypeResolver' => $vendorDir . '/rector/rector-nette/src/FormControlTypeResolver/NewFormControlTypeResolver.php',
'Rector\\Nette\\FormControlTypeResolver\\OnVariableMethodCallsFormControlTypeResolver' => $vendorDir . '/rector/rector-nette/src/FormControlTypeResolver/OnVariableMethodCallsFormControlTypeResolver.php',
'Rector\\Nette\\FormControlTypeResolver\\ReturnFormControlTypeResolver' => $vendorDir . '/rector/rector-nette/src/FormControlTypeResolver/ReturnFormControlTypeResolver.php',
'Rector\\Nette\\FormControlTypeResolver\\ThisVariableInAnotherMethodFormControlTypeResolver' => $vendorDir . '/rector/rector-nette/src/FormControlTypeResolver/ThisVariableInAnotherMethodFormControlTypeResolver.php',
'Rector\\Nette\\FormControlTypeResolver\\VariableConstructorFormControlTypeResolver' => $vendorDir . '/rector/rector-nette/src/FormControlTypeResolver/VariableConstructorFormControlTypeResolver.php',
'Rector\\Nette\\Kdyby\\BlueprintFactory\\VariableWithTypesFactory' => $vendorDir . '/rector/rector-nette/src/Kdyby/BlueprintFactory/VariableWithTypesFactory.php',
'Rector\\Nette\\Kdyby\\ContributeEventClassResolver' => $vendorDir . '/rector/rector-nette/src/Kdyby/ContributeEventClassResolver.php',
'Rector\\Nette\\Kdyby\\Naming\\EventClassNaming' => $vendorDir . '/rector/rector-nette/src/Kdyby/Naming/EventClassNaming.php',
@ -2106,7 +2092,6 @@ return array(
'Rector\\Nette\\Kdyby\\ValueObject\\VariableWithType' => $vendorDir . '/rector/rector-nette/src/Kdyby/ValueObject/VariableWithType.php',
'Rector\\Nette\\Latte\\Parser\\TemplateTypeParser' => $vendorDir . '/rector/rector-nette/src/Latte/Parser/TemplateTypeParser.php',
'Rector\\Nette\\Latte\\Parser\\VarTypeParser' => $vendorDir . '/rector/rector-nette/src/Latte/Parser/VarTypeParser.php',
'Rector\\Nette\\Naming\\NetteControlNaming' => $vendorDir . '/rector/rector-nette/src/Naming/NetteControlNaming.php',
'Rector\\Nette\\NeonParser\\Contract\\NeonNodeVisitorInterface' => $vendorDir . '/rector/rector-nette/packages/NeonParser/Contract/NeonNodeVisitorInterface.php',
'Rector\\Nette\\NeonParser\\Exception\\NotImplementedYetException' => $vendorDir . '/rector/rector-nette/packages/NeonParser/Exception/NotImplementedYetException.php',
'Rector\\Nette\\NeonParser\\Exception\\UnusedVirtualMethodException' => $vendorDir . '/rector/rector-nette/packages/NeonParser/Exception/UnusedVirtualMethodException.php',
@ -2120,14 +2105,9 @@ return array(
'Rector\\Nette\\NeonParser\\Node\\Service_\\SetupMethodCall' => $vendorDir . '/rector/rector-nette/packages/NeonParser/Node/Service_/SetupMethodCall.php',
'Rector\\Nette\\NeonParser\\Printer\\FormatPreservingNeonPrinter' => $vendorDir . '/rector/rector-nette/packages/NeonParser/Printer/FormatPreservingNeonPrinter.php',
'Rector\\Nette\\NeonParser\\Services\\ServiceTypeResolver' => $vendorDir . '/rector/rector-nette/packages/NeonParser/Services/ServiceTypeResolver.php',
'Rector\\Nette\\NodeAnalyzer\\ArrayDimFetchAnalyzer' => $vendorDir . '/rector/rector-nette/src/NodeAnalyzer/ArrayDimFetchAnalyzer.php',
'Rector\\Nette\\NodeAnalyzer\\ArrayDimFetchRenamer' => $vendorDir . '/rector/rector-nette/src/NodeAnalyzer/ArrayDimFetchRenamer.php',
'Rector\\Nette\\NodeAnalyzer\\AssignAnalyzer' => $vendorDir . '/rector/rector-nette/src/NodeAnalyzer/AssignAnalyzer.php',
'Rector\\Nette\\NodeAnalyzer\\BinaryOpAnalyzer' => $vendorDir . '/rector/rector-nette/src/NodeAnalyzer/BinaryOpAnalyzer.php',
'Rector\\Nette\\NodeAnalyzer\\ConditionalTemplateAssignReplacer' => $vendorDir . '/rector/rector-nette/src/NodeAnalyzer/ConditionalTemplateAssignReplacer.php',
'Rector\\Nette\\NodeAnalyzer\\ControlDimFetchAnalyzer' => $vendorDir . '/rector/rector-nette/src/NodeAnalyzer/ControlDimFetchAnalyzer.php',
'Rector\\Nette\\NodeAnalyzer\\MethodCallArgMerger' => $vendorDir . '/rector/rector-nette/src/NodeAnalyzer/MethodCallArgMerger.php',
'Rector\\Nette\\NodeAnalyzer\\MethodCallManipulator' => $vendorDir . '/rector/rector-nette/src/NodeAnalyzer/MethodCallManipulator.php',
'Rector\\Nette\\NodeAnalyzer\\NetteClassAnalyzer' => $vendorDir . '/rector/rector-nette/src/NodeAnalyzer/NetteClassAnalyzer.php',
'Rector\\Nette\\NodeAnalyzer\\NetteInjectPropertyAnalyzer' => $vendorDir . '/rector/rector-nette/src/NodeAnalyzer/NetteInjectPropertyAnalyzer.php',
'Rector\\Nette\\NodeAnalyzer\\PregMatchAllAnalyzer' => $vendorDir . '/rector/rector-nette/src/NodeAnalyzer/PregMatchAllAnalyzer.php',
@ -2149,8 +2129,6 @@ return array(
'Rector\\Nette\\NodeFinder\\FormOnSuccessCallbackValuesParamFinder' => $vendorDir . '/rector/rector-nette/src/NodeFinder/FormOnSuccessCallbackValuesParamFinder.php',
'Rector\\Nette\\NodeFinder\\FormVariableFinder' => $vendorDir . '/rector/rector-nette/src/NodeFinder/FormVariableFinder.php',
'Rector\\Nette\\NodeFinder\\ParamFinder' => $vendorDir . '/rector/rector-nette/src/NodeFinder/ParamFinder.php',
'Rector\\Nette\\NodeResolver\\MethodNamesByInputNamesResolver' => $vendorDir . '/rector/rector-nette/src/NodeResolver/MethodNamesByInputNamesResolver.php',
'Rector\\Nette\\Rector\\ArrayDimFetch\\AnnotateMagicalControlArrayAccessRector' => $vendorDir . '/rector/rector-nette/src/Rector/ArrayDimFetch/AnnotateMagicalControlArrayAccessRector.php',
'Rector\\Nette\\Rector\\Assign\\ArrayAccessGetControlToGetComponentMethodCallRector' => $vendorDir . '/rector/rector-nette/src/Rector/Assign/ArrayAccessGetControlToGetComponentMethodCallRector.php',
'Rector\\Nette\\Rector\\Assign\\ArrayAccessSetControlToAddComponentMethodCallRector' => $vendorDir . '/rector/rector-nette/src/Rector/Assign/ArrayAccessSetControlToAddComponentMethodCallRector.php',
'Rector\\Nette\\Rector\\Assign\\MakeGetComponentAssignAnnotatedRector' => $vendorDir . '/rector/rector-nette/src/Rector/Assign/MakeGetComponentAssignAnnotatedRector.php',
@ -2832,6 +2810,7 @@ return array(
'Rector\\Symfony\\Rector\\Class_\\MakeCommandLazyRector' => $vendorDir . '/rector/rector-symfony/src/Rector/Class_/MakeCommandLazyRector.php',
'Rector\\Symfony\\Rector\\ConstFetch\\ConstraintUrlOptionRector' => $vendorDir . '/rector/rector-symfony/src/Rector/ConstFetch/ConstraintUrlOptionRector.php',
'Rector\\Symfony\\Rector\\FuncCall\\ReplaceServiceArgumentRector' => $vendorDir . '/rector/rector-symfony/src/Rector/FuncCall/ReplaceServiceArgumentRector.php',
'Rector\\Symfony\\Rector\\MethodCall\\AddViolationToBuildViolationRector' => $vendorDir . '/rector/rector-symfony/src/Rector/MethodCall/AddViolationToBuildViolationRector.php',
'Rector\\Symfony\\Rector\\MethodCall\\AuthorizationCheckerIsGrantedExtractorRector' => $vendorDir . '/rector/rector-symfony/src/Rector/MethodCall/AuthorizationCheckerIsGrantedExtractorRector.php',
'Rector\\Symfony\\Rector\\MethodCall\\CascadeValidationFormBuilderRector' => $vendorDir . '/rector/rector-symfony/src/Rector/MethodCall/CascadeValidationFormBuilderRector.php',
'Rector\\Symfony\\Rector\\MethodCall\\ChangeCollectionTypeOptionNameFromTypeToEntryTypeRector' => $vendorDir . '/rector/rector-symfony/src/Rector/MethodCall/ChangeCollectionTypeOptionNameFromTypeToEntryTypeRector.php',
@ -2852,6 +2831,7 @@ return array(
'Rector\\Symfony\\Rector\\MethodCall\\ReadOnlyOptionToAttributeRector' => $vendorDir . '/rector/rector-symfony/src/Rector/MethodCall/ReadOnlyOptionToAttributeRector.php',
'Rector\\Symfony\\Rector\\MethodCall\\RedirectToRouteRector' => $vendorDir . '/rector/rector-symfony/src/Rector/MethodCall/RedirectToRouteRector.php',
'Rector\\Symfony\\Rector\\MethodCall\\ReflectionExtractorEnableMagicCallExtractorRector' => $vendorDir . '/rector/rector-symfony/src/Rector/MethodCall/ReflectionExtractorEnableMagicCallExtractorRector.php',
'Rector\\Symfony\\Rector\\MethodCall\\ServiceSetStringNameToClassNameRector' => $vendorDir . '/rector/rector-symfony/src/Rector/MethodCall/ServiceSetStringNameToClassNameRector.php',
'Rector\\Symfony\\Rector\\MethodCall\\StringFormTypeToClassRector' => $vendorDir . '/rector/rector-symfony/src/Rector/MethodCall/StringFormTypeToClassRector.php',
'Rector\\Symfony\\Rector\\MethodCall\\SwiftCreateMessageToNewEmailRector' => $vendorDir . '/rector/rector-symfony/src/Rector/MethodCall/SwiftCreateMessageToNewEmailRector.php',
'Rector\\Symfony\\Rector\\MethodCall\\SwiftSetBodyToHtmlPlainMethodCallRector' => $vendorDir . '/rector/rector-symfony/src/Rector/MethodCall/SwiftSetBodyToHtmlPlainMethodCallRector.php',

View File

@ -2,7 +2,7 @@
// autoload_real.php @generated by Composer
class ComposerAutoloaderInit222c68caf75058fc89c482e6539adcba
class ComposerAutoloaderInit15b3e3f37c257ff0b0f8af72563cf505
{
private static $loader;
@ -22,19 +22,19 @@ class ComposerAutoloaderInit222c68caf75058fc89c482e6539adcba
return self::$loader;
}
spl_autoload_register(array('ComposerAutoloaderInit222c68caf75058fc89c482e6539adcba', 'loadClassLoader'), true, true);
spl_autoload_register(array('ComposerAutoloaderInit15b3e3f37c257ff0b0f8af72563cf505', 'loadClassLoader'), true, true);
self::$loader = $loader = new \Composer\Autoload\ClassLoader(\dirname(__DIR__));
spl_autoload_unregister(array('ComposerAutoloaderInit222c68caf75058fc89c482e6539adcba', 'loadClassLoader'));
spl_autoload_unregister(array('ComposerAutoloaderInit15b3e3f37c257ff0b0f8af72563cf505', 'loadClassLoader'));
require __DIR__ . '/autoload_static.php';
call_user_func(\Composer\Autoload\ComposerStaticInit222c68caf75058fc89c482e6539adcba::getInitializer($loader));
call_user_func(\Composer\Autoload\ComposerStaticInit15b3e3f37c257ff0b0f8af72563cf505::getInitializer($loader));
$loader->setClassMapAuthoritative(true);
$loader->register(true);
$includeFiles = \Composer\Autoload\ComposerStaticInit222c68caf75058fc89c482e6539adcba::$files;
$includeFiles = \Composer\Autoload\ComposerStaticInit15b3e3f37c257ff0b0f8af72563cf505::$files;
foreach ($includeFiles as $fileIdentifier => $file) {
composerRequire222c68caf75058fc89c482e6539adcba($fileIdentifier, $file);
composerRequire15b3e3f37c257ff0b0f8af72563cf505($fileIdentifier, $file);
}
return $loader;
@ -46,7 +46,7 @@ class ComposerAutoloaderInit222c68caf75058fc89c482e6539adcba
* @param string $file
* @return void
*/
function composerRequire222c68caf75058fc89c482e6539adcba($fileIdentifier, $file)
function composerRequire15b3e3f37c257ff0b0f8af72563cf505($fileIdentifier, $file)
{
if (empty($GLOBALS['__composer_autoload_files'][$fileIdentifier])) {
$GLOBALS['__composer_autoload_files'][$fileIdentifier] = true;

View File

@ -4,7 +4,7 @@
namespace Composer\Autoload;
class ComposerStaticInit222c68caf75058fc89c482e6539adcba
class ComposerStaticInit15b3e3f37c257ff0b0f8af72563cf505
{
public static $files = array (
'0e6d7bf4a5811bfa5cf40c5ccd6fae6a' => __DIR__ . '/..' . '/symfony/polyfill-mbstring/bootstrap.php',
@ -2379,24 +2379,10 @@ class ComposerStaticInit222c68caf75058fc89c482e6539adcba
'Rector\\Naming\\ValueObject\\VariableAndCallAssign' => __DIR__ . '/../..' . '/rules/Naming/ValueObject/VariableAndCallAssign.php',
'Rector\\Naming\\ValueObject\\VariableAndCallForeach' => __DIR__ . '/../..' . '/rules/Naming/ValueObject/VariableAndCallForeach.php',
'Rector\\Naming\\VariableRenamer' => __DIR__ . '/../..' . '/rules/Naming/VariableRenamer.php',
'Rector\\Nette\\Contract\\FormControlTypeResolverInterface' => __DIR__ . '/..' . '/rector/rector-nette/src/Contract/FormControlTypeResolverInterface.php',
'Rector\\Nette\\Contract\\Rector\\LatteRectorInterface' => __DIR__ . '/..' . '/rector/rector-nette/src/Contract/Rector/LatteRectorInterface.php',
'Rector\\Nette\\Contract\\Rector\\NeonRectorInterface' => __DIR__ . '/..' . '/rector/rector-nette/src/Contract/Rector/NeonRectorInterface.php',
'Rector\\Nette\\Enum\\NetteFormMethodNameToControlType' => __DIR__ . '/..' . '/rector/rector-nette/src/Enum/NetteFormMethodNameToControlType.php',
'Rector\\Nette\\FileProcessor\\LatteFileProcessor' => __DIR__ . '/..' . '/rector/rector-nette/src/FileProcessor/LatteFileProcessor.php',
'Rector\\Nette\\FileProcessor\\NeonFileProcessor' => __DIR__ . '/..' . '/rector/rector-nette/src/FileProcessor/NeonFileProcessor.php',
'Rector\\Nette\\FormControlTypeResolver\\ArrayDimFetchControlTypeResolver' => __DIR__ . '/..' . '/rector/rector-nette/src/FormControlTypeResolver/ArrayDimFetchControlTypeResolver.php',
'Rector\\Nette\\FormControlTypeResolver\\AssignDimFetchFormTypeResolver' => __DIR__ . '/..' . '/rector/rector-nette/src/FormControlTypeResolver/AssignDimFetchFormTypeResolver.php',
'Rector\\Nette\\FormControlTypeResolver\\AssignedVariablesMethodCallsFormTypeResolver' => __DIR__ . '/..' . '/rector/rector-nette/src/FormControlTypeResolver/AssignedVariablesMethodCallsFormTypeResolver.php',
'Rector\\Nette\\FormControlTypeResolver\\ClassMethodFormTypeResolver' => __DIR__ . '/..' . '/rector/rector-nette/src/FormControlTypeResolver/ClassMethodFormTypeResolver.php',
'Rector\\Nette\\FormControlTypeResolver\\ConstructorFormControlTypeResolver' => __DIR__ . '/..' . '/rector/rector-nette/src/FormControlTypeResolver/ConstructorFormControlTypeResolver.php',
'Rector\\Nette\\FormControlTypeResolver\\GetComponentMethodCallFormControlTypeResolver' => __DIR__ . '/..' . '/rector/rector-nette/src/FormControlTypeResolver/GetComponentMethodCallFormControlTypeResolver.php',
'Rector\\Nette\\FormControlTypeResolver\\MagicNetteFactoryInterfaceFormControlTypeResolver' => __DIR__ . '/..' . '/rector/rector-nette/src/FormControlTypeResolver/MagicNetteFactoryInterfaceFormControlTypeResolver.php',
'Rector\\Nette\\FormControlTypeResolver\\NewFormControlTypeResolver' => __DIR__ . '/..' . '/rector/rector-nette/src/FormControlTypeResolver/NewFormControlTypeResolver.php',
'Rector\\Nette\\FormControlTypeResolver\\OnVariableMethodCallsFormControlTypeResolver' => __DIR__ . '/..' . '/rector/rector-nette/src/FormControlTypeResolver/OnVariableMethodCallsFormControlTypeResolver.php',
'Rector\\Nette\\FormControlTypeResolver\\ReturnFormControlTypeResolver' => __DIR__ . '/..' . '/rector/rector-nette/src/FormControlTypeResolver/ReturnFormControlTypeResolver.php',
'Rector\\Nette\\FormControlTypeResolver\\ThisVariableInAnotherMethodFormControlTypeResolver' => __DIR__ . '/..' . '/rector/rector-nette/src/FormControlTypeResolver/ThisVariableInAnotherMethodFormControlTypeResolver.php',
'Rector\\Nette\\FormControlTypeResolver\\VariableConstructorFormControlTypeResolver' => __DIR__ . '/..' . '/rector/rector-nette/src/FormControlTypeResolver/VariableConstructorFormControlTypeResolver.php',
'Rector\\Nette\\Kdyby\\BlueprintFactory\\VariableWithTypesFactory' => __DIR__ . '/..' . '/rector/rector-nette/src/Kdyby/BlueprintFactory/VariableWithTypesFactory.php',
'Rector\\Nette\\Kdyby\\ContributeEventClassResolver' => __DIR__ . '/..' . '/rector/rector-nette/src/Kdyby/ContributeEventClassResolver.php',
'Rector\\Nette\\Kdyby\\Naming\\EventClassNaming' => __DIR__ . '/..' . '/rector/rector-nette/src/Kdyby/Naming/EventClassNaming.php',
@ -2413,7 +2399,6 @@ class ComposerStaticInit222c68caf75058fc89c482e6539adcba
'Rector\\Nette\\Kdyby\\ValueObject\\VariableWithType' => __DIR__ . '/..' . '/rector/rector-nette/src/Kdyby/ValueObject/VariableWithType.php',
'Rector\\Nette\\Latte\\Parser\\TemplateTypeParser' => __DIR__ . '/..' . '/rector/rector-nette/src/Latte/Parser/TemplateTypeParser.php',
'Rector\\Nette\\Latte\\Parser\\VarTypeParser' => __DIR__ . '/..' . '/rector/rector-nette/src/Latte/Parser/VarTypeParser.php',
'Rector\\Nette\\Naming\\NetteControlNaming' => __DIR__ . '/..' . '/rector/rector-nette/src/Naming/NetteControlNaming.php',
'Rector\\Nette\\NeonParser\\Contract\\NeonNodeVisitorInterface' => __DIR__ . '/..' . '/rector/rector-nette/packages/NeonParser/Contract/NeonNodeVisitorInterface.php',
'Rector\\Nette\\NeonParser\\Exception\\NotImplementedYetException' => __DIR__ . '/..' . '/rector/rector-nette/packages/NeonParser/Exception/NotImplementedYetException.php',
'Rector\\Nette\\NeonParser\\Exception\\UnusedVirtualMethodException' => __DIR__ . '/..' . '/rector/rector-nette/packages/NeonParser/Exception/UnusedVirtualMethodException.php',
@ -2427,14 +2412,9 @@ class ComposerStaticInit222c68caf75058fc89c482e6539adcba
'Rector\\Nette\\NeonParser\\Node\\Service_\\SetupMethodCall' => __DIR__ . '/..' . '/rector/rector-nette/packages/NeonParser/Node/Service_/SetupMethodCall.php',
'Rector\\Nette\\NeonParser\\Printer\\FormatPreservingNeonPrinter' => __DIR__ . '/..' . '/rector/rector-nette/packages/NeonParser/Printer/FormatPreservingNeonPrinter.php',
'Rector\\Nette\\NeonParser\\Services\\ServiceTypeResolver' => __DIR__ . '/..' . '/rector/rector-nette/packages/NeonParser/Services/ServiceTypeResolver.php',
'Rector\\Nette\\NodeAnalyzer\\ArrayDimFetchAnalyzer' => __DIR__ . '/..' . '/rector/rector-nette/src/NodeAnalyzer/ArrayDimFetchAnalyzer.php',
'Rector\\Nette\\NodeAnalyzer\\ArrayDimFetchRenamer' => __DIR__ . '/..' . '/rector/rector-nette/src/NodeAnalyzer/ArrayDimFetchRenamer.php',
'Rector\\Nette\\NodeAnalyzer\\AssignAnalyzer' => __DIR__ . '/..' . '/rector/rector-nette/src/NodeAnalyzer/AssignAnalyzer.php',
'Rector\\Nette\\NodeAnalyzer\\BinaryOpAnalyzer' => __DIR__ . '/..' . '/rector/rector-nette/src/NodeAnalyzer/BinaryOpAnalyzer.php',
'Rector\\Nette\\NodeAnalyzer\\ConditionalTemplateAssignReplacer' => __DIR__ . '/..' . '/rector/rector-nette/src/NodeAnalyzer/ConditionalTemplateAssignReplacer.php',
'Rector\\Nette\\NodeAnalyzer\\ControlDimFetchAnalyzer' => __DIR__ . '/..' . '/rector/rector-nette/src/NodeAnalyzer/ControlDimFetchAnalyzer.php',
'Rector\\Nette\\NodeAnalyzer\\MethodCallArgMerger' => __DIR__ . '/..' . '/rector/rector-nette/src/NodeAnalyzer/MethodCallArgMerger.php',
'Rector\\Nette\\NodeAnalyzer\\MethodCallManipulator' => __DIR__ . '/..' . '/rector/rector-nette/src/NodeAnalyzer/MethodCallManipulator.php',
'Rector\\Nette\\NodeAnalyzer\\NetteClassAnalyzer' => __DIR__ . '/..' . '/rector/rector-nette/src/NodeAnalyzer/NetteClassAnalyzer.php',
'Rector\\Nette\\NodeAnalyzer\\NetteInjectPropertyAnalyzer' => __DIR__ . '/..' . '/rector/rector-nette/src/NodeAnalyzer/NetteInjectPropertyAnalyzer.php',
'Rector\\Nette\\NodeAnalyzer\\PregMatchAllAnalyzer' => __DIR__ . '/..' . '/rector/rector-nette/src/NodeAnalyzer/PregMatchAllAnalyzer.php',
@ -2456,8 +2436,6 @@ class ComposerStaticInit222c68caf75058fc89c482e6539adcba
'Rector\\Nette\\NodeFinder\\FormOnSuccessCallbackValuesParamFinder' => __DIR__ . '/..' . '/rector/rector-nette/src/NodeFinder/FormOnSuccessCallbackValuesParamFinder.php',
'Rector\\Nette\\NodeFinder\\FormVariableFinder' => __DIR__ . '/..' . '/rector/rector-nette/src/NodeFinder/FormVariableFinder.php',
'Rector\\Nette\\NodeFinder\\ParamFinder' => __DIR__ . '/..' . '/rector/rector-nette/src/NodeFinder/ParamFinder.php',
'Rector\\Nette\\NodeResolver\\MethodNamesByInputNamesResolver' => __DIR__ . '/..' . '/rector/rector-nette/src/NodeResolver/MethodNamesByInputNamesResolver.php',
'Rector\\Nette\\Rector\\ArrayDimFetch\\AnnotateMagicalControlArrayAccessRector' => __DIR__ . '/..' . '/rector/rector-nette/src/Rector/ArrayDimFetch/AnnotateMagicalControlArrayAccessRector.php',
'Rector\\Nette\\Rector\\Assign\\ArrayAccessGetControlToGetComponentMethodCallRector' => __DIR__ . '/..' . '/rector/rector-nette/src/Rector/Assign/ArrayAccessGetControlToGetComponentMethodCallRector.php',
'Rector\\Nette\\Rector\\Assign\\ArrayAccessSetControlToAddComponentMethodCallRector' => __DIR__ . '/..' . '/rector/rector-nette/src/Rector/Assign/ArrayAccessSetControlToAddComponentMethodCallRector.php',
'Rector\\Nette\\Rector\\Assign\\MakeGetComponentAssignAnnotatedRector' => __DIR__ . '/..' . '/rector/rector-nette/src/Rector/Assign/MakeGetComponentAssignAnnotatedRector.php',
@ -3139,6 +3117,7 @@ class ComposerStaticInit222c68caf75058fc89c482e6539adcba
'Rector\\Symfony\\Rector\\Class_\\MakeCommandLazyRector' => __DIR__ . '/..' . '/rector/rector-symfony/src/Rector/Class_/MakeCommandLazyRector.php',
'Rector\\Symfony\\Rector\\ConstFetch\\ConstraintUrlOptionRector' => __DIR__ . '/..' . '/rector/rector-symfony/src/Rector/ConstFetch/ConstraintUrlOptionRector.php',
'Rector\\Symfony\\Rector\\FuncCall\\ReplaceServiceArgumentRector' => __DIR__ . '/..' . '/rector/rector-symfony/src/Rector/FuncCall/ReplaceServiceArgumentRector.php',
'Rector\\Symfony\\Rector\\MethodCall\\AddViolationToBuildViolationRector' => __DIR__ . '/..' . '/rector/rector-symfony/src/Rector/MethodCall/AddViolationToBuildViolationRector.php',
'Rector\\Symfony\\Rector\\MethodCall\\AuthorizationCheckerIsGrantedExtractorRector' => __DIR__ . '/..' . '/rector/rector-symfony/src/Rector/MethodCall/AuthorizationCheckerIsGrantedExtractorRector.php',
'Rector\\Symfony\\Rector\\MethodCall\\CascadeValidationFormBuilderRector' => __DIR__ . '/..' . '/rector/rector-symfony/src/Rector/MethodCall/CascadeValidationFormBuilderRector.php',
'Rector\\Symfony\\Rector\\MethodCall\\ChangeCollectionTypeOptionNameFromTypeToEntryTypeRector' => __DIR__ . '/..' . '/rector/rector-symfony/src/Rector/MethodCall/ChangeCollectionTypeOptionNameFromTypeToEntryTypeRector.php',
@ -3159,6 +3138,7 @@ class ComposerStaticInit222c68caf75058fc89c482e6539adcba
'Rector\\Symfony\\Rector\\MethodCall\\ReadOnlyOptionToAttributeRector' => __DIR__ . '/..' . '/rector/rector-symfony/src/Rector/MethodCall/ReadOnlyOptionToAttributeRector.php',
'Rector\\Symfony\\Rector\\MethodCall\\RedirectToRouteRector' => __DIR__ . '/..' . '/rector/rector-symfony/src/Rector/MethodCall/RedirectToRouteRector.php',
'Rector\\Symfony\\Rector\\MethodCall\\ReflectionExtractorEnableMagicCallExtractorRector' => __DIR__ . '/..' . '/rector/rector-symfony/src/Rector/MethodCall/ReflectionExtractorEnableMagicCallExtractorRector.php',
'Rector\\Symfony\\Rector\\MethodCall\\ServiceSetStringNameToClassNameRector' => __DIR__ . '/..' . '/rector/rector-symfony/src/Rector/MethodCall/ServiceSetStringNameToClassNameRector.php',
'Rector\\Symfony\\Rector\\MethodCall\\StringFormTypeToClassRector' => __DIR__ . '/..' . '/rector/rector-symfony/src/Rector/MethodCall/StringFormTypeToClassRector.php',
'Rector\\Symfony\\Rector\\MethodCall\\SwiftCreateMessageToNewEmailRector' => __DIR__ . '/..' . '/rector/rector-symfony/src/Rector/MethodCall/SwiftCreateMessageToNewEmailRector.php',
'Rector\\Symfony\\Rector\\MethodCall\\SwiftSetBodyToHtmlPlainMethodCallRector' => __DIR__ . '/..' . '/rector/rector-symfony/src/Rector/MethodCall/SwiftSetBodyToHtmlPlainMethodCallRector.php',
@ -3409,9 +3389,9 @@ class ComposerStaticInit222c68caf75058fc89c482e6539adcba
public static function getInitializer(ClassLoader $loader)
{
return \Closure::bind(function () use ($loader) {
$loader->prefixLengthsPsr4 = ComposerStaticInit222c68caf75058fc89c482e6539adcba::$prefixLengthsPsr4;
$loader->prefixDirsPsr4 = ComposerStaticInit222c68caf75058fc89c482e6539adcba::$prefixDirsPsr4;
$loader->classMap = ComposerStaticInit222c68caf75058fc89c482e6539adcba::$classMap;
$loader->prefixLengthsPsr4 = ComposerStaticInit15b3e3f37c257ff0b0f8af72563cf505::$prefixLengthsPsr4;
$loader->prefixDirsPsr4 = ComposerStaticInit15b3e3f37c257ff0b0f8af72563cf505::$prefixDirsPsr4;
$loader->classMap = ComposerStaticInit15b3e3f37c257ff0b0f8af72563cf505::$classMap;
}, null, ClassLoader::class);
}

View File

@ -1923,12 +1923,12 @@
"source": {
"type": "git",
"url": "https:\/\/github.com\/rectorphp\/rector-doctrine.git",
"reference": "e6b2be7c1b67969fed3439672aba7db3df651f17"
"reference": "ea5a50c055449227910a9f8df5e7e8290ddd4f7c"
},
"dist": {
"type": "zip",
"url": "https:\/\/api.github.com\/repos\/rectorphp\/rector-doctrine\/zipball\/e6b2be7c1b67969fed3439672aba7db3df651f17",
"reference": "e6b2be7c1b67969fed3439672aba7db3df651f17",
"url": "https:\/\/api.github.com\/repos\/rectorphp\/rector-doctrine\/zipball\/ea5a50c055449227910a9f8df5e7e8290ddd4f7c",
"reference": "ea5a50c055449227910a9f8df5e7e8290ddd4f7c",
"shasum": ""
},
"require": {
@ -1953,7 +1953,7 @@
"symplify\/rule-doc-generator": "^11.0",
"symplify\/vendor-patches": "^11.0"
},
"time": "2022-07-24T11:45:12+00:00",
"time": "2022-08-06T20:05:23+00:00",
"default-branch": true,
"type": "rector-extension",
"extra": {
@ -2202,12 +2202,12 @@
"source": {
"type": "git",
"url": "https:\/\/github.com\/rectorphp\/rector-nette.git",
"reference": "e5b26937365bd6f3576c1a622e1158c79ec49d14"
"reference": "51adb00a964775304fabcb2d701f5b6461cc4027"
},
"dist": {
"type": "zip",
"url": "https:\/\/api.github.com\/repos\/rectorphp\/rector-nette\/zipball\/e5b26937365bd6f3576c1a622e1158c79ec49d14",
"reference": "e5b26937365bd6f3576c1a622e1158c79ec49d14",
"url": "https:\/\/api.github.com\/repos\/rectorphp\/rector-nette\/zipball\/51adb00a964775304fabcb2d701f5b6461cc4027",
"reference": "51adb00a964775304fabcb2d701f5b6461cc4027",
"shasum": ""
},
"require": {
@ -2232,6 +2232,7 @@
"phpunit\/phpunit": "^9.5",
"rector\/phpstan-rules": "^0.5",
"rector\/rector-src": "dev-main",
"symplify\/easy-ci": "^11.0",
"symplify\/easy-coding-standard": "^11.0",
"symplify\/monorepo-builder": "^11.0",
"symplify\/phpstan-extensions": "^11.0",
@ -2239,7 +2240,7 @@
"symplify\/rule-doc-generator": "^11.0",
"symplify\/vendor-patches": "^11.0"
},
"time": "2022-07-19T22:25:42+00:00",
"time": "2022-08-06T21:32:25+00:00",
"default-branch": true,
"type": "rector-extension",
"extra": {
@ -2415,33 +2416,33 @@
"source": {
"type": "git",
"url": "https:\/\/github.com\/rectorphp\/rector-symfony.git",
"reference": "2bf8fc5da3e052752895d79d99344406d134cb32"
"reference": "8e8149656ac7c675c9b156cf965abb9925cfdbfa"
},
"dist": {
"type": "zip",
"url": "https:\/\/api.github.com\/repos\/rectorphp\/rector-symfony\/zipball\/2bf8fc5da3e052752895d79d99344406d134cb32",
"reference": "2bf8fc5da3e052752895d79d99344406d134cb32",
"url": "https:\/\/api.github.com\/repos\/rectorphp\/rector-symfony\/zipball\/8e8149656ac7c675c9b156cf965abb9925cfdbfa",
"reference": "8e8149656ac7c675c9b156cf965abb9925cfdbfa",
"shasum": ""
},
"require": {
"ext-xml": "*",
"php": ">=8.1",
"symfony\/string": "^6.0"
"symfony\/string": "^6.1"
},
"conflict": {
"rector\/rector": "<0.13"
},
"require-dev": {
"phpstan\/extension-installer": "^1.1",
"phpstan\/phpstan": "^1.7.10",
"phpstan\/phpstan-strict-rules": "^1.2",
"phpstan\/phpstan-webmozart-assert": "^1.1",
"phpstan\/phpstan": "^1.8.2",
"phpstan\/phpstan-strict-rules": "^1.3",
"phpstan\/phpstan-webmozart-assert": "^1.2",
"phpunit\/phpunit": "^9.5",
"rector\/phpstan-rules": "^0.5",
"rector\/phpstan-rules": "^0.5.8",
"rector\/rector-src": "dev-main",
"symfony\/routing": "^6.0",
"symfony\/security-core": "^6.0",
"symfony\/security-http": "^6.0",
"symfony\/routing": "^6.1",
"symfony\/security-core": "^6.1",
"symfony\/security-http": "^6.1",
"symplify\/easy-ci": "^11.0",
"symplify\/easy-coding-standard": "^11.0",
"symplify\/phpstan-extensions": "^11.0",
@ -2449,7 +2450,7 @@
"symplify\/rule-doc-generator": "^11.0",
"symplify\/vendor-patches": "^11.0"
},
"time": "2022-07-25T09:57:49+00:00",
"time": "2022-08-06T19:26:16+00:00",
"default-branch": true,
"type": "rector-extension",
"extra": {

File diff suppressed because one or more lines are too long

View File

@ -9,7 +9,7 @@ namespace Rector\RectorInstaller;
*/
final class GeneratedConfig
{
public const EXTENSIONS = array('rector/rector-cakephp' => array('install_path' => '/home/runner/work/rector-src/rector-src/vendor/rector/rector-cakephp', 'relative_install_path' => '../../rector-cakephp', 'extra' => array('includes' => array(0 => 'config/config.php')), 'version' => 'dev-main ec96616'), 'rector/rector-doctrine' => array('install_path' => '/home/runner/work/rector-src/rector-src/vendor/rector/rector-doctrine', 'relative_install_path' => '../../rector-doctrine', 'extra' => array('includes' => array(0 => 'config/config.php')), 'version' => 'dev-main e6b2be7'), 'rector/rector-downgrade-php' => array('install_path' => '/home/runner/work/rector-src/rector-src/vendor/rector/rector-downgrade-php', 'relative_install_path' => '../../rector-downgrade-php', 'extra' => array('includes' => array(0 => 'config/config.php')), 'version' => 'dev-main 7ee4e58'), 'rector/rector-generator' => array('install_path' => '/home/runner/work/rector-src/rector-src/vendor/rector/rector-generator', 'relative_install_path' => '../../rector-generator', 'extra' => array('includes' => array(0 => 'config/config.php')), 'version' => 'dev-main 0e86e69'), 'rector/rector-laravel' => array('install_path' => '/home/runner/work/rector-src/rector-src/vendor/rector/rector-laravel', 'relative_install_path' => '../../rector-laravel', 'extra' => array('includes' => array(0 => 'config/config.php')), 'version' => 'dev-main 987bdb4'), 'rector/rector-nette' => array('install_path' => '/home/runner/work/rector-src/rector-src/vendor/rector/rector-nette', 'relative_install_path' => '../../rector-nette', 'extra' => array('includes' => array(0 => 'config/config.php')), 'version' => 'dev-main e5b2693'), 'rector/rector-phpoffice' => array('install_path' => '/home/runner/work/rector-src/rector-src/vendor/rector/rector-phpoffice', 'relative_install_path' => '../../rector-phpoffice', 'extra' => array('includes' => array(0 => 'config/config.php')), 'version' => 'dev-main ad7cfce'), 'rector/rector-phpunit' => array('install_path' => '/home/runner/work/rector-src/rector-src/vendor/rector/rector-phpunit', 'relative_install_path' => '../../rector-phpunit', 'extra' => array('includes' => array(0 => 'config/config.php')), 'version' => 'dev-main d876ff2'), 'rector/rector-symfony' => array('install_path' => '/home/runner/work/rector-src/rector-src/vendor/rector/rector-symfony', 'relative_install_path' => '../../rector-symfony', 'extra' => array('includes' => array(0 => 'config/config.php')), 'version' => 'dev-main 2bf8fc5'));
public const EXTENSIONS = array('rector/rector-cakephp' => array('install_path' => '/home/runner/work/rector-src/rector-src/vendor/rector/rector-cakephp', 'relative_install_path' => '../../rector-cakephp', 'extra' => array('includes' => array(0 => 'config/config.php')), 'version' => 'dev-main ec96616'), 'rector/rector-doctrine' => array('install_path' => '/home/runner/work/rector-src/rector-src/vendor/rector/rector-doctrine', 'relative_install_path' => '../../rector-doctrine', 'extra' => array('includes' => array(0 => 'config/config.php')), 'version' => 'dev-main ea5a50c'), 'rector/rector-downgrade-php' => array('install_path' => '/home/runner/work/rector-src/rector-src/vendor/rector/rector-downgrade-php', 'relative_install_path' => '../../rector-downgrade-php', 'extra' => array('includes' => array(0 => 'config/config.php')), 'version' => 'dev-main 7ee4e58'), 'rector/rector-generator' => array('install_path' => '/home/runner/work/rector-src/rector-src/vendor/rector/rector-generator', 'relative_install_path' => '../../rector-generator', 'extra' => array('includes' => array(0 => 'config/config.php')), 'version' => 'dev-main 0e86e69'), 'rector/rector-laravel' => array('install_path' => '/home/runner/work/rector-src/rector-src/vendor/rector/rector-laravel', 'relative_install_path' => '../../rector-laravel', 'extra' => array('includes' => array(0 => 'config/config.php')), 'version' => 'dev-main 987bdb4'), 'rector/rector-nette' => array('install_path' => '/home/runner/work/rector-src/rector-src/vendor/rector/rector-nette', 'relative_install_path' => '../../rector-nette', 'extra' => array('includes' => array(0 => 'config/config.php')), 'version' => 'dev-main 51adb00'), 'rector/rector-phpoffice' => array('install_path' => '/home/runner/work/rector-src/rector-src/vendor/rector/rector-phpoffice', 'relative_install_path' => '../../rector-phpoffice', 'extra' => array('includes' => array(0 => 'config/config.php')), 'version' => 'dev-main ad7cfce'), 'rector/rector-phpunit' => array('install_path' => '/home/runner/work/rector-src/rector-src/vendor/rector/rector-phpunit', 'relative_install_path' => '../../rector-phpunit', 'extra' => array('includes' => array(0 => 'config/config.php')), 'version' => 'dev-main d876ff2'), 'rector/rector-symfony' => array('install_path' => '/home/runner/work/rector-src/rector-src/vendor/rector/rector-symfony', 'relative_install_path' => '../../rector-symfony', 'extra' => array('includes' => array(0 => 'config/config.php')), 'version' => 'dev-main 8e81496'));
private function __construct()
{
}

View File

@ -10,6 +10,9 @@ use PhpParser\Node\Stmt\ClassLike;
use PhpParser\Node\Stmt\ClassMethod;
use PhpParser\Node\Stmt\Property;
use Rector\NodeNameResolver\NodeNameResolver;
/**
* @api
*/
final class AttributeCleaner
{
/**

View File

@ -12,6 +12,9 @@ use PhpParser\Node\Stmt\ClassLike;
use PhpParser\Node\Stmt\ClassMethod;
use PhpParser\Node\Stmt\Property;
use Rector\NodeNameResolver\NodeNameResolver;
/**
* @api
*/
final class AttributeFinder
{
/**

View File

@ -11,6 +11,9 @@ use PhpParser\Node\Stmt\Property;
use Rector\BetterPhpDocParser\PhpDoc\DoctrineAnnotationTagValueNode;
use Rector\BetterPhpDocParser\PhpDocInfo\PhpDocInfo;
use Rector\BetterPhpDocParser\PhpDocInfo\PhpDocInfoFactory;
/**
* @api
*/
final class AttrinationFinder
{
/**

View File

@ -5,6 +5,7 @@ namespace Rector\Doctrine\NodeAnalyzer;
use PhpParser\Node;
use PhpParser\Node\Expr\MethodCall;
use PhpParser\Node\Stmt\Class_;
use PHPStan\Type\ObjectType;
use Rector\NodeNameResolver\NodeNameResolver;
use Rector\NodeTypeResolver\NodeTypeResolver;
@ -35,10 +36,10 @@ final class MethodCallNameOnTypeResolver
/**
* @return string[]
*/
public function resolve(Node $node, ObjectType $objectType) : array
public function resolve(Class_ $class, ObjectType $objectType) : array
{
$methodNames = [];
$this->simpleCallableNodeTraverser->traverseNodesWithCallable($node, function (Node $node) use(&$methodNames, $objectType) {
$this->simpleCallableNodeTraverser->traverseNodesWithCallable($class, function (Node $node) use(&$methodNames, $objectType) {
if (!$node instanceof MethodCall) {
return null;
}

View File

@ -3,7 +3,7 @@
declare (strict_types=1);
namespace Rector\Doctrine\PhpDocParser;
use PhpParser\Node;
use PhpParser\Node\Stmt\Property;
use Rector\BetterPhpDocParser\PhpDocParser\ClassAnnotationMatcher;
class DoctrineClassAnnotationMatcher
{
@ -16,16 +16,16 @@ class DoctrineClassAnnotationMatcher
{
$this->classAnnotationMatcher = $classAnnotationMatcher;
}
public function resolveExpectingDoctrineFQCN(string $value, Node $node) : ?string
public function resolveExpectingDoctrineFQCN(string $value, Property $property) : ?string
{
$fullyQualified = $this->classAnnotationMatcher->resolveTagToKnownFullyQualifiedName($value, $node);
$fullyQualified = $this->classAnnotationMatcher->resolveTagToKnownFullyQualifiedName($value, $property);
if ($fullyQualified === null) {
// Doctrine FQCNs are strange: In their examples
// they omit the leading slash. This leads to
// ClassAnnotationMatcher searching in the wrong
// namespace. Therefor we try to add the leading
// slash manually here.
$fullyQualified = $this->classAnnotationMatcher->resolveTagToKnownFullyQualifiedName('\\' . $value, $node);
$fullyQualified = $this->classAnnotationMatcher->resolveTagToKnownFullyQualifiedName('\\' . $value, $property);
}
return $fullyQualified;
}

View File

@ -3,8 +3,8 @@
declare (strict_types=1);
namespace Rector\Doctrine\PhpDocParser;
use PhpParser\Node;
use PhpParser\Node\Stmt\Class_;
use PhpParser\Node\Stmt\ClassMethod;
use Rector\BetterPhpDocParser\PhpDocInfo\PhpDocInfoFactory;
use Rector\Core\PhpParser\Node\BetterNodeFinder;
final class DoctrineDocBlockResolver
@ -24,9 +24,9 @@ final class DoctrineDocBlockResolver
$this->phpDocInfoFactory = $phpDocInfoFactory;
$this->betterNodeFinder = $betterNodeFinder;
}
public function isInDoctrineEntityClass(Node $node) : bool
public function isInDoctrineEntityClass(ClassMethod $classMethod) : bool
{
$class = $this->betterNodeFinder->findParentType($node, Class_::class);
$class = $this->betterNodeFinder->findParentType($classMethod, Class_::class);
if (!$class instanceof Class_) {
return \false;
}

View File

@ -22,6 +22,10 @@ use Symplify\RuleDocGenerator\ValueObject\RuleDefinition;
*/
final class MoveCurrentDateTimeDefaultInEntityToConstructorRector extends AbstractRector
{
/**
* @var bool
*/
private $hasChanged = \false;
/**
* @readonly
* @var \Rector\Doctrine\NodeManipulator\ConstructorManipulator
@ -96,27 +100,32 @@ CODE_SAMPLE
*/
public function refactor(Node $node) : ?Node
{
$this->hasChanged = \false;
foreach ($node->getProperties() as $property) {
$this->refactorProperty($property, $node);
}
if (!$this->hasChanged) {
return null;
}
return $node;
}
private function refactorProperty(Property $property, Class_ $class) : ?Property
private function refactorProperty(Property $property, Class_ $class) : void
{
$phpDocInfo = $this->phpDocInfoFactory->createFromNodeOrEmpty($property);
$doctrineAnnotationTagValueNode = $phpDocInfo->getByAnnotationClass('Doctrine\\ORM\\Mapping\\Column');
if (!$doctrineAnnotationTagValueNode instanceof DoctrineAnnotationTagValueNode) {
return null;
return;
}
$type = $doctrineAnnotationTagValueNode->getValueWithoutQuotes('type');
if ($type !== 'datetime') {
return null;
return;
}
$node = $this->constructorAssignPropertyAnalyzer->resolveConstructorAssign($property);
// 0. already has default
if ($node !== null) {
return null;
return;
}
$this->hasChanged = \true;
// 1. remove default options from database level
$options = $doctrineAnnotationTagValueNode->getValue('options');
if ($options instanceof CurlyListNode) {
@ -131,7 +140,6 @@ CODE_SAMPLE
// 3. remove default from property
$onlyProperty = $property->props[0];
$onlyProperty->default = null;
return $property;
}
private function refactorClass(Class_ $class, Property $property) : void
{

View File

@ -27,7 +27,8 @@
"rector\/phpstan-rules": "^0.5",
"phpstan\/phpstan-webmozart-assert": "^1.2",
"phpstan\/phpstan-strict-rules": "^1.3",
"symplify\/vendor-patches": "^11.0"
"symplify\/vendor-patches": "^11.0",
"symplify\/easy-ci": "^11.0"
},
"autoload": {
"psr-4": {

View File

@ -4,7 +4,6 @@ declare (strict_types=1);
namespace RectorPrefix202208;
use Rector\Config\RectorConfig;
use Rector\Nette\Rector\ArrayDimFetch\AnnotateMagicalControlArrayAccessRector;
use Rector\Nette\Rector\Assign\ArrayAccessGetControlToGetComponentMethodCallRector;
use Rector\Nette\Rector\Assign\ArrayAccessSetControlToAddComponentMethodCallRector;
use Rector\Nette\Rector\Assign\MakeGetComponentAssignAnnotatedRector;
@ -13,7 +12,6 @@ use Rector\Nette\Rector\Identical\SubstrMinusToStringEndsWithRector;
return static function (RectorConfig $rectorConfig) : void {
$rectorConfig->rule(TemplateMagicAssignToExplicitVariableArrayRector::class);
$rectorConfig->rule(MakeGetComponentAssignAnnotatedRector::class);
$rectorConfig->rule(AnnotateMagicalControlArrayAccessRector::class);
$rectorConfig->rule(ArrayAccessSetControlToAddComponentMethodCallRector::class);
$rectorConfig->rule(ArrayAccessGetControlToGetComponentMethodCallRector::class);
$rectorConfig->rule(SubstrMinusToStringEndsWithRector::class);

View File

@ -1,4 +1,4 @@
# 38 Rules Overview
# 37 Rules Overview
## AddNextrasDatePickerToDateControlRector
@ -22,36 +22,6 @@ Nextras/Form upgrade of addDatePicker method call to DateControl assign
<br>
## AnnotateMagicalControlArrayAccessRector
Change magic `$this["some_component"]` to variable assign with `@var` annotation
- class: [`Rector\Nette\Rector\ArrayDimFetch\AnnotateMagicalControlArrayAccessRector`](../src/Rector/ArrayDimFetch/AnnotateMagicalControlArrayAccessRector.php)
```diff
use Nette\Application\UI\Presenter;
use Nette\Application\UI\Form;
final class SomePresenter extends Presenter
{
public function run()
{
- if ($this['some_form']->isSubmitted()) {
+ /** @var \Nette\Application\UI\Form $someForm */
+ $someForm = $this['some_form'];
+ if ($someForm->isSubmitted()) {
}
}
protected function createComponentSomeForm()
{
return new Form();
}
}
```
<br>
## ArrayAccessGetControlToGetComponentMethodCallRector
Change magic arrays access get, to explicit `$this->getComponent(...)` method
@ -251,7 +221,10 @@ use Rector\Config\RectorConfig;
use Rector\Nette\Rector\Class_\FormDataRector;
return static function (RectorConfig $rectorConfig): void {
$rectorConfig->ruleWithConfiguration(FormDataRector::class, [Rector\Nette\Rector\Class_\FormDataRector::FORM_DATA_CLASS_PARENT: '', Rector\Nette\Rector\Class_\FormDataRector::FORM_DATA_CLASS_TRAITS: []]);
$rectorConfig->ruleWithConfiguration(FormDataRector::class, [
FormDataRector::FORM_DATA_CLASS_PARENT => '',
FormDataRector::FORM_DATA_CLASS_TRAITS => [],
]);
};
```
@ -855,7 +828,10 @@ use Rector\Config\RectorConfig;
use Rector\Nette\Rector\Class_\TemplateTypeBasedOnPresenterTemplateParametersRector;
return static function (RectorConfig $rectorConfig): void {
$rectorConfig->ruleWithConfiguration(TemplateTypeBasedOnPresenterTemplateParametersRector::class, [Rector\Nette\Rector\Class_\TemplateTypeBasedOnPresenterTemplateParametersRector::TEMPLATE_CLASS_PARENT: '', Rector\Nette\Rector\Class_\TemplateTypeBasedOnPresenterTemplateParametersRector::TEMPLATE_CLASS_TRAITS: []]);
$rectorConfig->ruleWithConfiguration(TemplateTypeBasedOnPresenterTemplateParametersRector::class, [
TemplateTypeBasedOnPresenterTemplateParametersRector::TEMPLATE_CLASS_PARENT => '',
TemplateTypeBasedOnPresenterTemplateParametersRector::TEMPLATE_CLASS_TRAITS => [],
]);
};
```

View File

@ -1,13 +0,0 @@
<?php
declare (strict_types=1);
namespace Rector\Nette\Contract;
use PhpParser\Node;
interface FormControlTypeResolverInterface
{
/**
* @return array<string, string>
*/
public function resolve(Node $node) : array;
}

View File

@ -1,31 +0,0 @@
<?php
declare (strict_types=1);
namespace Rector\Nette\Enum;
final class NetteFormMethodNameToControlType
{
/**
* @var array<string, string>
*/
public const METHOD_NAME_TO_CONTROL_TYPE = [
'addText' => 'Nette\\Forms\\Controls\\TextInput',
'addPassword' => 'Nette\\Forms\\Controls\\TextInput',
'addEmail' => 'Nette\\Forms\\Controls\\TextInput',
'addInteger' => 'Nette\\Forms\\Controls\\TextInput',
'addUpload' => 'Nette\\Forms\\Controls\\UploadControl',
'addMultiUpload' => 'Nette\\Forms\\Controls\\UploadControl',
'addTextArea' => 'Nette\\Forms\\Controls\\TextArea',
'addHidden' => 'Nette\\Forms\\Controls\\HiddenField',
'addCheckbox' => 'Nette\\Forms\\Controls\\Checkbox',
'addRadioList' => 'Nette\\Forms\\Controls\\RadioList',
'addCheckboxList' => 'Nette\\Forms\\Controls\\CheckboxList',
'addSelect' => 'Nette\\Forms\\Controls\\SelectBox',
'addMultiSelect' => 'Nette\\Forms\\Controls\\MultiSelectBox',
'addSubmit' => 'Nette\\Forms\\Controls\\SubmitButton',
'addButton' => 'Nette\\Forms\\Controls\\Button',
'addImage' => 'Nette\\Forms\\Controls\\ImageButton',
// custom
'addJSelect' => 'DependentSelectBox\\JsonDependentSelectBox',
];
}

View File

@ -1,82 +0,0 @@
<?php
declare (strict_types=1);
namespace Rector\Nette\FormControlTypeResolver;
use PhpParser\Node;
use PhpParser\Node\Expr\ArrayDimFetch;
use PhpParser\Node\Stmt\ClassMethod;
use PHPStan\Type\TypeWithClassName;
use Rector\Core\PhpParser\AstResolver;
use Rector\Nette\Contract\FormControlTypeResolverInterface;
use Rector\Nette\Naming\NetteControlNaming;
use Rector\Nette\NodeAnalyzer\ControlDimFetchAnalyzer;
use Rector\NodeTypeResolver\NodeTypeResolver;
use Rector\TypeDeclaration\TypeInferer\ReturnTypeInferer;
final class ArrayDimFetchControlTypeResolver implements FormControlTypeResolverInterface
{
/**
* @readonly
* @var \Rector\Nette\NodeAnalyzer\ControlDimFetchAnalyzer
*/
private $controlDimFetchAnalyzer;
/**
* @readonly
* @var \Rector\Nette\Naming\NetteControlNaming
*/
private $netteControlNaming;
/**
* @readonly
* @var \Rector\NodeTypeResolver\NodeTypeResolver
*/
private $nodeTypeResolver;
/**
* @readonly
* @var \Rector\TypeDeclaration\TypeInferer\ReturnTypeInferer
*/
private $returnTypeInferer;
/**
* @readonly
* @var \Rector\Core\PhpParser\AstResolver
*/
private $astResolver;
public function __construct(ControlDimFetchAnalyzer $controlDimFetchAnalyzer, NetteControlNaming $netteControlNaming, NodeTypeResolver $nodeTypeResolver, ReturnTypeInferer $returnTypeInferer, AstResolver $astResolver)
{
$this->controlDimFetchAnalyzer = $controlDimFetchAnalyzer;
$this->netteControlNaming = $netteControlNaming;
$this->nodeTypeResolver = $nodeTypeResolver;
$this->returnTypeInferer = $returnTypeInferer;
$this->astResolver = $astResolver;
}
/**
* @return array<string, string>
*/
public function resolve(Node $node) : array
{
if (!$node instanceof ArrayDimFetch) {
return [];
}
$controlShortName = $this->controlDimFetchAnalyzer->matchName($node);
if ($controlShortName === null) {
return [];
}
$createComponentClassMethod = $this->matchCreateComponentClassMethod($node, $controlShortName);
if (!$createComponentClassMethod instanceof ClassMethod) {
return [];
}
$createComponentClassMethodReturnType = $this->returnTypeInferer->inferFunctionLike($createComponentClassMethod);
if (!$createComponentClassMethodReturnType instanceof TypeWithClassName) {
return [];
}
return [$controlShortName => $createComponentClassMethodReturnType->getClassName()];
}
private function matchCreateComponentClassMethod(ArrayDimFetch $arrayDimFetch, string $controlShortName) : ?ClassMethod
{
$callerType = $this->nodeTypeResolver->getType($arrayDimFetch->var);
if (!$callerType instanceof TypeWithClassName) {
return null;
}
$methodName = $this->netteControlNaming->createCreateComponentClassMethodName($controlShortName);
return $this->astResolver->resolveClassMethod($callerType->getClassName(), $methodName);
}
}

View File

@ -1,55 +0,0 @@
<?php
declare (strict_types=1);
namespace Rector\Nette\FormControlTypeResolver;
use PhpParser\Node;
use PhpParser\Node\Expr\ArrayDimFetch;
use PhpParser\Node\Expr\Assign;
use PhpParser\Node\Scalar\String_;
use PHPStan\Type\TypeWithClassName;
use Rector\Core\PhpParser\Node\BetterNodeFinder;
use Rector\Nette\Contract\FormControlTypeResolverInterface;
use Rector\NodeTypeResolver\NodeTypeResolver;
final class AssignDimFetchFormTypeResolver implements FormControlTypeResolverInterface
{
/**
* @readonly
* @var \Rector\Core\PhpParser\Node\BetterNodeFinder
*/
private $betterNodeFinder;
/**
* @readonly
* @var \Rector\NodeTypeResolver\NodeTypeResolver
*/
private $nodeTypeResolver;
public function __construct(BetterNodeFinder $betterNodeFinder, NodeTypeResolver $nodeTypeResolver)
{
$this->betterNodeFinder = $betterNodeFinder;
$this->nodeTypeResolver = $nodeTypeResolver;
}
/**
* @return array<string, string>
*/
public function resolve(Node $node) : array
{
if (!$node instanceof ArrayDimFetch) {
return [];
}
// traverse up and find all $this['some_name'] = $type
/** @var Assign|null $formVariableAssign */
$formVariableAssign = $this->betterNodeFinder->findPreviousAssignToExpr($node);
if (!$formVariableAssign instanceof Assign) {
return [];
}
if (!$node->dim instanceof String_) {
return [];
}
$exprType = $this->nodeTypeResolver->getType($formVariableAssign->expr);
if (!$exprType instanceof TypeWithClassName) {
return [];
}
$name = $node->dim->value;
return [$name => $exprType->getClassName()];
}
}

View File

@ -1,49 +0,0 @@
<?php
declare (strict_types=1);
namespace Rector\Nette\FormControlTypeResolver;
use PhpParser\Node;
use PhpParser\Node\Expr\Assign;
use PhpParser\Node\Expr\Variable;
use Rector\Core\PhpParser\Node\BetterNodeFinder;
use Rector\Nette\Contract\FormControlTypeResolverInterface;
use Rector\Nette\NodeResolver\MethodNamesByInputNamesResolver;
use RectorPrefix202208\Symfony\Contracts\Service\Attribute\Required;
final class AssignedVariablesMethodCallsFormTypeResolver implements FormControlTypeResolverInterface
{
/**
* @var \Rector\Nette\NodeResolver\MethodNamesByInputNamesResolver
*/
private $methodNamesByInputNamesResolver;
/**
* @readonly
* @var \Rector\Core\PhpParser\Node\BetterNodeFinder
*/
private $betterNodeFinder;
public function __construct(BetterNodeFinder $betterNodeFinder)
{
$this->betterNodeFinder = $betterNodeFinder;
}
/**
* @required
*/
public function autowire(MethodNamesByInputNamesResolver $methodNamesByInputNamesResolver) : void
{
$this->methodNamesByInputNamesResolver = $methodNamesByInputNamesResolver;
}
/**
* @return array<string, string>
*/
public function resolve(Node $node) : array
{
if (!$node instanceof Variable) {
return [];
}
$formVariableAssign = $this->betterNodeFinder->findPreviousAssignToExpr($node);
if (!$formVariableAssign instanceof Assign) {
return [];
}
return $this->methodNamesByInputNamesResolver->resolveExpr($formVariableAssign->expr);
}
}

View File

@ -1,64 +0,0 @@
<?php
declare (strict_types=1);
namespace Rector\Nette\FormControlTypeResolver;
use PhpParser\Node;
use PhpParser\Node\Expr\Variable;
use PhpParser\Node\Stmt\ClassMethod;
use PhpParser\Node\Stmt\Return_;
use Rector\Core\PhpParser\Node\BetterNodeFinder;
use Rector\Core\ValueObject\MethodName;
use Rector\Nette\Contract\FormControlTypeResolverInterface;
use Rector\Nette\NodeResolver\MethodNamesByInputNamesResolver;
use Rector\NodeNameResolver\NodeNameResolver;
use RectorPrefix202208\Symfony\Contracts\Service\Attribute\Required;
final class ClassMethodFormTypeResolver implements FormControlTypeResolverInterface
{
/**
* @var \Rector\Nette\NodeResolver\MethodNamesByInputNamesResolver
*/
private $methodNamesByInputNamesResolver;
/**
* @readonly
* @var \Rector\Core\PhpParser\Node\BetterNodeFinder
*/
private $betterNodeFinder;
/**
* @readonly
* @var \Rector\NodeNameResolver\NodeNameResolver
*/
private $nodeNameResolver;
public function __construct(BetterNodeFinder $betterNodeFinder, NodeNameResolver $nodeNameResolver)
{
$this->betterNodeFinder = $betterNodeFinder;
$this->nodeNameResolver = $nodeNameResolver;
}
/**
* @required
*/
public function autowire(MethodNamesByInputNamesResolver $methodNamesByInputNamesResolver) : void
{
$this->methodNamesByInputNamesResolver = $methodNamesByInputNamesResolver;
}
/**
* @return array<string, string>
*/
public function resolve(Node $node) : array
{
if (!$node instanceof ClassMethod) {
return [];
}
if ($this->nodeNameResolver->isName($node, MethodName::CONSTRUCT)) {
return [];
}
$lastReturn = $this->betterNodeFinder->findLastInstanceOf((array) $node->stmts, Return_::class);
if (!$lastReturn instanceof Return_) {
return [];
}
if (!$lastReturn->expr instanceof Variable) {
return [];
}
return $this->methodNamesByInputNamesResolver->resolveExpr($lastReturn->expr);
}
}

View File

@ -1,60 +0,0 @@
<?php
declare (strict_types=1);
namespace Rector\Nette\FormControlTypeResolver;
use PhpParser\Node;
use PhpParser\Node\Expr\Variable;
use PhpParser\Node\Stmt\ClassMethod;
use Rector\Core\PhpParser\Node\BetterNodeFinder;
use Rector\Core\ValueObject\MethodName;
use Rector\Nette\Contract\FormControlTypeResolverInterface;
use Rector\Nette\NodeResolver\MethodNamesByInputNamesResolver;
use Rector\NodeNameResolver\NodeNameResolver;
use RectorPrefix202208\Symfony\Contracts\Service\Attribute\Required;
final class ConstructorFormControlTypeResolver implements FormControlTypeResolverInterface
{
/**
* @var \Rector\Nette\NodeResolver\MethodNamesByInputNamesResolver
*/
private $methodNamesByInputNamesResolver;
/**
* @readonly
* @var \Rector\Core\PhpParser\Node\BetterNodeFinder
*/
private $betterNodeFinder;
/**
* @readonly
* @var \Rector\NodeNameResolver\NodeNameResolver
*/
private $nodeNameResolver;
public function __construct(BetterNodeFinder $betterNodeFinder, NodeNameResolver $nodeNameResolver)
{
$this->betterNodeFinder = $betterNodeFinder;
$this->nodeNameResolver = $nodeNameResolver;
}
/**
* @required
*/
public function autowire(MethodNamesByInputNamesResolver $methodNamesByInputNamesResolver) : void
{
$this->methodNamesByInputNamesResolver = $methodNamesByInputNamesResolver;
}
/**
* @return array<string, string>
*/
public function resolve(Node $node) : array
{
if (!$node instanceof ClassMethod) {
return [];
}
if (!$this->nodeNameResolver->isName($node, MethodName::CONSTRUCT)) {
return [];
}
$thisVariable = $this->betterNodeFinder->findVariableOfName($node, 'this');
if (!$thisVariable instanceof Variable) {
return [];
}
return $this->methodNamesByInputNamesResolver->resolveExpr($thisVariable);
}
}

View File

@ -1,101 +0,0 @@
<?php
declare (strict_types=1);
namespace Rector\Nette\FormControlTypeResolver;
use PhpParser\Node;
use PhpParser\Node\Expr\MethodCall;
use PHPStan\Type\TypeWithClassName;
use Rector\Core\Exception\ShouldNotHappenException;
use Rector\Core\PhpParser\AstResolver;
use Rector\Core\PhpParser\Node\Value\ValueResolver;
use Rector\Core\ValueObject\MethodName;
use Rector\Nette\Contract\FormControlTypeResolverInterface;
use Rector\Nette\NodeResolver\MethodNamesByInputNamesResolver;
use Rector\NodeNameResolver\NodeNameResolver;
use Rector\NodeTypeResolver\NodeTypeResolver;
use Rector\StaticTypeMapper\ValueObject\Type\FullyQualifiedObjectType;
use RectorPrefix202208\Symfony\Contracts\Service\Attribute\Required;
final class GetComponentMethodCallFormControlTypeResolver implements FormControlTypeResolverInterface
{
/**
* @var \Rector\Nette\NodeResolver\MethodNamesByInputNamesResolver
*/
private $methodNamesByInputNamesResolver;
/**
* @readonly
* @var \Rector\NodeNameResolver\NodeNameResolver
*/
private $nodeNameResolver;
/**
* @readonly
* @var \Rector\NodeTypeResolver\NodeTypeResolver
*/
private $nodeTypeResolver;
/**
* @readonly
* @var \Rector\Core\PhpParser\Node\Value\ValueResolver
*/
private $valueResolver;
/**
* @readonly
* @var \Rector\Core\PhpParser\AstResolver
*/
private $astResolver;
public function __construct(NodeNameResolver $nodeNameResolver, NodeTypeResolver $nodeTypeResolver, ValueResolver $valueResolver, AstResolver $astResolver)
{
$this->nodeNameResolver = $nodeNameResolver;
$this->nodeTypeResolver = $nodeTypeResolver;
$this->valueResolver = $valueResolver;
$this->astResolver = $astResolver;
}
/**
* @required
*/
public function autowire(MethodNamesByInputNamesResolver $methodNamesByInputNamesResolver) : void
{
$this->methodNamesByInputNamesResolver = $methodNamesByInputNamesResolver;
}
/**
* @return array<string, string>
*/
public function resolve(Node $node) : array
{
if (!$node instanceof MethodCall) {
return [];
}
if (!$this->nodeNameResolver->isName($node->name, 'getComponent')) {
return [];
}
$createComponentClassMethodName = $this->createCreateComponentMethodName($node);
$staticType = $this->nodeTypeResolver->getType($node);
if (!$staticType instanceof FullyQualifiedObjectType) {
return [];
}
// combine constructor + method body name
$constructorClassMethodData = [];
$constructorClassMethod = $this->astResolver->resolveClassMethod($staticType->getClassName(), MethodName::CONSTRUCT);
if ($constructorClassMethod !== null) {
$constructorClassMethodData = $this->methodNamesByInputNamesResolver->resolveExpr($constructorClassMethod);
}
$callerType = $this->nodeTypeResolver->getType($node->var);
if (!$callerType instanceof TypeWithClassName) {
return $constructorClassMethodData;
}
$createComponentClassMethodData = [];
$createComponentClassMethod = $this->astResolver->resolveClassMethod($callerType->getClassName(), $createComponentClassMethodName);
if ($createComponentClassMethod !== null) {
$createComponentClassMethodData = $this->methodNamesByInputNamesResolver->resolveExpr($createComponentClassMethod);
}
return \array_merge($constructorClassMethodData, $createComponentClassMethodData);
}
private function createCreateComponentMethodName(MethodCall $methodCall) : string
{
$firstArgumentValue = $methodCall->args[0]->value;
$componentName = $this->valueResolver->getValue($firstArgumentValue);
if (!\is_string($componentName)) {
throw new ShouldNotHappenException();
}
return 'createComponent' . \ucfirst($componentName);
}
}

View File

@ -1,101 +0,0 @@
<?php
declare (strict_types=1);
namespace Rector\Nette\FormControlTypeResolver;
use PhpParser\Node;
use PhpParser\Node\Expr;
use PhpParser\Node\Expr\MethodCall;
use PhpParser\Node\Stmt\ClassMethod;
use PHPStan\Reflection\ClassReflection;
use PHPStan\Reflection\ReflectionProvider;
use PHPStan\Type\TypeWithClassName;
use Rector\Core\PhpParser\AstResolver;
use Rector\Core\ValueObject\MethodName;
use Rector\Nette\Contract\FormControlTypeResolverInterface;
use Rector\Nette\NodeResolver\MethodNamesByInputNamesResolver;
use Rector\NodeNameResolver\NodeNameResolver;
use Rector\NodeTypeResolver\NodeTypeResolver;
use RectorPrefix202208\Symfony\Contracts\Service\Attribute\Required;
final class MagicNetteFactoryInterfaceFormControlTypeResolver implements FormControlTypeResolverInterface
{
/**
* @var \Rector\Nette\NodeResolver\MethodNamesByInputNamesResolver
*/
private $methodNamesByInputNamesResolver;
/**
* @readonly
* @var \Rector\NodeNameResolver\NodeNameResolver
*/
private $nodeNameResolver;
/**
* @readonly
* @var \Rector\NodeTypeResolver\NodeTypeResolver
*/
private $nodeTypeResolver;
/**
* @readonly
* @var \PHPStan\Reflection\ReflectionProvider
*/
private $reflectionProvider;
/**
* @readonly
* @var \Rector\Core\PhpParser\AstResolver
*/
private $astResolver;
public function __construct(NodeNameResolver $nodeNameResolver, NodeTypeResolver $nodeTypeResolver, ReflectionProvider $reflectionProvider, AstResolver $astResolver)
{
$this->nodeNameResolver = $nodeNameResolver;
$this->nodeTypeResolver = $nodeTypeResolver;
$this->reflectionProvider = $reflectionProvider;
$this->astResolver = $astResolver;
}
/**
* @required
*/
public function autowire(MethodNamesByInputNamesResolver $methodNamesByInputNamesResolver) : void
{
$this->methodNamesByInputNamesResolver = $methodNamesByInputNamesResolver;
}
/**
* @return array<string, string>
*/
public function resolve(Node $node) : array
{
if (!$node instanceof MethodCall) {
return [];
}
// skip constructor, handled elsewhere
if ($this->nodeNameResolver->isName($node->name, MethodName::CONSTRUCT)) {
return [];
}
$methodName = $this->nodeNameResolver->getName($node->name);
if ($methodName === null) {
return [];
}
$classReflection = $this->resolveClassReflectionByExpr($node->var);
if (!$classReflection instanceof ClassReflection) {
return [];
}
$returnedType = $this->nodeTypeResolver->getType($node);
if (!$returnedType instanceof TypeWithClassName) {
return [];
}
$classMethod = $this->astResolver->resolveClassMethod($returnedType->getClassName(), MethodName::CONSTRUCT);
if (!$classMethod instanceof ClassMethod) {
return [];
}
return $this->methodNamesByInputNamesResolver->resolveExpr($classMethod);
}
private function resolveClassReflectionByExpr(Expr $expr) : ?ClassReflection
{
$staticType = $this->nodeTypeResolver->getType($expr);
if (!$staticType instanceof TypeWithClassName) {
return null;
}
if (!$this->reflectionProvider->hasClass($staticType->getClassName())) {
return null;
}
return $this->reflectionProvider->getClass($staticType->getClassName());
}
}

View File

@ -1,61 +0,0 @@
<?php
declare (strict_types=1);
namespace Rector\Nette\FormControlTypeResolver;
use PhpParser\Node;
use PhpParser\Node\Expr\New_;
use PhpParser\Node\Stmt\ClassMethod;
use Rector\Core\PhpParser\AstResolver;
use Rector\Core\ValueObject\MethodName;
use Rector\Nette\Contract\FormControlTypeResolverInterface;
use Rector\Nette\NodeResolver\MethodNamesByInputNamesResolver;
use Rector\NodeNameResolver\NodeNameResolver;
use RectorPrefix202208\Symfony\Contracts\Service\Attribute\Required;
final class NewFormControlTypeResolver implements FormControlTypeResolverInterface
{
/**
* @var \Rector\Nette\NodeResolver\MethodNamesByInputNamesResolver
*/
private $methodNamesByInputNamesResolver;
/**
* @readonly
* @var \Rector\NodeNameResolver\NodeNameResolver
*/
private $nodeNameResolver;
/**
* @readonly
* @var \Rector\Core\PhpParser\AstResolver
*/
private $astResolver;
public function __construct(NodeNameResolver $nodeNameResolver, AstResolver $astResolver)
{
$this->nodeNameResolver = $nodeNameResolver;
$this->astResolver = $astResolver;
}
/**
* @required
*/
public function autowire(MethodNamesByInputNamesResolver $methodNamesByInputNamesResolver) : void
{
$this->methodNamesByInputNamesResolver = $methodNamesByInputNamesResolver;
}
/**
* @return array<string, string>
*/
public function resolve(Node $node) : array
{
if (!$node instanceof New_) {
return [];
}
$className = $this->nodeNameResolver->getName($node->class);
if ($className === null) {
return [];
}
$classMethod = $this->astResolver->resolveClassMethod($className, MethodName::CONSTRUCT);
if (!$classMethod instanceof ClassMethod) {
return [];
}
return $this->methodNamesByInputNamesResolver->resolveExpr($classMethod);
}
}

View File

@ -1,66 +0,0 @@
<?php
declare (strict_types=1);
namespace Rector\Nette\FormControlTypeResolver;
use PhpParser\Node;
use PhpParser\Node\Expr\Variable;
use Rector\Core\Exception\ShouldNotHappenException;
use Rector\Core\PhpParser\Node\Value\ValueResolver;
use Rector\Nette\Contract\FormControlTypeResolverInterface;
use Rector\Nette\Enum\NetteFormMethodNameToControlType;
use Rector\Nette\NodeAnalyzer\MethodCallManipulator;
use Rector\NodeNameResolver\NodeNameResolver;
final class OnVariableMethodCallsFormControlTypeResolver implements FormControlTypeResolverInterface
{
/**
* @readonly
* @var \Rector\Nette\NodeAnalyzer\MethodCallManipulator
*/
private $methodCallManipulator;
/**
* @readonly
* @var \Rector\NodeNameResolver\NodeNameResolver
*/
private $nodeNameResolver;
/**
* @readonly
* @var \Rector\Core\PhpParser\Node\Value\ValueResolver
*/
private $valueResolver;
public function __construct(MethodCallManipulator $methodCallManipulator, NodeNameResolver $nodeNameResolver, ValueResolver $valueResolver)
{
$this->methodCallManipulator = $methodCallManipulator;
$this->nodeNameResolver = $nodeNameResolver;
$this->valueResolver = $valueResolver;
}
/**
* @return array<string, string>
*/
public function resolve(Node $node) : array
{
if (!$node instanceof Variable) {
return [];
}
$onFormMethodCalls = $this->methodCallManipulator->findMethodCallsOnVariable($node);
$methodNamesByInputNames = [];
foreach ($onFormMethodCalls as $onFormMethodCall) {
$methodName = $this->nodeNameResolver->getName($onFormMethodCall->name);
if ($methodName === null) {
continue;
}
if (!isset(NetteFormMethodNameToControlType::METHOD_NAME_TO_CONTROL_TYPE[$methodName])) {
continue;
}
if (!isset($onFormMethodCall->args[0])) {
continue;
}
$addedInputName = $this->valueResolver->getValue($onFormMethodCall->args[0]->value);
if (!\is_string($addedInputName)) {
throw new ShouldNotHappenException();
}
$methodNamesByInputNames[$addedInputName] = $methodName;
}
return $methodNamesByInputNames;
}
}

View File

@ -1,53 +0,0 @@
<?php
declare (strict_types=1);
namespace Rector\Nette\FormControlTypeResolver;
use PhpParser\Node;
use PhpParser\Node\Expr\Assign;
use PhpParser\Node\Expr\Variable;
use PhpParser\Node\Stmt\Return_;
use Rector\Core\PhpParser\Node\BetterNodeFinder;
use Rector\Nette\Contract\FormControlTypeResolverInterface;
use Rector\Nette\NodeResolver\MethodNamesByInputNamesResolver;
use RectorPrefix202208\Symfony\Contracts\Service\Attribute\Required;
final class ReturnFormControlTypeResolver implements FormControlTypeResolverInterface
{
/**
* @var \Rector\Nette\NodeResolver\MethodNamesByInputNamesResolver
*/
private $methodNamesByInputNamesResolver;
/**
* @readonly
* @var \Rector\Core\PhpParser\Node\BetterNodeFinder
*/
private $betterNodeFinder;
public function __construct(BetterNodeFinder $betterNodeFinder)
{
$this->betterNodeFinder = $betterNodeFinder;
}
/**
* @required
*/
public function autowire(MethodNamesByInputNamesResolver $methodNamesByInputNamesResolver) : void
{
$this->methodNamesByInputNamesResolver = $methodNamesByInputNamesResolver;
}
/**
* @return array<string, string>
*/
public function resolve(Node $node) : array
{
if (!$node instanceof Return_) {
return [];
}
if (!$node->expr instanceof Variable) {
return [];
}
$initialAssign = $this->betterNodeFinder->findPreviousAssignToExpr($node->expr);
if (!$initialAssign instanceof Assign) {
return [];
}
return $this->methodNamesByInputNamesResolver->resolveExpr($node);
}
}

View File

@ -1,70 +0,0 @@
<?php
declare (strict_types=1);
namespace Rector\Nette\FormControlTypeResolver;
use PhpParser\Node;
use PhpParser\Node\Expr\Variable;
use PhpParser\Node\Stmt\Class_;
use PhpParser\Node\Stmt\ClassMethod;
use Rector\Core\PhpParser\Node\BetterNodeFinder;
use Rector\Core\ValueObject\MethodName;
use Rector\Nette\Contract\FormControlTypeResolverInterface;
use Rector\Nette\NodeResolver\MethodNamesByInputNamesResolver;
use Rector\NodeNameResolver\NodeNameResolver;
use RectorPrefix202208\Symfony\Contracts\Service\Attribute\Required;
final class ThisVariableInAnotherMethodFormControlTypeResolver implements FormControlTypeResolverInterface
{
/**
* @var \Rector\Nette\NodeResolver\MethodNamesByInputNamesResolver
*/
private $methodNamesByInputNamesResolver;
/**
* @readonly
* @var \Rector\NodeNameResolver\NodeNameResolver
*/
private $nodeNameResolver;
/**
* @readonly
* @var \Rector\Core\PhpParser\Node\BetterNodeFinder
*/
private $betterNodeFinder;
public function __construct(NodeNameResolver $nodeNameResolver, BetterNodeFinder $betterNodeFinder)
{
$this->nodeNameResolver = $nodeNameResolver;
$this->betterNodeFinder = $betterNodeFinder;
}
/**
* @required
*/
public function autowire(MethodNamesByInputNamesResolver $methodNamesByInputNamesResolver) : void
{
$this->methodNamesByInputNamesResolver = $methodNamesByInputNamesResolver;
}
/**
* @return array<string, string>
*/
public function resolve(Node $node) : array
{
if (!$node instanceof Variable) {
return [];
}
$classMethod = $this->betterNodeFinder->findParentType($node, ClassMethod::class);
if (!$classMethod instanceof ClassMethod) {
return [];
}
// handled elsewhere
if ($this->nodeNameResolver->isName($classMethod, MethodName::CONSTRUCT)) {
return [];
}
$class = $this->betterNodeFinder->findParentType($node, Class_::class);
if (!$class instanceof Class_) {
return [];
}
$constructorClassMethod = $class->getMethod(MethodName::CONSTRUCT);
if (!$constructorClassMethod instanceof ClassMethod) {
return [];
}
return $this->methodNamesByInputNamesResolver->resolveExpr($constructorClassMethod);
}
}

View File

@ -1,84 +0,0 @@
<?php
declare (strict_types=1);
namespace Rector\Nette\FormControlTypeResolver;
use PhpParser\Node;
use PhpParser\Node\Expr\Variable;
use PhpParser\Node\Stmt\ClassMethod;
use PHPStan\Reflection\ReflectionProvider;
use PHPStan\Type\TypeWithClassName;
use Rector\Core\PhpParser\AstResolver;
use Rector\Core\ValueObject\MethodName;
use Rector\Nette\Contract\FormControlTypeResolverInterface;
use Rector\Nette\NodeResolver\MethodNamesByInputNamesResolver;
use Rector\NodeNameResolver\NodeNameResolver;
use Rector\NodeTypeResolver\NodeTypeResolver;
use RectorPrefix202208\Symfony\Contracts\Service\Attribute\Required;
final class VariableConstructorFormControlTypeResolver implements FormControlTypeResolverInterface
{
/**
* @var \Rector\Nette\NodeResolver\MethodNamesByInputNamesResolver
*/
private $methodNamesByInputNamesResolver;
/**
* @readonly
* @var \Rector\NodeTypeResolver\NodeTypeResolver
*/
private $nodeTypeResolver;
/**
* @readonly
* @var \Rector\NodeNameResolver\NodeNameResolver
*/
private $nodeNameResolver;
/**
* @readonly
* @var \PHPStan\Reflection\ReflectionProvider
*/
private $reflectionProvider;
/**
* @readonly
* @var \Rector\Core\PhpParser\AstResolver
*/
private $astResolver;
public function __construct(NodeTypeResolver $nodeTypeResolver, NodeNameResolver $nodeNameResolver, ReflectionProvider $reflectionProvider, AstResolver $astResolver)
{
$this->nodeTypeResolver = $nodeTypeResolver;
$this->nodeNameResolver = $nodeNameResolver;
$this->reflectionProvider = $reflectionProvider;
$this->astResolver = $astResolver;
}
/**
* @return array<string, string>
*/
public function resolve(Node $node) : array
{
if (!$node instanceof Variable) {
return [];
}
// handled else-where
if ($this->nodeNameResolver->isName($node, 'this')) {
return [];
}
$formType = $this->nodeTypeResolver->getType($node);
if (!$formType instanceof TypeWithClassName) {
return [];
}
$formClassReflection = $this->reflectionProvider->getClass($formType->getClassName());
if (!$formClassReflection->isSubclassOf('Nette\\Application\\UI\\Form')) {
return [];
}
$classMethod = $this->astResolver->resolveClassMethod($formType->getClassName(), MethodName::CONSTRUCT);
if (!$classMethod instanceof ClassMethod) {
return [];
}
return $this->methodNamesByInputNamesResolver->resolveExpr($classMethod);
}
/**
* @required
*/
public function autowire(MethodNamesByInputNamesResolver $methodNamesByInputNamesResolver) : void
{
$this->methodNamesByInputNamesResolver = $methodNamesByInputNamesResolver;
}
}

View File

@ -1,24 +0,0 @@
<?php
declare (strict_types=1);
namespace Rector\Nette\Naming;
use RectorPrefix202208\Symfony\Component\String\UnicodeString;
final class NetteControlNaming
{
public function createVariableName(string $shortName) : string
{
$variableNameUnicodeString = new UnicodeString($shortName);
$variableName = $variableNameUnicodeString->camel()->toString();
if (\substr_compare($variableName, 'Form', -\strlen('Form')) === 0) {
return $variableName;
}
return $variableName . 'Control';
}
public function createCreateComponentClassMethodName(string $shortName) : string
{
$shortNameUnicodeString = new UnicodeString($shortName);
$componentName = $shortNameUnicodeString->upper()->camel()->toString();
return 'createComponent' . $componentName;
}
}

View File

@ -1,22 +0,0 @@
<?php
declare (strict_types=1);
namespace Rector\Nette\NodeAnalyzer;
use PhpParser\Node\Expr\ArrayDimFetch;
use PhpParser\Node\Expr\Assign;
use Rector\NodeTypeResolver\Node\AttributeKey;
final class ArrayDimFetchAnalyzer
{
public function isBeingAssignedOrInitialized(ArrayDimFetch $arrayDimFetch) : bool
{
$parent = $arrayDimFetch->getAttribute(AttributeKey::PARENT_NODE);
if (!$parent instanceof Assign) {
return \false;
}
if ($parent->var === $arrayDimFetch) {
return \true;
}
return $parent->expr === $arrayDimFetch;
}
}

View File

@ -1,57 +0,0 @@
<?php
declare (strict_types=1);
namespace Rector\Nette\NodeAnalyzer;
use PhpParser\Node;
use PhpParser\Node\Expr\ArrayDimFetch;
use PhpParser\Node\Expr\ArrowFunction;
use PhpParser\Node\Expr\Closure;
use PhpParser\Node\Expr\Variable;
use PhpParser\Node\Stmt\ClassMethod;
use PhpParser\Node\Stmt\Function_;
use PhpParser\NodeTraverser;
use Rector\Core\PhpParser\Comparing\NodeComparator;
use Rector\Naming\VariableRenamer;
use RectorPrefix202208\Symplify\Astral\NodeTraverser\SimpleCallableNodeTraverser;
final class ArrayDimFetchRenamer
{
/**
* @readonly
* @var \Symplify\Astral\NodeTraverser\SimpleCallableNodeTraverser
*/
private $simpleCallableNodeTraverser;
/**
* @readonly
* @var \Rector\Core\PhpParser\Comparing\NodeComparator
*/
private $nodeComparator;
public function __construct(SimpleCallableNodeTraverser $simpleCallableNodeTraverser, NodeComparator $nodeComparator)
{
$this->simpleCallableNodeTraverser = $simpleCallableNodeTraverser;
$this->nodeComparator = $nodeComparator;
}
/**
* @see VariableRenamer::renameVariableInFunctionLike()
*/
public function renameToVariable(ClassMethod $classMethod, ArrayDimFetch $arrayDimFetch, string $variableName) : void
{
$this->simpleCallableNodeTraverser->traverseNodesWithCallable((array) $classMethod->stmts, function (Node $node) use($arrayDimFetch, $variableName) {
// do not rename element above
if ($node->getLine() <= $arrayDimFetch->getLine()) {
return null;
}
if ($this->isScopeNesting($node)) {
return NodeTraverser::DONT_TRAVERSE_CURRENT_AND_CHILDREN;
}
if (!$this->nodeComparator->areNodesEqual($node, $arrayDimFetch)) {
return null;
}
return new Variable($variableName);
});
}
private function isScopeNesting(Node $node) : bool
{
return $node instanceof Closure || $node instanceof Function_ || $node instanceof ArrowFunction;
}
}

View File

@ -1,79 +0,0 @@
<?php
declare (strict_types=1);
namespace Rector\Nette\NodeAnalyzer;
use PhpParser\Node\Expr\ArrayDimFetch;
use PhpParser\Node\Expr\Assign;
use PhpParser\Node\Expr\Variable;
use PhpParser\Node\Stmt\ClassMethod;
use PhpParser\Node\Stmt\Expression;
use PHPStan\Type\ObjectType;
use Rector\BetterPhpDocParser\PhpDocManipulator\VarAnnotationManipulator;
use Rector\Core\PhpParser\Node\BetterNodeFinder;
use Rector\NodeTypeResolver\Node\AttributeKey;
use Rector\PostRector\Collector\NodesToAddCollector;
final class AssignAnalyzer
{
/**
* @var string[]
*/
private $alreadyInitializedAssignsClassMethodObjectHashes = [];
/**
* @readonly
* @var \Rector\PostRector\Collector\NodesToAddCollector
*/
private $nodesToAddCollector;
/**
* @readonly
* @var \Rector\BetterPhpDocParser\PhpDocManipulator\VarAnnotationManipulator
*/
private $varAnnotationManipulator;
/**
* @readonly
* @var \Rector\Core\PhpParser\Node\BetterNodeFinder
*/
private $betterNodeFinder;
public function __construct(NodesToAddCollector $nodesToAddCollector, VarAnnotationManipulator $varAnnotationManipulator, BetterNodeFinder $betterNodeFinder)
{
$this->nodesToAddCollector = $nodesToAddCollector;
$this->varAnnotationManipulator = $varAnnotationManipulator;
$this->betterNodeFinder = $betterNodeFinder;
}
public function addAssignExpressionForFirstCase(string $variableName, ArrayDimFetch $arrayDimFetch, ObjectType $controlObjectType) : void
{
if ($this->shouldSkipForAlreadyAddedInCurrentClassMethod($arrayDimFetch, $variableName)) {
return;
}
$assignExpression = $this->createAnnotatedAssignExpression($variableName, $arrayDimFetch, $controlObjectType);
$this->nodesToAddCollector->addNodeBeforeNode($assignExpression, $arrayDimFetch);
}
private function shouldSkipForAlreadyAddedInCurrentClassMethod(ArrayDimFetch $arrayDimFetch, string $variableName) : bool
{
$classMethod = $this->betterNodeFinder->findParentType($arrayDimFetch, ClassMethod::class);
if (!$classMethod instanceof ClassMethod) {
return \false;
}
$classMethodObjectHash = \spl_object_hash($classMethod) . $variableName;
if (\in_array($classMethodObjectHash, $this->alreadyInitializedAssignsClassMethodObjectHashes, \true)) {
return \true;
}
$this->alreadyInitializedAssignsClassMethodObjectHashes[] = $classMethodObjectHash;
return \false;
}
private function createAnnotatedAssignExpression(string $variableName, ArrayDimFetch $arrayDimFetch, ObjectType $controlObjectType) : Expression
{
$assignExpression = $this->createAssignExpression($variableName, $arrayDimFetch);
$this->varAnnotationManipulator->decorateNodeWithInlineVarType($assignExpression, $controlObjectType, $variableName);
return $assignExpression;
}
private function createAssignExpression(string $variableName, ArrayDimFetch $arrayDimFetch) : Expression
{
$variable = new Variable($variableName);
$assignedArrayDimFetch = clone $arrayDimFetch;
$assign = new Assign($variable, $assignedArrayDimFetch);
$variable->setAttribute(AttributeKey::PARENT_NODE, $assign);
$assignedArrayDimFetch->setAttribute(AttributeKey::PARENT_NODE, $assign);
return new Expression($assign);
}
}

View File

@ -1,72 +0,0 @@
<?php
declare (strict_types=1);
namespace Rector\Nette\NodeAnalyzer;
use PhpParser\Node;
use PhpParser\Node\Expr\ArrayDimFetch;
use PhpParser\Node\Expr\Assign;
use PhpParser\Node\Expr\Variable;
use PhpParser\Node\Scalar\String_;
use PHPStan\Type\ObjectType;
use Rector\NodeTypeResolver\NodeTypeResolver;
final class ControlDimFetchAnalyzer
{
/**
* @readonly
* @var \Rector\NodeTypeResolver\NodeTypeResolver
*/
private $nodeTypeResolver;
public function __construct(NodeTypeResolver $nodeTypeResolver)
{
$this->nodeTypeResolver = $nodeTypeResolver;
}
public function matchNameOnFormOrControlVariable(Node $node) : ?string
{
return $this->matchNameOnVariableType($node, new ObjectType('Nette\\Application\\UI\\Form'));
}
public function matchNameOnControlVariable(Node $node) : ?string
{
return $this->matchNameOnVariableType($node, new ObjectType('Nette\\Application\\UI\\Control'));
}
public function matchName(Node $node) : ?string
{
if (!$node instanceof ArrayDimFetch) {
return null;
}
if (!$this->isVariableTypes($node->var, [new ObjectType('Nette\\ComponentModel\\IContainer')])) {
return null;
}
if (!$node->dim instanceof String_) {
return null;
}
return $node->dim->value;
}
private function matchNameOnVariableType(Node $node, ObjectType $objectType) : ?string
{
$matchedName = $this->matchName($node);
if ($matchedName === null) {
return null;
}
/** @var Assign $node */
if (!$this->isVariableTypes($node->var, [$objectType])) {
return null;
}
return $matchedName;
}
/**
* @param ObjectType[] $objectTypes
*/
private function isVariableTypes(Node $node, array $objectTypes) : bool
{
if (!$node instanceof Variable) {
return \false;
}
foreach ($objectTypes as $objectType) {
if ($this->nodeTypeResolver->isObjectType($node, $objectType)) {
return \true;
}
}
return \false;
}
}

View File

@ -1,61 +0,0 @@
<?php
declare (strict_types=1);
namespace Rector\Nette\NodeAnalyzer;
use PhpParser\Node;
use PhpParser\Node\Expr\MethodCall;
use PhpParser\Node\Expr\Variable;
use PhpParser\Node\Stmt\ClassMethod;
use Rector\Core\PhpParser\Node\BetterNodeFinder;
use Rector\Defluent\NodeAnalyzer\FluentChainMethodCallNodeAnalyzer;
use Rector\NodeNameResolver\NodeNameResolver;
final class MethodCallManipulator
{
/**
* @readonly
* @var \Rector\Core\PhpParser\Node\BetterNodeFinder
*/
private $betterNodeFinder;
/**
* @readonly
* @var \Rector\NodeNameResolver\NodeNameResolver
*/
private $nodeNameResolver;
/**
* @readonly
* @var \Rector\Defluent\NodeAnalyzer\FluentChainMethodCallNodeAnalyzer
*/
private $fluentChainMethodCallNodeAnalyzer;
public function __construct(BetterNodeFinder $betterNodeFinder, NodeNameResolver $nodeNameResolver, FluentChainMethodCallNodeAnalyzer $fluentChainMethodCallNodeAnalyzer)
{
$this->betterNodeFinder = $betterNodeFinder;
$this->nodeNameResolver = $nodeNameResolver;
$this->fluentChainMethodCallNodeAnalyzer = $fluentChainMethodCallNodeAnalyzer;
}
/**
* @return MethodCall[]
*/
public function findMethodCallsOnVariable(Variable $variable) : array
{
// get scope node, e.g. parent function call, method call or anonymous function
$classMethod = $this->betterNodeFinder->findParentType($variable, ClassMethod::class);
if (!$classMethod instanceof ClassMethod) {
return [];
}
$variableName = $this->nodeNameResolver->getName($variable);
if ($variableName === null) {
return [];
}
/** @var MethodCall[] $methodCalls */
$methodCalls = $this->betterNodeFinder->findInstanceOf($classMethod, MethodCall::class);
return \array_filter($methodCalls, function (MethodCall $methodCall) use($variableName) : bool {
// cover fluent interfaces too
$callerNode = $this->fluentChainMethodCallNodeAnalyzer->resolveRootExpr($methodCall);
if (!$callerNode instanceof Variable) {
return \false;
}
return $this->nodeNameResolver->isName($callerNode, $variableName);
});
}
}

View File

@ -1,34 +0,0 @@
<?php
declare (strict_types=1);
namespace Rector\Nette\NodeResolver;
use PhpParser\Node;
use Rector\Nette\Contract\FormControlTypeResolverInterface;
final class MethodNamesByInputNamesResolver
{
/**
* @var FormControlTypeResolverInterface[]
* @readonly
*/
private $formControlTypeResolvers;
/**
* @param FormControlTypeResolverInterface[] $formControlTypeResolvers
*/
public function __construct(array $formControlTypeResolvers)
{
$this->formControlTypeResolvers = $formControlTypeResolvers;
}
/**
* @return array<string, string>
*/
public function resolveExpr(Node $node) : array
{
$methodNamesByInputNames = [];
foreach ($this->formControlTypeResolvers as $formControlTypeResolver) {
$currentMethodNamesByInputNames = $formControlTypeResolver->resolve($node);
$methodNamesByInputNames = \array_merge($methodNamesByInputNames, $currentMethodNamesByInputNames);
}
return $methodNamesByInputNames;
}
}

View File

@ -1,166 +0,0 @@
<?php
declare (strict_types=1);
namespace Rector\Nette\Rector\ArrayDimFetch;
use PhpParser\Node;
use PhpParser\Node\Expr\ArrayDimFetch;
use PhpParser\Node\Expr\Isset_;
use PhpParser\Node\Expr\Variable;
use PhpParser\Node\Stmt\ClassMethod;
use PhpParser\Node\Stmt\Unset_;
use PHPStan\Type\ObjectType;
use Rector\Core\Rector\AbstractRector;
use Rector\Nette\Naming\NetteControlNaming;
use Rector\Nette\NodeAnalyzer\ArrayDimFetchAnalyzer;
use Rector\Nette\NodeAnalyzer\ArrayDimFetchRenamer;
use Rector\Nette\NodeAnalyzer\AssignAnalyzer;
use Rector\Nette\NodeAnalyzer\ControlDimFetchAnalyzer;
use Rector\Nette\NodeResolver\MethodNamesByInputNamesResolver;
use Rector\NodeTypeResolver\Node\AttributeKey;
use Symplify\RuleDocGenerator\ValueObject\CodeSample\CodeSample;
use Symplify\RuleDocGenerator\ValueObject\RuleDefinition;
/**
* @see \Rector\Nette\Tests\Rector\ArrayDimFetch\AnnotateMagicalControlArrayAccessRector\AnnotateMagicalControlArrayAccessRectorTest
*/
final class AnnotateMagicalControlArrayAccessRector extends AbstractRector
{
/**
* @readonly
* @var \Rector\Nette\NodeResolver\MethodNamesByInputNamesResolver
*/
private $methodNamesByInputNamesResolver;
/**
* @readonly
* @var \Rector\Nette\NodeAnalyzer\ArrayDimFetchRenamer
*/
private $arrayDimFetchRenamer;
/**
* @readonly
* @var \Rector\Nette\NodeAnalyzer\ArrayDimFetchAnalyzer
*/
private $arrayDimFetchAnalyzer;
/**
* @readonly
* @var \Rector\Nette\NodeAnalyzer\ControlDimFetchAnalyzer
*/
private $controlDimFetchAnalyzer;
/**
* @readonly
* @var \Rector\Nette\Naming\NetteControlNaming
*/
private $netteControlNaming;
/**
* @readonly
* @var \Rector\Nette\NodeAnalyzer\AssignAnalyzer
*/
private $assignAnalyzer;
public function __construct(MethodNamesByInputNamesResolver $methodNamesByInputNamesResolver, ArrayDimFetchRenamer $arrayDimFetchRenamer, ArrayDimFetchAnalyzer $arrayDimFetchAnalyzer, ControlDimFetchAnalyzer $controlDimFetchAnalyzer, NetteControlNaming $netteControlNaming, AssignAnalyzer $assignAnalyzer)
{
$this->methodNamesByInputNamesResolver = $methodNamesByInputNamesResolver;
$this->arrayDimFetchRenamer = $arrayDimFetchRenamer;
$this->arrayDimFetchAnalyzer = $arrayDimFetchAnalyzer;
$this->controlDimFetchAnalyzer = $controlDimFetchAnalyzer;
$this->netteControlNaming = $netteControlNaming;
$this->assignAnalyzer = $assignAnalyzer;
}
/**
* @return array<class-string<Node>>
*/
public function getNodeTypes() : array
{
return [ArrayDimFetch::class];
}
public function getRuleDefinition() : RuleDefinition
{
return new RuleDefinition('Change magic $this["some_component"] to variable assign with @var annotation', [new CodeSample(<<<'CODE_SAMPLE'
use Nette\Application\UI\Presenter;
use Nette\Application\UI\Form;
final class SomePresenter extends Presenter
{
public function run()
{
if ($this['some_form']->isSubmitted()) {
}
}
protected function createComponentSomeForm()
{
return new Form();
}
}
CODE_SAMPLE
, <<<'CODE_SAMPLE'
use Nette\Application\UI\Presenter;
use Nette\Application\UI\Form;
final class SomePresenter extends Presenter
{
public function run()
{
/** @var \Nette\Application\UI\Form $someForm */
$someForm = $this['some_form'];
if ($someForm->isSubmitted()) {
}
}
protected function createComponentSomeForm()
{
return new Form();
}
}
CODE_SAMPLE
)]);
}
/**
* @param ArrayDimFetch $node
*/
public function refactor(Node $node) : ?Node
{
if ($this->shouldSkip($node)) {
return null;
}
$controlName = $this->controlDimFetchAnalyzer->matchNameOnControlVariable($node);
if ($controlName === null) {
return null;
}
// probably multiplier factory, nothing we can do... yet
if (\strpos($controlName, '-') !== \false) {
return null;
}
$variableName = $this->netteControlNaming->createVariableName($controlName);
$controlObjectType = $this->resolveControlType($node, $controlName);
if (!$controlObjectType instanceof ObjectType) {
return null;
}
$this->assignAnalyzer->addAssignExpressionForFirstCase($variableName, $node, $controlObjectType);
$classMethod = $this->betterNodeFinder->findParentType($node, ClassMethod::class);
if ($classMethod instanceof ClassMethod) {
$this->arrayDimFetchRenamer->renameToVariable($classMethod, $node, $variableName);
}
return new Variable($variableName);
}
private function shouldSkip(ArrayDimFetch $arrayDimFetch) : bool
{
if ($this->arrayDimFetchAnalyzer->isBeingAssignedOrInitialized($arrayDimFetch)) {
return \true;
}
$parent = $arrayDimFetch->getAttribute(AttributeKey::PARENT_NODE);
if (!$parent instanceof Isset_ && !$parent instanceof Unset_) {
return \false;
}
return !$arrayDimFetch->dim instanceof Variable;
}
private function resolveControlType(ArrayDimFetch $arrayDimFetch, string $controlName) : ?ObjectType
{
$controlTypes = $this->methodNamesByInputNamesResolver->resolveExpr($arrayDimFetch);
if ($controlTypes === []) {
return null;
}
if (!isset($controlTypes[$controlName])) {
return null;
}
return new ObjectType($controlTypes[$controlName]);
}
}

View File

@ -6,19 +6,19 @@
"require": {
"php": ">=8.1",
"ext-xml": "*",
"symfony\/string": "^6.0"
"symfony\/string": "^6.1"
},
"require-dev": {
"phpstan\/extension-installer": "^1.1",
"phpstan\/phpstan": "^1.7.10",
"phpstan\/phpstan-strict-rules": "^1.2",
"phpstan\/phpstan-webmozart-assert": "^1.1",
"phpstan\/phpstan": "^1.8.2",
"phpstan\/phpstan-strict-rules": "^1.3",
"phpstan\/phpstan-webmozart-assert": "^1.2",
"phpunit\/phpunit": "^9.5",
"rector\/phpstan-rules": "^0.5",
"rector\/phpstan-rules": "^0.5.8",
"rector\/rector-src": "dev-main",
"symfony\/routing": "^6.0",
"symfony\/security-core": "^6.0",
"symfony\/security-http": "^6.0",
"symfony\/routing": "^6.1",
"symfony\/security-core": "^6.1",
"symfony\/security-http": "^6.1",
"symplify\/easy-ci": "^11.0",
"symplify\/easy-coding-standard": "^11.0",
"symplify\/phpstan-extensions": "^11.0",

View File

@ -0,0 +1,10 @@
<?php
declare (strict_types=1);
namespace RectorPrefix202208;
use Rector\Config\RectorConfig;
use Rector\Symfony\Set\SymfonySetList;
return static function (RectorConfig $rectorConfig) : void {
$rectorConfig->sets([SymfonySetList::SYMFONY_25]);
};

View File

@ -4,7 +4,8 @@ declare (strict_types=1);
namespace RectorPrefix202208;
use Rector\Config\RectorConfig;
use Rector\Symfony\Set\SymfonyLevelSetList;
use Rector\Symfony\Set\SymfonySetList;
return static function (RectorConfig $rectorConfig) : void {
$rectorConfig->sets([SymfonySetList::SYMFONY_26]);
$rectorConfig->sets([SymfonySetList::SYMFONY_26, SymfonyLevelSetList::UP_TO_SYMFONY_25]);
};

View File

@ -0,0 +1,10 @@
<?php
declare (strict_types=1);
namespace RectorPrefix202208;
use Rector\Config\RectorConfig;
use Rector\Symfony\Rector\MethodCall\AddViolationToBuildViolationRector;
return static function (RectorConfig $rectorConfig) : void {
$rectorConfig->rule(AddViolationToBuildViolationRector::class);
};

View File

@ -1,4 +1,4 @@
# 66 Rules Overview
# 68 Rules Overview
## ActionSuffixRemoverRector
@ -66,6 +66,24 @@ Collect routes from Symfony project router and add Route annotation to controlle
<br>
## AddViolationToBuildViolationRector
Change `$context->addViolationAt` to `$context->buildViolation` on Validator ExecutionContext
- class: [`Rector\Symfony\Rector\MethodCall\AddViolationToBuildViolationRector`](../src/Rector/MethodCall/AddViolationToBuildViolationRector.php)
```diff
-$context->addViolationAt('property', 'The value {{ value }} is invalid.', array(
- '{{ value }}' => $invalidValue,
-));
+$context->buildViolation('The value {{ value }} is invalid.')
+ ->atPath('property')
+ ->setParameter('{{ value }}', $invalidValue)
+ ->addViolation();
```
<br>
## AuthorizationCheckerIsGrantedExtractorRector
Change `$this->authorizationChecker->isGranted([$a, $b])` to `$this->authorizationChecker->isGranted($a) || $this->authorizationChecker->isGranted($b)`
@ -1334,6 +1352,25 @@ Change RouteCollectionBuilder to RoutingConfiguratorRector
<br>
## ServiceSetStringNameToClassNameRector
Change `$service->set()` string names to class-type-based names, to allow `$container->get()` by types in Symfony 2.8
- class: [`Rector\Symfony\Rector\MethodCall\ServiceSetStringNameToClassNameRector`](../src/Rector/MethodCall/ServiceSetStringNameToClassNameRector.php)
```diff
use Symfony\Component\DependencyInjection\Loader\Configurator\ContainerConfigurator;
return static function (ContainerConfigurator $containerConfigurator): void {
$services = $containerConfigurator->services();
- $services->set('some_name', App\SomeClass::class);
+ $services->set('app\\someclass', App\SomeClass::class);
};
```
<br>
## SimpleFunctionAndFilterRector
Changes Twig_Function_Method to Twig_SimpleFunction calls in Twig_Extension.

View File

@ -0,0 +1,118 @@
<?php
declare (strict_types=1);
namespace Rector\Symfony\Rector\MethodCall;
use PhpParser\Node;
use PhpParser\Node\Arg;
use PhpParser\Node\Expr;
use PhpParser\Node\Expr\Array_;
use PhpParser\Node\Expr\ArrayItem;
use PhpParser\Node\Expr\MethodCall;
use PhpParser\Node\Identifier;
use PHPStan\Type\ObjectType;
use Rector\Core\Rector\AbstractRector;
use Symplify\RuleDocGenerator\ValueObject\CodeSample\CodeSample;
use Symplify\RuleDocGenerator\ValueObject\RuleDefinition;
/**
* @see https://stackoverflow.com/questions/25264922/symfony-2-5-addviolationat-deprecated-use-buildviolation
* @see \Rector\Symfony\Tests\Rector\MethodCall\AddViolationToBuildViolationRector\AddViolationToBuildViolationRectorTest
*/
final class AddViolationToBuildViolationRector extends AbstractRector
{
public function getRuleDefinition() : RuleDefinition
{
return new RuleDefinition('Change `$context->addViolationAt` to `$context->buildViolation` on Validator ExecutionContext', [new CodeSample(<<<'CODE_SAMPLE'
$context->addViolationAt('property', 'The value {{ value }} is invalid.', array(
'{{ value }}' => $invalidValue,
));
CODE_SAMPLE
, <<<'CODE_SAMPLE'
$context->buildViolation('The value {{ value }} is invalid.')
->atPath('property')
->setParameter('{{ value }}', $invalidValue)
->addViolation();
CODE_SAMPLE
)]);
}
/**
* @return array<class-string<Node>>
*/
public function getNodeTypes() : array
{
return [MethodCall::class];
}
/**
* @param MethodCall $node
*/
public function refactor(Node $node) : ?MethodCall
{
$objectType = $this->nodeTypeResolver->getType($node->var);
if (!$objectType instanceof ObjectType) {
return null;
}
$executionContext = new ObjectType('Symfony\\Component\\Validator\\Context\\ExecutionContextInterface');
if (!$executionContext->isSuperTypeOf($objectType)->yes()) {
return null;
}
if (!$this->nodeNameResolver->isName($node->name, 'addViolationAt')) {
return null;
}
$args = $node->getArgs();
$path = $args[0];
$message = $args[1];
$node->name = new Identifier('buildViolation');
$node->args = [$message];
$node = new MethodCall($node, 'atPath', [$path]);
$node = $this->buildFluentWithParameters($node, $args);
$node = $this->buildFluentWithInvalidValue($node, $args);
$node = $this->buildFluentWithPlural($node, $args);
$node = $this->buildFluentWithCode($node, $args);
$node = new MethodCall($node, 'addViolation');
return $node;
}
/**
* @param Arg[] $args
*/
private function buildFluentWithParameters(MethodCall $methodCall, array $args) : MethodCall
{
if (isset($args[2]) && $args[2]->value instanceof Array_) {
foreach ($args[2]->value->items as $item) {
if ($item instanceof ArrayItem && $item->key instanceof Expr) {
$methodCall = new MethodCall($methodCall, 'setParameter', [new Arg($item->key), new Arg($item->value)]);
}
}
}
return $methodCall;
}
/**
* @param Arg[] $args
*/
private function buildFluentWithInvalidValue(MethodCall $methodCall, array $args) : MethodCall
{
if (isset($args[3])) {
$methodCall = new MethodCall($methodCall, 'setInvalidValue', [new Arg($args[3]->value)]);
}
return $methodCall;
}
/**
* @param Arg[] $args
*/
private function buildFluentWithPlural(MethodCall $methodCall, array $args) : MethodCall
{
if (isset($args[4])) {
$methodCall = new MethodCall($methodCall, 'setPlural', [new Arg($args[4]->value)]);
}
return $methodCall;
}
/**
* @param Arg[] $args
*/
private function buildFluentWithCode(MethodCall $methodCall, array $args) : MethodCall
{
if (isset($args[5])) {
$methodCall = new MethodCall($methodCall, 'setCode', [new Arg($args[5]->value)]);
}
return $methodCall;
}
}

View File

@ -0,0 +1,84 @@
<?php
declare (strict_types=1);
namespace Rector\Symfony\Rector\MethodCall;
use PhpParser\Node;
use PhpParser\Node\Expr\ClassConstFetch;
use PhpParser\Node\Expr\MethodCall;
use PhpParser\Node\Scalar\String_;
use PHPStan\Type\ObjectType;
use Rector\Core\Rector\AbstractRector;
use Symplify\RuleDocGenerator\ValueObject\CodeSample\CodeSample;
use Symplify\RuleDocGenerator\ValueObject\RuleDefinition;
/**
* @see \Rector\Symfony\Tests\Rector\MethodCall\ServiceSetStringNameToClassNameRector\ServiceSetStringNameToClassNameRectorTest
*/
final class ServiceSetStringNameToClassNameRector extends AbstractRector
{
public function getRuleDefinition() : RuleDefinition
{
return new RuleDefinition('Change $service->set() string names to class-type-based names, to allow $container->get() by types in Symfony 2.8', [new CodeSample(<<<'CODE_SAMPLE'
use Symfony\Component\DependencyInjection\Loader\Configurator\ContainerConfigurator;
return static function (ContainerConfigurator $containerConfigurator): void {
$services = $containerConfigurator->services();
$services->set('some_name', App\SomeClass::class);
};
CODE_SAMPLE
, <<<'CODE_SAMPLE'
use Symfony\Component\DependencyInjection\Loader\Configurator\ContainerConfigurator;
return static function (ContainerConfigurator $containerConfigurator): void {
$services = $containerConfigurator->services();
$services->set('app\\someclass', App\SomeClass::class);
};
CODE_SAMPLE
)]);
}
/**
* @return array<class-string<Node>>
*/
public function getNodeTypes() : array
{
return [MethodCall::class];
}
/**
* @param MethodCall $node
*/
public function refactor(Node $node) : ?Node
{
if (!$this->isName($node->name, 'set')) {
return null;
}
if (\count($node->getArgs()) !== 2) {
return null;
}
if (!$this->isObjectType($node->var, new ObjectType('Symfony\\Component\\DependencyInjection\\Loader\\Configurator\\ServicesConfigurator'))) {
return null;
}
$args = $node->getArgs();
$firstArg = $args[0];
$serviceName = $this->valueResolver->getValue($firstArg->value);
if (!\is_string($serviceName)) {
return null;
}
// already slash renamed
if (\strpos($serviceName, '\\') !== \false) {
return null;
}
$secondArg = $args[1];
if (!$secondArg->value instanceof ClassConstFetch && !$secondArg->value instanceof String_) {
return null;
}
$serviceType = $this->valueResolver->getValue($secondArg->value);
if (!\is_string($serviceType)) {
return null;
}
$typedServiceName = \strtolower($serviceType);
$firstArg->value = String_::fromString("'" . $typedServiceName . "'");
return $node;
}
}

View File

@ -6,6 +6,10 @@ namespace Rector\Symfony\Set;
use Rector\Set\Contract\SetListInterface;
final class SymfonyLevelSetList implements SetListInterface
{
/**
* @var string
*/
public const UP_TO_SYMFONY_25 = __DIR__ . '/../../config/sets/symfony/level/up-to-symfony-25.php';
/**
* @var string
*/

View File

@ -10,6 +10,10 @@ final class SymfonySetList implements SetListInterface
* @var string
*/
public const SYMFONY_STRICT = __DIR__ . '/../../config/sets/symfony/symfony-strict.php';
/**
* @var string
*/
public const SYMFONY_25 = __DIR__ . '/../../config/sets/symfony/symfony25.php';
/**
* @var string
*/