mirror of
https://github.com/rectorphp/rector.git
synced 2024-06-06 03:10:50 +00:00
Updated Rector to commit b4eb883e9110f50607ce2eed629c237b5e7e7356
b4eb883e91
[DeadCode] Skip isset() from property fetch from docblock on RemoveAlwaysTrueIfConditionRector (#5754)
This commit is contained in:
parent
9811962c70
commit
11b9220a05
1
vendor/composer/autoload_classmap.php
vendored
1
vendor/composer/autoload_classmap.php
vendored
|
@ -1330,6 +1330,7 @@ return array(
|
||||||
'Rector\\Doctrine\\CodeQuality\\Enum\\ToManyMappings' => $vendorDir . '/rector/rector-doctrine/rules/CodeQuality/Enum/ToManyMappings.php',
|
'Rector\\Doctrine\\CodeQuality\\Enum\\ToManyMappings' => $vendorDir . '/rector/rector-doctrine/rules/CodeQuality/Enum/ToManyMappings.php',
|
||||||
'Rector\\Doctrine\\CodeQuality\\Helper\\NodeValueNormalizer' => $vendorDir . '/rector/rector-doctrine/rules/CodeQuality/Helper/NodeValueNormalizer.php',
|
'Rector\\Doctrine\\CodeQuality\\Helper\\NodeValueNormalizer' => $vendorDir . '/rector/rector-doctrine/rules/CodeQuality/Helper/NodeValueNormalizer.php',
|
||||||
'Rector\\Doctrine\\CodeQuality\\NodeFactory\\AttributeFactory' => $vendorDir . '/rector/rector-doctrine/rules/CodeQuality/NodeFactory/AttributeFactory.php',
|
'Rector\\Doctrine\\CodeQuality\\NodeFactory\\AttributeFactory' => $vendorDir . '/rector/rector-doctrine/rules/CodeQuality/NodeFactory/AttributeFactory.php',
|
||||||
|
'Rector\\Doctrine\\CodeQuality\\Rector\\Class_\\ExplicitRelationCollectionRector' => $vendorDir . '/rector/rector-doctrine/rules/CodeQuality/Rector/Class_/ExplicitRelationCollectionRector.php',
|
||||||
'Rector\\Doctrine\\CodeQuality\\Rector\\Class_\\InitializeDefaultEntityCollectionRector' => $vendorDir . '/rector/rector-doctrine/rules/CodeQuality/Rector/Class_/InitializeDefaultEntityCollectionRector.php',
|
'Rector\\Doctrine\\CodeQuality\\Rector\\Class_\\InitializeDefaultEntityCollectionRector' => $vendorDir . '/rector/rector-doctrine/rules/CodeQuality/Rector/Class_/InitializeDefaultEntityCollectionRector.php',
|
||||||
'Rector\\Doctrine\\CodeQuality\\Rector\\Class_\\MoveCurrentDateTimeDefaultInEntityToConstructorRector' => $vendorDir . '/rector/rector-doctrine/rules/CodeQuality/Rector/Class_/MoveCurrentDateTimeDefaultInEntityToConstructorRector.php',
|
'Rector\\Doctrine\\CodeQuality\\Rector\\Class_\\MoveCurrentDateTimeDefaultInEntityToConstructorRector' => $vendorDir . '/rector/rector-doctrine/rules/CodeQuality/Rector/Class_/MoveCurrentDateTimeDefaultInEntityToConstructorRector.php',
|
||||||
'Rector\\Doctrine\\CodeQuality\\Rector\\Class_\\RemoveEmptyTableAttributeRector' => $vendorDir . '/rector/rector-doctrine/rules/CodeQuality/Rector/Class_/RemoveEmptyTableAttributeRector.php',
|
'Rector\\Doctrine\\CodeQuality\\Rector\\Class_\\RemoveEmptyTableAttributeRector' => $vendorDir . '/rector/rector-doctrine/rules/CodeQuality/Rector/Class_/RemoveEmptyTableAttributeRector.php',
|
||||||
|
|
1
vendor/composer/autoload_static.php
vendored
1
vendor/composer/autoload_static.php
vendored
|
@ -1549,6 +1549,7 @@ class ComposerStaticInit67be42e0079886f0083b7116ae1de531
|
||||||
'Rector\\Doctrine\\CodeQuality\\Enum\\ToManyMappings' => __DIR__ . '/..' . '/rector/rector-doctrine/rules/CodeQuality/Enum/ToManyMappings.php',
|
'Rector\\Doctrine\\CodeQuality\\Enum\\ToManyMappings' => __DIR__ . '/..' . '/rector/rector-doctrine/rules/CodeQuality/Enum/ToManyMappings.php',
|
||||||
'Rector\\Doctrine\\CodeQuality\\Helper\\NodeValueNormalizer' => __DIR__ . '/..' . '/rector/rector-doctrine/rules/CodeQuality/Helper/NodeValueNormalizer.php',
|
'Rector\\Doctrine\\CodeQuality\\Helper\\NodeValueNormalizer' => __DIR__ . '/..' . '/rector/rector-doctrine/rules/CodeQuality/Helper/NodeValueNormalizer.php',
|
||||||
'Rector\\Doctrine\\CodeQuality\\NodeFactory\\AttributeFactory' => __DIR__ . '/..' . '/rector/rector-doctrine/rules/CodeQuality/NodeFactory/AttributeFactory.php',
|
'Rector\\Doctrine\\CodeQuality\\NodeFactory\\AttributeFactory' => __DIR__ . '/..' . '/rector/rector-doctrine/rules/CodeQuality/NodeFactory/AttributeFactory.php',
|
||||||
|
'Rector\\Doctrine\\CodeQuality\\Rector\\Class_\\ExplicitRelationCollectionRector' => __DIR__ . '/..' . '/rector/rector-doctrine/rules/CodeQuality/Rector/Class_/ExplicitRelationCollectionRector.php',
|
||||||
'Rector\\Doctrine\\CodeQuality\\Rector\\Class_\\InitializeDefaultEntityCollectionRector' => __DIR__ . '/..' . '/rector/rector-doctrine/rules/CodeQuality/Rector/Class_/InitializeDefaultEntityCollectionRector.php',
|
'Rector\\Doctrine\\CodeQuality\\Rector\\Class_\\InitializeDefaultEntityCollectionRector' => __DIR__ . '/..' . '/rector/rector-doctrine/rules/CodeQuality/Rector/Class_/InitializeDefaultEntityCollectionRector.php',
|
||||||
'Rector\\Doctrine\\CodeQuality\\Rector\\Class_\\MoveCurrentDateTimeDefaultInEntityToConstructorRector' => __DIR__ . '/..' . '/rector/rector-doctrine/rules/CodeQuality/Rector/Class_/MoveCurrentDateTimeDefaultInEntityToConstructorRector.php',
|
'Rector\\Doctrine\\CodeQuality\\Rector\\Class_\\MoveCurrentDateTimeDefaultInEntityToConstructorRector' => __DIR__ . '/..' . '/rector/rector-doctrine/rules/CodeQuality/Rector/Class_/MoveCurrentDateTimeDefaultInEntityToConstructorRector.php',
|
||||||
'Rector\\Doctrine\\CodeQuality\\Rector\\Class_\\RemoveEmptyTableAttributeRector' => __DIR__ . '/..' . '/rector/rector-doctrine/rules/CodeQuality/Rector/Class_/RemoveEmptyTableAttributeRector.php',
|
'Rector\\Doctrine\\CodeQuality\\Rector\\Class_\\RemoveEmptyTableAttributeRector' => __DIR__ . '/..' . '/rector/rector-doctrine/rules/CodeQuality/Rector/Class_/RemoveEmptyTableAttributeRector.php',
|
||||||
|
|
8
vendor/composer/installed.json
vendored
8
vendor/composer/installed.json
vendored
|
@ -1679,12 +1679,12 @@
|
||||||
"source": {
|
"source": {
|
||||||
"type": "git",
|
"type": "git",
|
||||||
"url": "https:\/\/github.com\/rectorphp\/rector-doctrine.git",
|
"url": "https:\/\/github.com\/rectorphp\/rector-doctrine.git",
|
||||||
"reference": "a1d50bb1b3d158961293ef0828fffb1058cdb32f"
|
"reference": "bbc48ccb87e026a100e86d6dc2a238b1293c14cb"
|
||||||
},
|
},
|
||||||
"dist": {
|
"dist": {
|
||||||
"type": "zip",
|
"type": "zip",
|
||||||
"url": "https:\/\/api.github.com\/repos\/rectorphp\/rector-doctrine\/zipball\/a1d50bb1b3d158961293ef0828fffb1058cdb32f",
|
"url": "https:\/\/api.github.com\/repos\/rectorphp\/rector-doctrine\/zipball\/bbc48ccb87e026a100e86d6dc2a238b1293c14cb",
|
||||||
"reference": "a1d50bb1b3d158961293ef0828fffb1058cdb32f",
|
"reference": "bbc48ccb87e026a100e86d6dc2a238b1293c14cb",
|
||||||
"shasum": ""
|
"shasum": ""
|
||||||
},
|
},
|
||||||
"require": {
|
"require": {
|
||||||
|
@ -1709,7 +1709,7 @@
|
||||||
"tomasvotruba\/unused-public": "^0.3",
|
"tomasvotruba\/unused-public": "^0.3",
|
||||||
"tracy\/tracy": "^2.10"
|
"tracy\/tracy": "^2.10"
|
||||||
},
|
},
|
||||||
"time": "2024-03-07T14:21:07+00:00",
|
"time": "2024-03-22T00:08:11+00:00",
|
||||||
"default-branch": true,
|
"default-branch": true,
|
||||||
"type": "rector-extension",
|
"type": "rector-extension",
|
||||||
"extra": {
|
"extra": {
|
||||||
|
|
2
vendor/composer/installed.php
vendored
2
vendor/composer/installed.php
vendored
File diff suppressed because one or more lines are too long
|
@ -9,7 +9,7 @@ namespace Rector\RectorInstaller;
|
||||||
*/
|
*/
|
||||||
final class GeneratedConfig
|
final class GeneratedConfig
|
||||||
{
|
{
|
||||||
public const EXTENSIONS = array('rector/rector-doctrine' => array('install_path' => '/home/runner/work/rector-src/rector-src/rector-build/vendor/rector/rector-doctrine', 'relative_install_path' => '../../rector-doctrine', 'extra' => NULL, 'version' => 'dev-main a1d50bb'), 'rector/rector-downgrade-php' => array('install_path' => '/home/runner/work/rector-src/rector-src/rector-build/vendor/rector/rector-downgrade-php', 'relative_install_path' => '../../rector-downgrade-php', 'extra' => NULL, 'version' => 'dev-main eadea25'), 'rector/rector-phpunit' => array('install_path' => '/home/runner/work/rector-src/rector-src/rector-build/vendor/rector/rector-phpunit', 'relative_install_path' => '../../rector-phpunit', 'extra' => NULL, 'version' => 'dev-main 6845db4'), 'rector/rector-symfony' => array('install_path' => '/home/runner/work/rector-src/rector-src/rector-build/vendor/rector/rector-symfony', 'relative_install_path' => '../../rector-symfony', 'extra' => NULL, 'version' => 'dev-main c8b6413'));
|
public const EXTENSIONS = array('rector/rector-doctrine' => array('install_path' => '/home/runner/work/rector-src/rector-src/rector-build/vendor/rector/rector-doctrine', 'relative_install_path' => '../../rector-doctrine', 'extra' => NULL, 'version' => 'dev-main bbc48cc'), 'rector/rector-downgrade-php' => array('install_path' => '/home/runner/work/rector-src/rector-src/rector-build/vendor/rector/rector-downgrade-php', 'relative_install_path' => '../../rector-downgrade-php', 'extra' => NULL, 'version' => 'dev-main eadea25'), 'rector/rector-phpunit' => array('install_path' => '/home/runner/work/rector-src/rector-src/rector-build/vendor/rector/rector-phpunit', 'relative_install_path' => '../../rector-phpunit', 'extra' => NULL, 'version' => 'dev-main 6845db4'), 'rector/rector-symfony' => array('install_path' => '/home/runner/work/rector-src/rector-src/rector-build/vendor/rector/rector-symfony', 'relative_install_path' => '../../rector-symfony', 'extra' => NULL, 'version' => 'dev-main c8b6413'));
|
||||||
private function __construct()
|
private function __construct()
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
|
@ -4,7 +4,7 @@ declare (strict_types=1);
|
||||||
namespace RectorPrefix202403;
|
namespace RectorPrefix202403;
|
||||||
|
|
||||||
use Rector\Config\RectorConfig;
|
use Rector\Config\RectorConfig;
|
||||||
use Rector\Doctrine\CodeQuality\Rector\Class_\InitializeDefaultEntityCollectionRector;
|
use Rector\Doctrine\CodeQuality\Rector\Class_\ExplicitRelationCollectionRector;
|
||||||
use Rector\Doctrine\CodeQuality\Rector\Class_\MoveCurrentDateTimeDefaultInEntityToConstructorRector;
|
use Rector\Doctrine\CodeQuality\Rector\Class_\MoveCurrentDateTimeDefaultInEntityToConstructorRector;
|
||||||
use Rector\Doctrine\CodeQuality\Rector\Class_\RemoveEmptyTableAttributeRector;
|
use Rector\Doctrine\CodeQuality\Rector\Class_\RemoveEmptyTableAttributeRector;
|
||||||
use Rector\Doctrine\CodeQuality\Rector\Property\CorrectDefaultTypesOnEntityPropertyRector;
|
use Rector\Doctrine\CodeQuality\Rector\Property\CorrectDefaultTypesOnEntityPropertyRector;
|
||||||
|
@ -12,24 +12,22 @@ use Rector\Doctrine\CodeQuality\Rector\Property\ImproveDoctrineCollectionDocType
|
||||||
use Rector\Doctrine\CodeQuality\Rector\Property\MakeEntityDateTimePropertyDateTimeInterfaceRector;
|
use Rector\Doctrine\CodeQuality\Rector\Property\MakeEntityDateTimePropertyDateTimeInterfaceRector;
|
||||||
use Rector\Doctrine\CodeQuality\Rector\Property\OrderByKeyToClassConstRector;
|
use Rector\Doctrine\CodeQuality\Rector\Property\OrderByKeyToClassConstRector;
|
||||||
use Rector\Doctrine\CodeQuality\Rector\Property\TypedPropertyFromColumnTypeRector;
|
use Rector\Doctrine\CodeQuality\Rector\Property\TypedPropertyFromColumnTypeRector;
|
||||||
use Rector\Doctrine\CodeQuality\Rector\Property\TypedPropertyFromDoctrineCollectionRector;
|
|
||||||
use Rector\Doctrine\CodeQuality\Rector\Property\TypedPropertyFromToManyRelationTypeRector;
|
use Rector\Doctrine\CodeQuality\Rector\Property\TypedPropertyFromToManyRelationTypeRector;
|
||||||
use Rector\Doctrine\CodeQuality\Rector\Property\TypedPropertyFromToOneRelationTypeRector;
|
use Rector\Doctrine\CodeQuality\Rector\Property\TypedPropertyFromToOneRelationTypeRector;
|
||||||
use Rector\Transform\Rector\Attribute\AttributeKeyToClassConstFetchRector;
|
use Rector\Transform\Rector\Attribute\AttributeKeyToClassConstFetchRector;
|
||||||
use Rector\Transform\ValueObject\AttributeKeyToClassConstFetch;
|
use Rector\Transform\ValueObject\AttributeKeyToClassConstFetch;
|
||||||
return static function (RectorConfig $rectorConfig) : void {
|
return static function (RectorConfig $rectorConfig) : void {
|
||||||
$rectorConfig->rules([
|
$rectorConfig->rules([
|
||||||
InitializeDefaultEntityCollectionRector::class,
|
|
||||||
MakeEntityDateTimePropertyDateTimeInterfaceRector::class,
|
MakeEntityDateTimePropertyDateTimeInterfaceRector::class,
|
||||||
MoveCurrentDateTimeDefaultInEntityToConstructorRector::class,
|
MoveCurrentDateTimeDefaultInEntityToConstructorRector::class,
|
||||||
CorrectDefaultTypesOnEntityPropertyRector::class,
|
CorrectDefaultTypesOnEntityPropertyRector::class,
|
||||||
|
ExplicitRelationCollectionRector::class,
|
||||||
ImproveDoctrineCollectionDocTypeInEntityRector::class,
|
ImproveDoctrineCollectionDocTypeInEntityRector::class,
|
||||||
RemoveEmptyTableAttributeRector::class,
|
RemoveEmptyTableAttributeRector::class,
|
||||||
// typed properties in entities from annotations/attributes
|
// typed properties in entities from annotations/attributes
|
||||||
TypedPropertyFromColumnTypeRector::class,
|
TypedPropertyFromColumnTypeRector::class,
|
||||||
TypedPropertyFromToOneRelationTypeRector::class,
|
TypedPropertyFromToOneRelationTypeRector::class,
|
||||||
TypedPropertyFromToManyRelationTypeRector::class,
|
TypedPropertyFromToManyRelationTypeRector::class,
|
||||||
TypedPropertyFromDoctrineCollectionRector::class,
|
|
||||||
OrderByKeyToClassConstRector::class,
|
OrderByKeyToClassConstRector::class,
|
||||||
]);
|
]);
|
||||||
$rectorConfig->ruleWithConfiguration(AttributeKeyToClassConstFetchRector::class, [new AttributeKeyToClassConstFetch('Doctrine\\ORM\\Mapping\\Column', 'type', 'Doctrine\\DBAL\\Types\\Types', ['array' => 'ARRAY', 'ascii_string' => 'ASCII_STRING', 'bigint' => 'BIGINT', 'binary' => 'BINARY', 'blob' => 'BLOB', 'boolean' => 'BOOLEAN', 'date' => 'DATE_MUTABLE', 'date_immutable' => 'DATE_IMMUTABLE', 'dateinterval' => 'DATEINTERVAL', 'datetime' => 'DATETIME_MUTABLE', 'datetime_immutable' => 'DATETIME_IMMUTABLE', 'datetimetz' => 'DATETIMETZ_MUTABLE', 'datetimetz_immutable' => 'DATETIMETZ_IMMUTABLE', 'decimal' => 'DECIMAL', 'float' => 'FLOAT', 'guid' => 'GUID', 'integer' => 'INTEGER', 'json' => 'JSON', 'object' => 'OBJECT', 'simple_array' => 'SIMPLE_ARRAY', 'smallint' => 'SMALLINT', 'string' => 'STRING', 'text' => 'TEXT', 'time' => 'TIME_MUTABLE', 'time_immutable' => 'TIME_IMMUTABLE'])]);
|
$rectorConfig->ruleWithConfiguration(AttributeKeyToClassConstFetchRector::class, [new AttributeKeyToClassConstFetch('Doctrine\\ORM\\Mapping\\Column', 'type', 'Doctrine\\DBAL\\Types\\Types', ['array' => 'ARRAY', 'ascii_string' => 'ASCII_STRING', 'bigint' => 'BIGINT', 'binary' => 'BINARY', 'blob' => 'BLOB', 'boolean' => 'BOOLEAN', 'date' => 'DATE_MUTABLE', 'date_immutable' => 'DATE_IMMUTABLE', 'dateinterval' => 'DATEINTERVAL', 'datetime' => 'DATETIME_MUTABLE', 'datetime_immutable' => 'DATETIME_IMMUTABLE', 'datetimetz' => 'DATETIMETZ_MUTABLE', 'datetimetz_immutable' => 'DATETIMETZ_IMMUTABLE', 'decimal' => 'DECIMAL', 'float' => 'FLOAT', 'guid' => 'GUID', 'integer' => 'INTEGER', 'json' => 'JSON', 'object' => 'OBJECT', 'simple_array' => 'SIMPLE_ARRAY', 'smallint' => 'SMALLINT', 'string' => 'STRING', 'text' => 'TEXT', 'time' => 'TIME_MUTABLE', 'time_immutable' => 'TIME_IMMUTABLE'])]);
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
# 18 Rules Overview
|
# 19 Rules Overview
|
||||||
|
|
||||||
## ChangeCompositeExpressionAddMultipleWithWithRector
|
## ChangeCompositeExpressionAddMultipleWithWithRector
|
||||||
|
|
||||||
|
@ -87,6 +87,35 @@ Replace EventSubscriberInterface with AsDoctrineListener attribute(s)
|
||||||
|
|
||||||
<br>
|
<br>
|
||||||
|
|
||||||
|
## ExplicitRelationCollectionRector
|
||||||
|
|
||||||
|
Use explicit collection in one-to-many relations of Doctrine entity
|
||||||
|
|
||||||
|
- class: [`Rector\Doctrine\CodeQuality\Rector\Class_\ExplicitRelationCollectionRector`](../rules/CodeQuality/Rector/Class_/ExplicitRelationCollectionRector.php)
|
||||||
|
|
||||||
|
```diff
|
||||||
|
+use Doctrine\ORM\Mapping\Entity;
|
||||||
|
use Doctrine\ORM\Mapping\OneToMany;
|
||||||
|
-use Doctrine\ORM\Mapping\Entity;
|
||||||
|
+use Doctrine\Common\Collections\ArrayCollection;
|
||||||
|
+use Doctrine\Common\Collections\Collection;
|
||||||
|
|
||||||
|
#[Entity]
|
||||||
|
class SomeClass
|
||||||
|
{
|
||||||
|
#[OneToMany(targetEntity: 'SomeClass')]
|
||||||
|
- private $items = [];
|
||||||
|
+ private Collection $items;
|
||||||
|
+
|
||||||
|
+ public function __construct()
|
||||||
|
+ {
|
||||||
|
+ $this->items = new ArrayCollection();
|
||||||
|
+ }
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
<br>
|
||||||
|
|
||||||
## ExtractArrayArgOnQueryBuilderSelectRector
|
## ExtractArrayArgOnQueryBuilderSelectRector
|
||||||
|
|
||||||
Extract array arg on QueryBuilder select, addSelect, groupBy, addGroupBy
|
Extract array arg on QueryBuilder select, addSelect, groupBy, addGroupBy
|
||||||
|
|
126
vendor/rector/rector-doctrine/rules/CodeQuality/Rector/Class_/ExplicitRelationCollectionRector.php
vendored
Normal file
126
vendor/rector/rector-doctrine/rules/CodeQuality/Rector/Class_/ExplicitRelationCollectionRector.php
vendored
Normal file
|
@ -0,0 +1,126 @@
|
||||||
|
<?php
|
||||||
|
|
||||||
|
declare (strict_types=1);
|
||||||
|
namespace Rector\Doctrine\CodeQuality\Rector\Class_;
|
||||||
|
|
||||||
|
use PhpParser\Node;
|
||||||
|
use PhpParser\Node\Expr;
|
||||||
|
use PhpParser\Node\Name\FullyQualified;
|
||||||
|
use PhpParser\Node\Stmt\Class_;
|
||||||
|
use Rector\Doctrine\NodeAnalyzer\AttrinationFinder;
|
||||||
|
use Rector\Doctrine\NodeFactory\ArrayCollectionAssignFactory;
|
||||||
|
use Rector\NodeManipulator\ClassDependencyManipulator;
|
||||||
|
use Rector\Rector\AbstractRector;
|
||||||
|
use Rector\TypeDeclaration\AlreadyAssignDetector\ConstructorAssignDetector;
|
||||||
|
use Symplify\RuleDocGenerator\ValueObject\CodeSample\CodeSample;
|
||||||
|
use Symplify\RuleDocGenerator\ValueObject\RuleDefinition;
|
||||||
|
/**
|
||||||
|
* @see \Rector\Doctrine\Tests\CodeQuality\Rector\Class_\ExplicitRelationCollectionRector\ExplicitRelationCollectionRectorTest
|
||||||
|
*
|
||||||
|
* @changelog https://www.doctrine-project.org/projects/doctrine-orm/en/2.6/reference/best-practices.html#initialize-collections-in-the-constructor
|
||||||
|
*/
|
||||||
|
final class ExplicitRelationCollectionRector extends AbstractRector
|
||||||
|
{
|
||||||
|
/**
|
||||||
|
* @readonly
|
||||||
|
* @var \Rector\Doctrine\NodeAnalyzer\AttrinationFinder
|
||||||
|
*/
|
||||||
|
private $attrinationFinder;
|
||||||
|
/**
|
||||||
|
* @readonly
|
||||||
|
* @var \Rector\TypeDeclaration\AlreadyAssignDetector\ConstructorAssignDetector
|
||||||
|
*/
|
||||||
|
private $constructorAssignDetector;
|
||||||
|
/**
|
||||||
|
* @readonly
|
||||||
|
* @var \Rector\Doctrine\NodeFactory\ArrayCollectionAssignFactory
|
||||||
|
*/
|
||||||
|
private $arrayCollectionAssignFactory;
|
||||||
|
/**
|
||||||
|
* @readonly
|
||||||
|
* @var \Rector\NodeManipulator\ClassDependencyManipulator
|
||||||
|
*/
|
||||||
|
private $classDependencyManipulator;
|
||||||
|
public function __construct(AttrinationFinder $attrinationFinder, ConstructorAssignDetector $constructorAssignDetector, ArrayCollectionAssignFactory $arrayCollectionAssignFactory, ClassDependencyManipulator $classDependencyManipulator)
|
||||||
|
{
|
||||||
|
$this->attrinationFinder = $attrinationFinder;
|
||||||
|
$this->constructorAssignDetector = $constructorAssignDetector;
|
||||||
|
$this->arrayCollectionAssignFactory = $arrayCollectionAssignFactory;
|
||||||
|
$this->classDependencyManipulator = $classDependencyManipulator;
|
||||||
|
}
|
||||||
|
public function getRuleDefinition() : RuleDefinition
|
||||||
|
{
|
||||||
|
return new RuleDefinition('Use explicit collection in one-to-many relations of Doctrine entity', [new CodeSample(<<<'CODE_SAMPLE'
|
||||||
|
use Doctrine\ORM\Mapping\OneToMany;
|
||||||
|
use Doctrine\ORM\Mapping\Entity;
|
||||||
|
|
||||||
|
#[Entity]
|
||||||
|
class SomeClass
|
||||||
|
{
|
||||||
|
#[OneToMany(targetEntity: 'SomeClass')]
|
||||||
|
private $items = [];
|
||||||
|
}
|
||||||
|
CODE_SAMPLE
|
||||||
|
, <<<'CODE_SAMPLE'
|
||||||
|
use Doctrine\ORM\Mapping\Entity;
|
||||||
|
use Doctrine\ORM\Mapping\OneToMany;
|
||||||
|
use Doctrine\Common\Collections\ArrayCollection;
|
||||||
|
use Doctrine\Common\Collections\Collection;
|
||||||
|
|
||||||
|
#[Entity]
|
||||||
|
class SomeClass
|
||||||
|
{
|
||||||
|
#[OneToMany(targetEntity: 'SomeClass')]
|
||||||
|
private Collection $items;
|
||||||
|
|
||||||
|
public function __construct()
|
||||||
|
{
|
||||||
|
$this->items = new ArrayCollection();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
CODE_SAMPLE
|
||||||
|
)]);
|
||||||
|
}
|
||||||
|
/**
|
||||||
|
* @return array<class-string<Node>>
|
||||||
|
*/
|
||||||
|
public function getNodeTypes() : array
|
||||||
|
{
|
||||||
|
return [Class_::class];
|
||||||
|
}
|
||||||
|
/**
|
||||||
|
* @param Class_ $node
|
||||||
|
*/
|
||||||
|
public function refactor(Node $node) : ?Node
|
||||||
|
{
|
||||||
|
if (!$this->attrinationFinder->hasByOne($node, 'Doctrine\\ORM\\Mapping\\Entity')) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
$arrayCollectionAssigns = [];
|
||||||
|
foreach ($node->getProperties() as $property) {
|
||||||
|
if (!$this->attrinationFinder->hasByMany($property, ['Doctrine\\ORM\\Mapping\\OneToMany', 'Doctrine\\ORM\\Mapping\\ManyToMany'])) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
// make sure has collection
|
||||||
|
if (!$property->type instanceof Node) {
|
||||||
|
$property->type = new FullyQualified('Doctrine\\Common\\Collections\\Collection');
|
||||||
|
}
|
||||||
|
// make sure is null
|
||||||
|
if ($property->props[0]->default instanceof Expr) {
|
||||||
|
$property->props[0]->default = null;
|
||||||
|
}
|
||||||
|
/** @var string $propertyName */
|
||||||
|
$propertyName = $this->getName($property);
|
||||||
|
if ($this->constructorAssignDetector->isPropertyAssigned($node, $propertyName)) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
$arrayCollectionAssigns[] = $this->arrayCollectionAssignFactory->createFromPropertyName($propertyName);
|
||||||
|
// make sure it is initialized in constructor
|
||||||
|
}
|
||||||
|
if ($arrayCollectionAssigns === []) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
$this->classDependencyManipulator->addStmtsToConstructorIfNotThereYet($node, $arrayCollectionAssigns);
|
||||||
|
return $node;
|
||||||
|
}
|
||||||
|
}
|
|
@ -17,6 +17,8 @@ use Symplify\RuleDocGenerator\ValueObject\RuleDefinition;
|
||||||
* @see https://www.doctrine-project.org/projects/doctrine-orm/en/2.6/reference/best-practices.html#initialize-collections-in-the-constructor
|
* @see https://www.doctrine-project.org/projects/doctrine-orm/en/2.6/reference/best-practices.html#initialize-collections-in-the-constructor
|
||||||
*
|
*
|
||||||
* @see \Rector\Doctrine\Tests\CodeQuality\Rector\Class_\InitializeDefaultEntityCollectionRector\InitializeDefaultEntityCollectionRectorTest
|
* @see \Rector\Doctrine\Tests\CodeQuality\Rector\Class_\InitializeDefaultEntityCollectionRector\InitializeDefaultEntityCollectionRectorTest
|
||||||
|
*
|
||||||
|
* @deprecated This rule can create incomplete assign of object to an array. Use the @see \Rector\Doctrine\CodeQuality\Rector\Class_\ExplicitRelationCollectionRector instead.
|
||||||
*/
|
*/
|
||||||
final class InitializeDefaultEntityCollectionRector extends AbstractRector
|
final class InitializeDefaultEntityCollectionRector extends AbstractRector
|
||||||
{
|
{
|
||||||
|
@ -41,7 +43,7 @@ final class InitializeDefaultEntityCollectionRector extends AbstractRector
|
||||||
*/
|
*/
|
||||||
private $constructorAssignDetector;
|
private $constructorAssignDetector;
|
||||||
/**
|
/**
|
||||||
* @var class-string[]
|
* @var string[]
|
||||||
*/
|
*/
|
||||||
private const TO_MANY_ANNOTATION_CLASSES = ['Doctrine\\ORM\\Mapping\\OneToMany', 'Doctrine\\ORM\\Mapping\\ManyToMany'];
|
private const TO_MANY_ANNOTATION_CLASSES = ['Doctrine\\ORM\\Mapping\\OneToMany', 'Doctrine\\ORM\\Mapping\\ManyToMany'];
|
||||||
public function __construct(ClassDependencyManipulator $classDependencyManipulator, ArrayCollectionAssignFactory $arrayCollectionAssignFactory, AttrinationFinder $attrinationFinder, ConstructorAssignDetector $constructorAssignDetector)
|
public function __construct(ClassDependencyManipulator $classDependencyManipulator, ArrayCollectionAssignFactory $arrayCollectionAssignFactory, AttrinationFinder $attrinationFinder, ConstructorAssignDetector $constructorAssignDetector)
|
||||||
|
@ -103,7 +105,13 @@ CODE_SAMPLE
|
||||||
if (!$this->attrinationFinder->hasByOne($node, 'Doctrine\\ORM\\Mapping\\Entity')) {
|
if (!$this->attrinationFinder->hasByOne($node, 'Doctrine\\ORM\\Mapping\\Entity')) {
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
return $this->refactorClass($node);
|
$toManyPropertyNames = $this->resolveToManyPropertyNames($node);
|
||||||
|
if ($toManyPropertyNames === []) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
$assigns = $this->createAssignsOfArrayCollectionsForPropertyNames($toManyPropertyNames);
|
||||||
|
$this->classDependencyManipulator->addStmtsToConstructorIfNotThereYet($node, $assigns);
|
||||||
|
return $node;
|
||||||
}
|
}
|
||||||
/**
|
/**
|
||||||
* @return string[]
|
* @return string[]
|
||||||
|
@ -139,14 +147,4 @@ CODE_SAMPLE
|
||||||
}
|
}
|
||||||
return $assigns;
|
return $assigns;
|
||||||
}
|
}
|
||||||
private function refactorClass(Class_ $class) : ?\PhpParser\Node\Stmt\Class_
|
|
||||||
{
|
|
||||||
$toManyPropertyNames = $this->resolveToManyPropertyNames($class);
|
|
||||||
if ($toManyPropertyNames === []) {
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
$assigns = $this->createAssignsOfArrayCollectionsForPropertyNames($toManyPropertyNames);
|
|
||||||
$this->classDependencyManipulator->addStmtsToConstructorIfNotThereYet($class, $assigns);
|
|
||||||
return $class;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -18,6 +18,7 @@ use Symplify\RuleDocGenerator\ValueObject\CodeSample\CodeSample;
|
||||||
use Symplify\RuleDocGenerator\ValueObject\RuleDefinition;
|
use Symplify\RuleDocGenerator\ValueObject\RuleDefinition;
|
||||||
/**
|
/**
|
||||||
* @see \Rector\Doctrine\Tests\CodeQuality\Rector\Property\TypedPropertyFromDoctrineCollectionRector\TypedPropertyFromDoctrineCollectionRectorTest
|
* @see \Rector\Doctrine\Tests\CodeQuality\Rector\Property\TypedPropertyFromDoctrineCollectionRector\TypedPropertyFromDoctrineCollectionRectorTest
|
||||||
|
* @deprecated Use more complete \Rector\Doctrine\CodeQuality\Rector\Class_\ExplicitRelationCollectionRector instead
|
||||||
*/
|
*/
|
||||||
final class TypedPropertyFromDoctrineCollectionRector extends AbstractRector implements MinPhpVersionInterface
|
final class TypedPropertyFromDoctrineCollectionRector extends AbstractRector implements MinPhpVersionInterface
|
||||||
{
|
{
|
||||||
|
|
|
@ -32,8 +32,6 @@ final class AttrinationFinder
|
||||||
$this->attributeFinder = $attributeFinder;
|
$this->attributeFinder = $attributeFinder;
|
||||||
}
|
}
|
||||||
/**
|
/**
|
||||||
* @api
|
|
||||||
* @param class-string $name
|
|
||||||
* @param \PhpParser\Node\Stmt\Property|\PhpParser\Node\Stmt\Class_|\PhpParser\Node\Stmt\ClassMethod|\PhpParser\Node\Param $node
|
* @param \PhpParser\Node\Stmt\Property|\PhpParser\Node\Stmt\Class_|\PhpParser\Node\Stmt\ClassMethod|\PhpParser\Node\Param $node
|
||||||
* @return \Rector\BetterPhpDocParser\PhpDoc\DoctrineAnnotationTagValueNode|\PhpParser\Node\Attribute|null
|
* @return \Rector\BetterPhpDocParser\PhpDoc\DoctrineAnnotationTagValueNode|\PhpParser\Node\Attribute|null
|
||||||
*/
|
*/
|
||||||
|
@ -46,7 +44,6 @@ final class AttrinationFinder
|
||||||
return $this->attributeFinder->findAttributeByClass($node, $name);
|
return $this->attributeFinder->findAttributeByClass($node, $name);
|
||||||
}
|
}
|
||||||
/**
|
/**
|
||||||
* @param class-string $name
|
|
||||||
* @param \PhpParser\Node\Stmt\Property|\PhpParser\Node\Stmt\Class_|\PhpParser\Node\Stmt\ClassMethod|\PhpParser\Node\Param $node
|
* @param \PhpParser\Node\Stmt\Property|\PhpParser\Node\Stmt\Class_|\PhpParser\Node\Stmt\ClassMethod|\PhpParser\Node\Param $node
|
||||||
*/
|
*/
|
||||||
public function hasByOne($node, string $name) : bool
|
public function hasByOne($node, string $name) : bool
|
||||||
|
@ -59,15 +56,15 @@ final class AttrinationFinder
|
||||||
return $attribute instanceof Attribute;
|
return $attribute instanceof Attribute;
|
||||||
}
|
}
|
||||||
/**
|
/**
|
||||||
* @param class-string[] $names
|
* @param string[] $classNames
|
||||||
*/
|
*/
|
||||||
public function hasByMany(Property $property, array $names) : bool
|
public function hasByMany(Property $property, array $classNames) : bool
|
||||||
{
|
{
|
||||||
$phpDocInfo = $this->phpDocInfoFactory->createFromNode($property);
|
$phpDocInfo = $this->phpDocInfoFactory->createFromNode($property);
|
||||||
if ($phpDocInfo instanceof PhpDocInfo && $phpDocInfo->hasByAnnotationClasses($names)) {
|
if ($phpDocInfo instanceof PhpDocInfo && $phpDocInfo->hasByAnnotationClasses($classNames)) {
|
||||||
return \true;
|
return \true;
|
||||||
}
|
}
|
||||||
$attribute = $this->attributeFinder->findAttributeByClasses($property, $names);
|
$attribute = $this->attributeFinder->findAttributeByClasses($property, $classNames);
|
||||||
return $attribute instanceof Attribute;
|
return $attribute instanceof Attribute;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue
Block a user