Skip to content

Commit 97eb222

Browse files
authored
[DX] Type of class method/class const cannot be checked, use Class_ instead (#6281)
* improve WrapReturnRector to hook directly the class * Make ChangeConstantVisibilityRector hook to class to detect type easily * object type on class method or class const cannot be checked, add warning * Remove ClassMethodOrClassConstTypeResolver as unused
1 parent 13f3067 commit 97eb222

File tree

5 files changed

+54
-69
lines changed

5 files changed

+54
-69
lines changed

rules/Transform/Rector/ClassMethod/WrapReturnRector.php

Lines changed: 19 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@
88
use PhpParser\Node\Expr;
99
use PhpParser\Node\Expr\Array_;
1010
use PhpParser\Node\Expr\ArrayItem;
11+
use PhpParser\Node\Stmt\Class_;
1112
use PhpParser\Node\Stmt\ClassMethod;
1213
use PhpParser\Node\Stmt\Return_;
1314
use Rector\Contract\Rector\ConfigurableRectorInterface;
@@ -61,28 +62,37 @@ public function getItem()
6162
*/
6263
public function getNodeTypes(): array
6364
{
64-
return [ClassMethod::class];
65+
return [Class_::class];
6566
}
6667

6768
/**
68-
* @param ClassMethod $node
69+
* @param Class_ $node
6970
*/
7071
public function refactor(Node $node): ?Node
7172
{
72-
foreach ($this->typeMethodWraps as $typeMethodWrap) {
73-
if (! $this->isName($node, $typeMethodWrap->getMethod())) {
74-
continue;
75-
}
73+
$hasChanged = false;
7674

75+
foreach ($this->typeMethodWraps as $typeMethodWrap) {
7776
if (! $this->isObjectType($node, $typeMethodWrap->getObjectType())) {
7877
continue;
7978
}
8079

81-
if ($node->stmts === null) {
82-
continue;
80+
foreach ($node->getMethods() as $classMethod) {
81+
if (! $this->isName($classMethod, $typeMethodWrap->getMethod())) {
82+
continue;
83+
}
84+
85+
if ($node->stmts === null) {
86+
continue;
87+
}
88+
89+
$this->wrap($classMethod, $typeMethodWrap->isArrayWrap());
90+
$hasChanged = true;
8391
}
92+
}
8493

85-
return $this->wrap($node, $typeMethodWrap->isArrayWrap());
94+
if ($hasChanged) {
95+
return $node;
8696
}
8797

8898
return null;

rules/Visibility/Rector/ClassConst/ChangeConstantVisibilityRector.php

Lines changed: 19 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,8 @@
55
namespace Rector\Visibility\Rector\ClassConst;
66

77
use PhpParser\Node;
8-
use PhpParser\Node\Stmt\ClassConst;
8+
use PhpParser\Node\Stmt\Class_;
9+
use PhpParser\Node\Stmt\Interface_;
910
use Rector\Contract\Rector\ConfigurableRectorInterface;
1011
use Rector\Privatization\NodeManipulator\VisibilityManipulator;
1112
use Rector\Rector\AbstractRector;
@@ -71,25 +72,35 @@ class MyClass extends FrameworkClass
7172
*/
7273
public function getNodeTypes(): array
7374
{
74-
return [ClassConst::class];
75+
return [Class_::class, Interface_::class];
7576
}
7677

7778
/**
78-
* @param ClassConst $node
79+
* @param Class_|Interface_ $node
7980
*/
8081
public function refactor(Node $node): ?Node
8182
{
82-
foreach ($this->classConstantVisibilityChanges as $classConstantVisibilityChange) {
83-
if (! $this->isName($node, $classConstantVisibilityChange->getConstant())) {
84-
continue;
85-
}
83+
$hasChanged = false;
8684

85+
foreach ($this->classConstantVisibilityChanges as $classConstantVisibilityChange) {
8786
if (! $this->isObjectType($node, $classConstantVisibilityChange->getObjectType())) {
8887
continue;
8988
}
9089

91-
$this->visibilityManipulator->changeNodeVisibility($node, $classConstantVisibilityChange->getVisibility());
90+
foreach ($node->getConstants() as $classConst) {
91+
if (! $this->isName($classConst, $classConstantVisibilityChange->getConstant())) {
92+
continue;
93+
}
94+
95+
$this->visibilityManipulator->changeNodeVisibility(
96+
$classConst,
97+
$classConstantVisibilityChange->getVisibility()
98+
);
99+
$hasChanged = true;
100+
}
101+
}
92102

103+
if ($hasChanged) {
93104
return $node;
94105
}
95106

src/DependencyInjection/LazyContainerFactory.php

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -79,7 +79,6 @@
7979
use Rector\NodeTypeResolver\NodeTypeResolver\CastTypeResolver;
8080
use Rector\NodeTypeResolver\NodeTypeResolver\ClassAndInterfaceTypeResolver;
8181
use Rector\NodeTypeResolver\NodeTypeResolver\ClassConstFetchTypeResolver;
82-
use Rector\NodeTypeResolver\NodeTypeResolver\ClassMethodOrClassConstTypeResolver;
8382
use Rector\NodeTypeResolver\NodeTypeResolver\IdentifierTypeResolver;
8483
use Rector\NodeTypeResolver\NodeTypeResolver\NameTypeResolver;
8584
use Rector\NodeTypeResolver\NodeTypeResolver\NewTypeResolver;
@@ -335,7 +334,6 @@ final class LazyContainerFactory
335334
CastTypeResolver::class,
336335
StaticCallMethodCallTypeResolver::class,
337336
ClassAndInterfaceTypeResolver::class,
338-
ClassMethodOrClassConstTypeResolver::class,
339337
IdentifierTypeResolver::class,
340338
NameTypeResolver::class,
341339
NewTypeResolver::class,

src/NodeTypeResolver/NodeTypeResolver.php

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,8 @@
1616
use PhpParser\Node\Expr\Ternary;
1717
use PhpParser\Node\NullableType;
1818
use PhpParser\Node\Scalar\String_;
19+
use PhpParser\Node\Stmt\ClassConst;
20+
use PhpParser\Node\Stmt\ClassMethod;
1921
use PhpParser\Node\UnionType as NodeUnionType;
2022
use PHPStan\Analyser\Scope;
2123
use PHPStan\Broker\ClassAutoloadingException;
@@ -36,6 +38,7 @@
3638
use PHPStan\Type\TypeWithClassName;
3739
use PHPStan\Type\UnionType;
3840
use Rector\Configuration\RenamedClassesDataCollector;
41+
use Rector\Exception\ShouldNotHappenException;
3942
use Rector\NodeAnalyzer\ClassAnalyzer;
4043
use Rector\NodeTypeResolver\Contract\NodeTypeResolverAwareInterface;
4144
use Rector\NodeTypeResolver\Contract\NodeTypeResolverInterface;
@@ -98,6 +101,19 @@ public function isObjectType(Node $node, ObjectType $requiredObjectType): bool
98101
return false;
99102
}
100103

104+
// warn about invalid use of this method
105+
if ($node instanceof ClassMethod) {
106+
throw new ShouldNotHappenException(
107+
'ClassMethod itself does not have any type. Check the Class_/Interface/Trait_ node instead'
108+
);
109+
}
110+
111+
if ($node instanceof ClassConst) {
112+
throw new ShouldNotHappenException(
113+
'Class constant itself does not have any type. Check the Class_/Trait_ instead'
114+
);
115+
}
116+
101117
$resolvedType = $this->getType($node);
102118
if ($resolvedType instanceof MixedType) {
103119
return false;

src/NodeTypeResolver/NodeTypeResolver/ClassMethodOrClassConstTypeResolver.php

Lines changed: 0 additions & 50 deletions
This file was deleted.

0 commit comments

Comments
 (0)