Skip to content

Commit 74ca8d8

Browse files
committed
skip nested calls
1 parent 03885c6 commit 74ca8d8

File tree

11 files changed

+122
-24
lines changed

11 files changed

+122
-24
lines changed
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,40 @@
1+
<?php
2+
3+
namespace Rector\Doctrine\Tests\CodeQuality\Rector\Class_\GetRepositoryServiceLocatorToRepositoryServiceInjectionRector\Fixture;
4+
5+
use Doctrine\ODM\MongoDB\DocumentManager;
6+
use Rector\Doctrine\Tests\CodeQuality\Rector\Class_\GetRepositoryServiceLocatorToRepositoryServiceInjectionRector\Source\Entity\SomeEntityUsingService;
7+
8+
final class GetODMRepositoryOnService
9+
{
10+
public function run(DocumentManager $entityManager)
11+
{
12+
$someRepository = $entityManager->getRepository(SomeEntityUsingService::class);
13+
14+
return $someRepository->find(1);
15+
}
16+
}
17+
18+
?>
19+
-----
20+
<?php
21+
22+
namespace Rector\Doctrine\Tests\CodeQuality\Rector\Class_\GetRepositoryServiceLocatorToRepositoryServiceInjectionRector\Fixture;
23+
24+
use Doctrine\ODM\MongoDB\DocumentManager;
25+
use Rector\Doctrine\Tests\CodeQuality\Rector\Class_\GetRepositoryServiceLocatorToRepositoryServiceInjectionRector\Source\Entity\SomeEntityUsingService;
26+
27+
final class GetODMRepositoryOnService
28+
{
29+
public function __construct(private readonly \Rector\Doctrine\Tests\CodeQuality\Rector\Class_\GetRepositoryServiceLocatorToRepositoryServiceInjectionRector\Source\SomeServiceRepository $someEntityUsingServiceRepository)
30+
{
31+
}
32+
public function run(DocumentManager $entityManager)
33+
{
34+
$someRepository = $this->someEntityUsingServiceRepository;
35+
36+
return $someRepository->find(1);
37+
}
38+
}
39+
40+
?>

rules-tests/CodeQuality/Rector/Class_/GetRepositoryServiceLocatorToRepositoryServiceInjectionRector/Fixture/get_repository_on_service.php.inc

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -3,13 +3,13 @@
33
namespace Rector\Doctrine\Tests\CodeQuality\Rector\Class_\GetRepositoryServiceLocatorToRepositoryServiceInjectionRector\Fixture;
44

55
use Doctrine\ORM\EntityManagerInterface;
6-
use Rector\Doctrine\Tests\CodeQuality\Rector\Class_\GetRepositoryServiceLocatorToRepositoryServiceInjectionRector\Source\SomeEntityUsingService;
6+
use Rector\Doctrine\Tests\CodeQuality\Rector\Class_\GetRepositoryServiceLocatorToRepositoryServiceInjectionRector\Source\Entity\SomeEntityUsingORMService;
77

88
final class GetRepositoryOnService
99
{
1010
public function run(EntityManagerInterface $entityManager)
1111
{
12-
$someRepository = $entityManager->getRepository(SomeEntityUsingService::class);
12+
$someRepository = $entityManager->getRepository(SomeEntityUsingORMService::class);
1313

1414
return $someRepository->find(1);
1515
}
@@ -22,16 +22,16 @@ final class GetRepositoryOnService
2222
namespace Rector\Doctrine\Tests\CodeQuality\Rector\Class_\GetRepositoryServiceLocatorToRepositoryServiceInjectionRector\Fixture;
2323

2424
use Doctrine\ORM\EntityManagerInterface;
25-
use Rector\Doctrine\Tests\CodeQuality\Rector\Class_\GetRepositoryServiceLocatorToRepositoryServiceInjectionRector\Source\SomeEntityUsingService;
25+
use Rector\Doctrine\Tests\CodeQuality\Rector\Class_\GetRepositoryServiceLocatorToRepositoryServiceInjectionRector\Source\Entity\SomeEntityUsingORMService;
2626

2727
final class GetRepositoryOnService
2828
{
29-
public function __construct(private readonly \Rector\Doctrine\Tests\CodeQuality\Rector\Class_\GetRepositoryServiceLocatorToRepositoryServiceInjectionRector\Source\SomeServiceRepository $someEntityUsingServiceRepository)
29+
public function __construct(private readonly \Rector\Doctrine\Tests\CodeQuality\Rector\Class_\GetRepositoryServiceLocatorToRepositoryServiceInjectionRector\Source\SomeORMServiceRepository $someEntityUsingORMServiceRepository)
3030
{
3131
}
3232
public function run(EntityManagerInterface $entityManager)
3333
{
34-
$someRepository = $this->someEntityUsingServiceRepository;
34+
$someRepository = $this->someEntityUsingORMServiceRepository;
3535

3636
return $someRepository->find(1);
3737
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
<?php
2+
3+
namespace Rector\Doctrine\Tests\CodeQuality\Rector\Class_\GetRepositoryServiceLocatorToRepositoryServiceInjectionRector\Fixture;
4+
5+
use Doctrine\ORM\EntityManagerInterface;
6+
use Doctrine\ORM\EntityRepository;
7+
use Rector\Doctrine\Tests\CodeQuality\Rector\Class_\GetRepositoryServiceLocatorToRepositoryServiceInjectionRector\Source\Entity\SomeEntityUsingService;
8+
9+
final class SkipInsideRepository extends EntityRepository
10+
{
11+
public function run(EntityManagerInterface $entityManager)
12+
{
13+
$someRepository = $entityManager->getRepository(SomeEntityUsingService::class);
14+
}
15+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
<?php
2+
3+
namespace Rector\Doctrine\Tests\CodeQuality\Rector\Class_\GetRepositoryServiceLocatorToRepositoryServiceInjectionRector\Source\Entity;
4+
5+
/**
6+
* @ORM\Entity(repositoryClass="Rector\Doctrine\Tests\CodeQuality\Rector\Class_\GetRepositoryServiceLocatorToRepositoryServiceInjectionRector\Source\SomeORMServiceRepository")
7+
*/
8+
class SomeEntityUsingORMService
9+
{
10+
11+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
<?php
2+
3+
namespace Rector\Doctrine\Tests\CodeQuality\Rector\Class_\GetRepositoryServiceLocatorToRepositoryServiceInjectionRector\Source\Entity;
4+
5+
use Rector\Doctrine\Tests\CodeQuality\Rector\Class_\GetRepositoryServiceLocatorToRepositoryServiceInjectionRector\Source\SomeServiceRepository;
6+
7+
/**
8+
* @ORM\Entity(repositoryClass=SomeServiceRepository::class)
9+
*/
10+
class SomeEntityUsingService
11+
{
12+
}

rules-tests/CodeQuality/Rector/Class_/GetRepositoryServiceLocatorToRepositoryServiceInjectionRector/Source/SomeEntityUsingService.php

Lines changed: 0 additions & 11 deletions
This file was deleted.
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
<?php
2+
3+
namespace Rector\Doctrine\Tests\CodeQuality\Rector\Class_\GetRepositoryServiceLocatorToRepositoryServiceInjectionRector\Source;
4+
5+
use Doctrine\Bundle\DoctrineBundle\Repository\ServiceEntityRepository;
6+
7+
final class SomeORMServiceRepository extends ServiceEntityRepository
8+
{
9+
10+
}

rules-tests/CodeQuality/Rector/Class_/GetRepositoryServiceLocatorToRepositoryServiceInjectionRector/Source/SomeServiceRepository.php

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44

55
use Doctrine\Bundle\MongoDBBundle\Repository\ServiceDocumentRepository;
66

7-
class SomeServiceRepository extends ServiceDocumentRepository
7+
final class SomeServiceRepository extends ServiceDocumentRepository
88
{
99

1010
}

rules/CodeQuality/Enum/DoctrineClass.php

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,16 @@
1616
*/
1717
public const SERVICE_DOCUMENT_REPOSITORY = 'Doctrine\Bundle\MongoDBBundle\Repository\ServiceDocumentRepository';
1818

19+
/**
20+
* @var string
21+
*/
22+
public const SERVICE_ENTITY_REPOSITORY = 'Doctrine\Bundle\DoctrineBundle\Repository\ServiceEntityRepository';
23+
24+
/**
25+
* @var string
26+
*/
27+
public const ENTITY_REPOSITORY = 'Doctrine\ORM\EntityRepository';
28+
1929
/**
2030
* @var string
2131
*/

rules/CodeQuality/Rector/Class_/GetRepositoryServiceLocatorToRepositoryServiceInjectionRector.php

Lines changed: 17 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -4,12 +4,14 @@
44

55
namespace Rector\Doctrine\CodeQuality\Rector\Class_;
66

7+
use PhpParser\Node\Stmt\Function_;
78
use PhpParser\Node;
89
use PhpParser\Node\Expr\MethodCall;
910
use PhpParser\Node\Expr\PropertyFetch;
1011
use PhpParser\Node\Expr\Variable;
1112
use PhpParser\Node\Identifier;
1213
use PhpParser\Node\Stmt\Class_;
14+
use PhpParser\NodeVisitor;
1315
use PHPStan\Reflection\ClassReflection;
1416
use PHPStan\Reflection\ReflectionProvider;
1517
use Rector\Doctrine\CodeQuality\Enum\DoctrineClass;
@@ -112,9 +114,14 @@ public function refactor(Node $node): ?Class_
112114

113115
$repositoryPropertyMetadatas = [];
114116

115-
$this->traverseNodesWithCallable($node, function (Node $node) use (
117+
$this->traverseNodesWithCallable($node->stmts, function (Node $node) use (
116118
&$repositoryPropertyMetadatas
117-
): ?PropertyFetch {
119+
): PropertyFetch|int|null {
120+
if ($node instanceof Class_ || $node instanceof Function_) {
121+
// avoid nested anonymous class or function
122+
return NodeVisitor::DONT_TRAVERSE_CURRENT_AND_CHILDREN;
123+
}
124+
118125
if (! $node instanceof MethodCall) {
119126
return null;
120127
}
@@ -143,15 +150,17 @@ public function refactor(Node $node): ?Class_
143150
$repositoryVariableName = $this->propertyNaming->fqnToVariableName($entityClassName) . 'Repository';
144151

145152
$repositoryClass = $this->repositoryClassResolver->resolveFromEntityClass($entityClassName);
153+
146154
// unable to resolve
147155
if (! is_string($repositoryClass)) {
148156
return null;
149157
}
150158

151159
$repositoryClassReflection = $this->reflectionProvider->getClass($repositoryClass);
152160

153-
// @todo add ORM support
154-
if (! $repositoryClassReflection->isSubclassOf(DoctrineClass::SERVICE_DOCUMENT_REPOSITORY)) {
161+
if (! $repositoryClassReflection->isSubclassOf(
162+
DoctrineClass::SERVICE_DOCUMENT_REPOSITORY
163+
) && ! $repositoryClassReflection->isSubclassOf(DoctrineClass::SERVICE_ENTITY_REPOSITORY)) {
155164
return null;
156165
}
157166

@@ -193,6 +202,10 @@ private function shouldSkipClass(Class_ $class): bool
193202
return true;
194203
}
195204

205+
if ($classReflection->isSubclassOf(DoctrineClass::ENTITY_REPOSITORY)) {
206+
return true;
207+
}
208+
196209
return $classReflection->isSubclassOf(TestClass::BEHAT_CONTEXT);
197210
}
198211
}

0 commit comments

Comments
 (0)