diff --git a/config/set/cakephp-to-symfony/cakephp-24-to-symfony-51.yaml b/config/set/cakephp-to-symfony/cakephp-24-to-symfony-51.yaml
index 82381c5154cc..bb279a82188e 100644
--- a/config/set/cakephp-to-symfony/cakephp-24-to-symfony-51.yaml
+++ b/config/set/cakephp-to-symfony/cakephp-24-to-symfony-51.yaml
@@ -16,3 +16,4 @@ services:
# Model to Doctrine
Rector\CakePHPToSymfony\Rector\Class_\CakePHPModelToDoctrineEntityRector: null
Rector\CakePHPToSymfony\Rector\Class_\CakePHPModelToDoctrineRepositoryRector: null
+ Rector\CakePHPToSymfony\Rector\Class_\CakePHPImplicitRouteToExplicitRouteAnnotationRector: null
diff --git a/docs/AllRectorsOverview.md b/docs/AllRectorsOverview.md
index 162c037c565b..23375e360d53 100644
--- a/docs/AllRectorsOverview.md
+++ b/docs/AllRectorsOverview.md
@@ -1,4 +1,4 @@
-# All 444 Rectors Overview
+# All 445 Rectors Overview
- [Projects](#projects)
- [General](#general)
@@ -422,6 +422,29 @@ Migrate CakePHP 2.4 Controller to Symfony 5
+### `CakePHPImplicitRouteToExplicitRouteAnnotationRector`
+
+- class: `Rector\CakePHPToSymfony\Rector\Class_\CakePHPImplicitRouteToExplicitRouteAnnotationRector`
+
+Migrate CakePHP implicit routes to Symfony @route annotations
+
+```diff
+-class PaymentsController extends AppController
++use Symfony\Component\Routing\Annotation\Route;
++
++class AdminPaymentsController extends AppController
+ {
++ /**
++ * @Route(path="/payments/index", name="payments_index")
++ */
+ public function index()
+ {
+ }
+ }
+```
+
+
+
### `CakePHPModelToDoctrineEntityRector`
- class: `Rector\CakePHPToSymfony\Rector\Class_\CakePHPModelToDoctrineEntityRector`
diff --git a/ecs.yaml b/ecs.yaml
index d6348df7e65d..cc301d948937 100644
--- a/ecs.yaml
+++ b/ecs.yaml
@@ -49,7 +49,7 @@ parameters:
PHP_CodeSniffer\Standards\PSR2\Sniffs\Methods\MethodDeclarationSniff.Underscore: null
Symplify\CodingStandard\Sniffs\Architecture\DuplicatedClassShortNameSniff: null
# skip temporary due to missing "import" feature in PhpStorm
- SlevomatCodingStandard\Sniffs\Namespaces\ReferenceUsedNamesOnlySniff.PartialUse: null
+# SlevomatCodingStandard\Sniffs\Namespaces\ReferenceUsedNamesOnlySniff.PartialUse: null
# run manually from time to time - performance demanding + not to bother user with it
Symplify\CodingStandard\Fixer\Order\PropertyOrderByComplexityFixer: null
@@ -173,4 +173,8 @@ parameters:
# part of the comparison logic
- 'packages/Polyfill/src/ConditionEvaluator.php'
+ SlevomatCodingStandard\Sniffs\Namespaces\ReferenceUsedNamesOnlySniff.PartialUse:
+ - "packages/DeadCode/src/Rector/Plus/RemoveDeadZeroAndOneOperationRector.php"
+ - "packages/Php56/src/Rector/FunctionLike/AddDefaultValueForUndefinedVariableRector.php"
+
line_ending: "\n"
diff --git a/packages/BetterPhpDocParser/src/Printer/PhpDocInfoPrinter.php b/packages/BetterPhpDocParser/src/Printer/PhpDocInfoPrinter.php
index 3e27f9117359..b15060faabe9 100644
--- a/packages/BetterPhpDocParser/src/Printer/PhpDocInfoPrinter.php
+++ b/packages/BetterPhpDocParser/src/Printer/PhpDocInfoPrinter.php
@@ -102,7 +102,7 @@ public function printFormatPreserving(PhpDocInfo $phpDocInfo, bool $shouldSkipEm
return $this->printPhpDocNode($this->attributeAwarePhpDocNode, $shouldSkipEmptyLinesAbove);
}
- public function printPhpDocNode(
+ private function printPhpDocNode(
AttributeAwarePhpDocNode $attributeAwarePhpDocNode,
bool $shouldSkipEmptyLinesAbove = false
): string {
diff --git a/packages/CakePHPToSymfony/src/Rector/Class_/CakePHPImplicitRouteToExplicitRouteAnnotationRector.php b/packages/CakePHPToSymfony/src/Rector/Class_/CakePHPImplicitRouteToExplicitRouteAnnotationRector.php
new file mode 100644
index 000000000000..7acf08db73b4
--- /dev/null
+++ b/packages/CakePHPToSymfony/src/Rector/Class_/CakePHPImplicitRouteToExplicitRouteAnnotationRector.php
@@ -0,0 +1,121 @@
+isInCakePHPController($node)) {
+ return null;
+ }
+
+ foreach ($node->getMethods() as $classMethod) {
+ if (! $classMethod->isPublic()) {
+ continue;
+ }
+
+ /** @var string $className */
+ $className = $node->getAttribute(AttributeKey::CLASS_NAME);
+ $shortClassName = $this->getShortName($className);
+
+ $methodName = $this->getName($classMethod);
+
+ $combined = RectorStrings::removeSuffixes($shortClassName, ['Controller']) . '/' . $methodName;
+ $path = '/' . RectorStrings::camelCaseToSlashes($combined);
+ $name = RectorStrings::camelCaseToUnderscore($combined);
+
+ $symfonyRoutePhpDocTagValueNode = $this->createSymfonyRoutePhpDocTagValueNode($path, $name);
+ $this->addSymfonyRouteShortTagNodeWithUse($symfonyRoutePhpDocTagValueNode, $classMethod);
+ }
+
+ return $node;
+ }
+
+ private function createSymfonyRoutePhpDocTagValueNode(string $path, string $name): SymfonyRouteTagValueNode
+ {
+ return new SymfonyRouteTagValueNode($path, $name);
+ }
+
+ /**
+ * @todo reuse from RouterListToControllerAnnotationsRector
+ */
+ private function addSymfonyRouteShortTagNodeWithUse(
+ SymfonyRouteTagValueNode $symfonyRouteTagValueNode,
+ ClassMethod $classMethod
+ ): void {
+ // @todo use empty phpdoc info
+ $this->docBlockManipulator->addTagValueNodeWithShortName($classMethod, $symfonyRouteTagValueNode);
+
+ $symfonyRouteUseObjectType = new FullyQualifiedObjectType(SymfonyRouteTagValueNode::CLASS_NAME);
+ $this->addUseType($symfonyRouteUseObjectType, $classMethod);
+
+ $classMethod->setAttribute(self::HAS_FRESH_ROUTE_ANNOTATION_ATTRIBUTE, true);
+ }
+}
diff --git a/packages/CakePHPToSymfony/tests/Rector/Class_/CakePHPImplicitRouteToExplicitRouteAnnotationRector/CakePHPImplicitRouteToExplicitRouteAnnotationRectorTest.php b/packages/CakePHPToSymfony/tests/Rector/Class_/CakePHPImplicitRouteToExplicitRouteAnnotationRector/CakePHPImplicitRouteToExplicitRouteAnnotationRectorTest.php
new file mode 100644
index 000000000000..deada2acad3a
--- /dev/null
+++ b/packages/CakePHPToSymfony/tests/Rector/Class_/CakePHPImplicitRouteToExplicitRouteAnnotationRector/CakePHPImplicitRouteToExplicitRouteAnnotationRectorTest.php
@@ -0,0 +1,30 @@
+doTestFile($file);
+ }
+
+ public function provideDataForTest(): Iterator
+ {
+ return $this->yieldFilesFromDirectory(__DIR__ . '/Fixture');
+ }
+
+ protected function getRectorClass(): string
+ {
+ return CakePHPImplicitRouteToExplicitRouteAnnotationRector::class;
+ }
+}
diff --git a/packages/CakePHPToSymfony/tests/Rector/Class_/CakePHPImplicitRouteToExplicitRouteAnnotationRector/Fixture/fixture.php.inc b/packages/CakePHPToSymfony/tests/Rector/Class_/CakePHPImplicitRouteToExplicitRouteAnnotationRector/Fixture/fixture.php.inc
new file mode 100644
index 000000000000..eda68284dd3a
--- /dev/null
+++ b/packages/CakePHPToSymfony/tests/Rector/Class_/CakePHPImplicitRouteToExplicitRouteAnnotationRector/Fixture/fixture.php.inc
@@ -0,0 +1,29 @@
+
+-----
+
diff --git a/packages/CodeQuality/src/Rector/If_/CombineIfRector.php b/packages/CodeQuality/src/Rector/If_/CombineIfRector.php
index 262cc9be70b6..e0e78bef0ba9 100644
--- a/packages/CodeQuality/src/Rector/If_/CombineIfRector.php
+++ b/packages/CodeQuality/src/Rector/If_/CombineIfRector.php
@@ -76,7 +76,7 @@ public function refactor(Node $node): ?Node
return null;
}
- /** @var Node\Stmt\If_ $subIf */
+ /** @var If_ $subIf */
$subIf = $node->stmts[0];
$node->cond = new BooleanAnd($node->cond, $subIf->cond);
$node->stmts = $subIf->stmts;
diff --git a/packages/CodeQuality/src/Rector/If_/RemoveAlwaysTrueConditionSetInConstructorRector.php b/packages/CodeQuality/src/Rector/If_/RemoveAlwaysTrueConditionSetInConstructorRector.php
index fa5bd9aa7263..59e465db6289 100644
--- a/packages/CodeQuality/src/Rector/If_/RemoveAlwaysTrueConditionSetInConstructorRector.php
+++ b/packages/CodeQuality/src/Rector/If_/RemoveAlwaysTrueConditionSetInConstructorRector.php
@@ -8,6 +8,7 @@
use PhpParser\Node\Expr\Assign;
use PhpParser\Node\Expr\Closure;
use PhpParser\Node\Expr\PropertyFetch;
+use PhpParser\Node\Stmt;
use PhpParser\Node\Stmt\Class_;
use PhpParser\Node\Stmt\ClassLike;
use PhpParser\Node\Stmt\ClassMethod;
@@ -205,7 +206,7 @@ private function resolvePropertyFetchType(PropertyFetch $propertyFetch): Type
}
/**
- * @param Node\Stmt[] $stmts
+ * @param Stmt[] $stmts
*/
private function resolveAssignedTypeInStmtsByPropertyName(array $stmts, string $propertyName): ?Type
{
diff --git a/packages/CodingStyle/src/Rector/ClassMethod/MakeInheritedMethodVisibilitySameAsParentRector.php b/packages/CodingStyle/src/Rector/ClassMethod/MakeInheritedMethodVisibilitySameAsParentRector.php
index 16858e7627a1..a98fed3606c7 100644
--- a/packages/CodingStyle/src/Rector/ClassMethod/MakeInheritedMethodVisibilitySameAsParentRector.php
+++ b/packages/CodingStyle/src/Rector/ClassMethod/MakeInheritedMethodVisibilitySameAsParentRector.php
@@ -6,6 +6,7 @@
use PhpParser\Node;
use PhpParser\Node\Expr\New_;
+use PhpParser\Node\Stmt\Class_;
use PhpParser\Node\Stmt\ClassMethod;
use PhpParser\Node\Stmt\Return_;
use PHPStan\Analyser\Scope;
@@ -139,7 +140,7 @@ private function isConstructorWithStaticFactory(ClassMethod $classMethod, string
return false;
}
- /** @var Node\Stmt\Class_|null $class */
+ /** @var Class_|null $class */
$class = $classMethod->getAttribute(AttributeKey::CLASS_NODE);
if ($class === null) {
return false;
diff --git a/packages/DeadCode/src/Rector/Plus/RemoveDeadZeroAndOneOperationRector.php b/packages/DeadCode/src/Rector/Plus/RemoveDeadZeroAndOneOperationRector.php
index 31b61346e506..8f2b16270db0 100644
--- a/packages/DeadCode/src/Rector/Plus/RemoveDeadZeroAndOneOperationRector.php
+++ b/packages/DeadCode/src/Rector/Plus/RemoveDeadZeroAndOneOperationRector.php
@@ -62,10 +62,10 @@ public function getNodeTypes(): array
Minus::class,
Mul::class,
Div::class,
- Node\Expr\AssignOp\Plus::class,
- Node\Expr\AssignOp\Minus::class,
- Node\Expr\AssignOp\Mul::class,
- Node\Expr\AssignOp\Div::class,
+ AssignOp\Plus::class,
+ AssignOp\Minus::class,
+ AssignOp\Mul::class,
+ AssignOp\Div::class,
];
}
@@ -106,7 +106,7 @@ public function refactor(Node $node): ?Node
private function processAssignOp(Node $node): ?Expr
{
// +=, -=
- if ($node instanceof Node\Expr\AssignOp\Plus || $node instanceof Node\Expr\AssignOp\Minus) {
+ if ($node instanceof AssignOp\Plus || $node instanceof AssignOp\Minus) {
if (! $this->isValue($node->expr, 0)) {
return null;
}
@@ -117,7 +117,7 @@ private function processAssignOp(Node $node): ?Expr
}
// *, /
- if ($node instanceof Node\Expr\AssignOp\Mul || $node instanceof Node\Expr\AssignOp\Div) {
+ if ($node instanceof AssignOp\Mul || $node instanceof AssignOp\Div) {
if (! $this->isValue($node->expr, 1)) {
return null;
}
diff --git a/packages/Laravel/src/Rector/Class_/InlineValidationRulesToArrayDefinitionRector.php b/packages/Laravel/src/Rector/Class_/InlineValidationRulesToArrayDefinitionRector.php
index e6aa998fb349..9cc2bdfc647c 100644
--- a/packages/Laravel/src/Rector/Class_/InlineValidationRulesToArrayDefinitionRector.php
+++ b/packages/Laravel/src/Rector/Class_/InlineValidationRulesToArrayDefinitionRector.php
@@ -179,7 +179,7 @@ private function transformConcatExpressionToSingleString(Concat $concat): ?strin
} elseif ($expressionPart instanceof Concat) {
$output .= $this->transformConcatExpressionToSingleString($expressionPart);
} elseif ($expressionPart instanceof ClassConstFetch) {
- /** @var Node\Name $name */
+ /** @var Name $name */
$name = $expressionPart->class->getAttribute('originalName');
$output .= implode('\\', $name->parts);
diff --git a/packages/Laravel/src/Rector/FuncCall/HelperFunctionToConstructorInjectionRector.php b/packages/Laravel/src/Rector/FuncCall/HelperFunctionToConstructorInjectionRector.php
index 2d05e4085d28..f1472b33bb0e 100644
--- a/packages/Laravel/src/Rector/FuncCall/HelperFunctionToConstructorInjectionRector.php
+++ b/packages/Laravel/src/Rector/FuncCall/HelperFunctionToConstructorInjectionRector.php
@@ -8,6 +8,7 @@
use PhpParser\Node\Expr\FuncCall;
use PhpParser\Node\Expr\MethodCall;
use PhpParser\Node\Stmt\Class_;
+use PhpParser\Node\Stmt\ClassMethod;
use Rector\Exception\ShouldNotHappenException;
use Rector\Laravel\FunctionToServiceMap;
use Rector\Laravel\ValueObject\ArrayFunctionToMethodCall;
@@ -144,7 +145,7 @@ private function shouldSkipFuncCall(FuncCall $funcCall): bool
return true;
}
- /** @var Node\Stmt\ClassMethod|null $classMethod */
+ /** @var ClassMethod|null $classMethod */
$classMethod = $funcCall->getAttribute(AttributeKey::METHOD_NODE);
if ($classMethod === null) {
return true;
diff --git a/packages/NodeTypeResolver/src/NodeVisitor/FunctionMethodAndClassNodeVisitor.php b/packages/NodeTypeResolver/src/NodeVisitor/FunctionMethodAndClassNodeVisitor.php
index b3facd62dc85..41b5cfd01d40 100644
--- a/packages/NodeTypeResolver/src/NodeVisitor/FunctionMethodAndClassNodeVisitor.php
+++ b/packages/NodeTypeResolver/src/NodeVisitor/FunctionMethodAndClassNodeVisitor.php
@@ -36,7 +36,7 @@ final class FunctionMethodAndClassNodeVisitor extends NodeVisitorAbstract
private $methodNode;
/**
- * @var Node\Stmt\Function_|null
+ * @var Function_|null
*/
private $functionNode;
diff --git a/packages/NodeTypeResolver/src/PerNodeTypeResolver/CastTypeResolver.php b/packages/NodeTypeResolver/src/PerNodeTypeResolver/CastTypeResolver.php
index 0780fa530e3e..165417192ead 100644
--- a/packages/NodeTypeResolver/src/PerNodeTypeResolver/CastTypeResolver.php
+++ b/packages/NodeTypeResolver/src/PerNodeTypeResolver/CastTypeResolver.php
@@ -34,7 +34,7 @@ public function getNodeClasses(): array
}
/**
- * @param Node\Expr\Cast $node
+ * @param Cast $node
*/
public function resolve(Node $node): Type
{
diff --git a/packages/NodeTypeResolver/src/PhpDoc/NodeAnalyzer/DocBlockManipulator.php b/packages/NodeTypeResolver/src/PhpDoc/NodeAnalyzer/DocBlockManipulator.php
index ebb8156b073f..883ff5519477 100644
--- a/packages/NodeTypeResolver/src/PhpDoc/NodeAnalyzer/DocBlockManipulator.php
+++ b/packages/NodeTypeResolver/src/PhpDoc/NodeAnalyzer/DocBlockManipulator.php
@@ -342,20 +342,7 @@ public function updateNodeWithPhpDocInfo(Node $node, bool $shouldSkipEmptyLinesA
return;
}
- // new node, needs to be reparsed
- if ($phpDocInfo->getPhpDocNode()->children !== [] && $phpDocInfo->getTokens() === []) {
- $phpDoc = $this->phpDocInfoPrinter->printPhpDocNode(
- $phpDocInfo->getPhpDocNode(),
- $shouldSkipEmptyLinesAbove
- );
-
- // slight correction
- if (Strings::match($phpDoc, '#^ * #m')) {
- $phpDoc = Strings::replace($phpDoc, '#\s+\*/$#m', "\n */");
- }
- } else {
- $phpDoc = $this->phpDocInfoPrinter->printFormatPreserving($phpDocInfo, $shouldSkipEmptyLinesAbove);
- }
+ $phpDoc = $this->printPhpDocInfoToString($shouldSkipEmptyLinesAbove, $phpDocInfo);
if ($phpDoc === '') {
// no comments, null
@@ -420,4 +407,14 @@ private function addTypeSpecificTag(Node $node, string $name, Type $type): void
$this->phpDocInfoFactory->createFromNode($node);
}
}
+
+ private function printPhpDocInfoToString(bool $shouldSkipEmptyLinesAbove, PhpDocInfo $phpDocInfo): string
+ {
+ // new node, needs to be reparsed
+ if ($phpDocInfo->getPhpDocNode()->children !== [] && $phpDocInfo->getTokens() === []) {
+ return (string) $phpDocInfo->getPhpDocNode();
+ }
+
+ return $this->phpDocInfoPrinter->printFormatPreserving($phpDocInfo, $shouldSkipEmptyLinesAbove);
+ }
}
diff --git a/packages/PHPStan/src/Rector/Assign/PHPStormVarAnnotationRector.php b/packages/PHPStan/src/Rector/Assign/PHPStormVarAnnotationRector.php
index 6f279f9780d3..1e0f5504309d 100644
--- a/packages/PHPStan/src/Rector/Assign/PHPStormVarAnnotationRector.php
+++ b/packages/PHPStan/src/Rector/Assign/PHPStormVarAnnotationRector.php
@@ -9,6 +9,7 @@
use PhpParser\Node;
use PhpParser\Node\Expr\Assign;
use PhpParser\Node\Expr\Variable;
+use PhpParser\Node\Stmt\Expression;
use PhpParser\Node\Stmt\Nop;
use Rector\BetterPhpDocParser\PhpDocInfo\PhpDocInfoFactory;
use Rector\NodeTypeResolver\Node\AttributeKey;
@@ -62,7 +63,7 @@ public function getNodeTypes(): array
*/
public function refactor(Node $node): ?Node
{
- /** @var Node\Stmt\Expression|null $expression */
+ /** @var Expression|null $expression */
$expression = $node->getAttribute(AttributeKey::CURRENT_STATEMENT);
// unable to analyze
diff --git a/packages/Php80/src/Rector/FunctionLike/UnionTypesRector.php b/packages/Php80/src/Rector/FunctionLike/UnionTypesRector.php
index dedbe23aa562..a4a683e1f13e 100644
--- a/packages/Php80/src/Rector/FunctionLike/UnionTypesRector.php
+++ b/packages/Php80/src/Rector/FunctionLike/UnionTypesRector.php
@@ -6,6 +6,7 @@
use PhpParser\Node;
use PhpParser\Node\Expr\ArrowFunction;
+use PhpParser\Node\Expr\Closure;
use PhpParser\Node\FunctionLike;
use PhpParser\Node\Stmt\ClassMethod;
use PhpParser\Node\Stmt\Function_;
@@ -66,7 +67,7 @@ public function getNodeTypes(): array
}
/**
- * @param ClassMethod|Function_|Node\Expr\Closure|ArrowFunction $node
+ * @param ClassMethod|Function_|Closure|ArrowFunction $node
*/
public function refactor(Node $node): ?Node
{
@@ -82,7 +83,7 @@ public function refactor(Node $node): ?Node
}
/**
- * @param ClassMethod|Function_|Node\Expr\Closure|ArrowFunction $functionLike
+ * @param ClassMethod|Function_|Closure|ArrowFunction $functionLike
*/
private function refactorReturnType(FunctionLike $functionLike, PhpDocInfo $phpDocInfo): void
{
@@ -105,7 +106,7 @@ private function refactorReturnType(FunctionLike $functionLike, PhpDocInfo $phpD
}
/**
- * @param ClassMethod|Function_|Node\Expr\Closure|ArrowFunction $functionLike
+ * @param ClassMethod|Function_|Closure|ArrowFunction $functionLike
*/
private function refactorParamTypes(FunctionLike $functionLike, PhpDocInfo $phpDocInfo): void
{
diff --git a/packages/TypeDeclaration/src/PHPStan/Type/ObjectTypeSpecifier.php b/packages/TypeDeclaration/src/PHPStan/Type/ObjectTypeSpecifier.php
index aac4d9f1d445..cd743b726922 100644
--- a/packages/TypeDeclaration/src/PHPStan/Type/ObjectTypeSpecifier.php
+++ b/packages/TypeDeclaration/src/PHPStan/Type/ObjectTypeSpecifier.php
@@ -6,6 +6,7 @@
use Nette\Utils\Strings;
use PhpParser\Node;
+use PhpParser\Node\Stmt\Use_;
use PhpParser\Node\Stmt\UseUse;
use PHPStan\Type\MixedType;
use PHPStan\Type\ObjectType;
@@ -23,7 +24,7 @@ final class ObjectTypeSpecifier
*/
public function narrowToFullyQualifiedOrAlaisedObjectType(Node $node, ObjectType $objectType): Type
{
- /** @var Node\Stmt\Use_[]|null $uses */
+ /** @var Use_[]|null $uses */
$uses = $node->getAttribute(AttributeKey::USE_NODES);
if ($uses === null) {
return $objectType;
@@ -56,7 +57,7 @@ public function narrowToFullyQualifiedOrAlaisedObjectType(Node $node, ObjectType
private function matchAliasedObjectType(Node $node, ObjectType $objectType): ?AliasedObjectType
{
- /** @var Node\Stmt\Use_[]|null $uses */
+ /** @var Use_[]|null $uses */
$uses = $node->getAttribute(AttributeKey::USE_NODES);
if ($uses === null) {
return null;
@@ -89,7 +90,7 @@ private function matchAliasedObjectType(Node $node, ObjectType $objectType): ?Al
private function matchShortenedObjectType(Node $node, ObjectType $objectType): ?ShortenedObjectType
{
- /** @var Node\Stmt\Use_[]|null $uses */
+ /** @var Use_[]|null $uses */
$uses = $node->getAttribute(AttributeKey::USE_NODES);
if ($uses === null) {
return null;
diff --git a/src/PhpParser/Node/Manipulator/ClassConstManipulator.php b/src/PhpParser/Node/Manipulator/ClassConstManipulator.php
index 4d0e5fe994cd..660850a8c8c1 100644
--- a/src/PhpParser/Node/Manipulator/ClassConstManipulator.php
+++ b/src/PhpParser/Node/Manipulator/ClassConstManipulator.php
@@ -6,6 +6,7 @@
use PhpParser\Node;
use PhpParser\Node\Expr\ClassConstFetch;
+use PhpParser\Node\Stmt\Class_;
use PhpParser\Node\Stmt\ClassConst;
use Rector\NodeContainer\ParsedNodesByType;
use Rector\NodeTypeResolver\Node\AttributeKey;
@@ -59,7 +60,7 @@ public function __construct(
*/
public function getAllClassConstFetch(ClassConst $classConst): array
{
- /** @var Node\Stmt\Class_|null $classNode */
+ /** @var Class_|null $classNode */
$classNode = $classConst->getAttribute(AttributeKey::CLASS_NODE);
if ($classNode === null) {
return [];
diff --git a/src/PhpParser/Node/Manipulator/PropertyManipulator.php b/src/PhpParser/Node/Manipulator/PropertyManipulator.php
index 28c48227b36b..d18fc1a5ff1b 100644
--- a/src/PhpParser/Node/Manipulator/PropertyManipulator.php
+++ b/src/PhpParser/Node/Manipulator/PropertyManipulator.php
@@ -9,6 +9,7 @@
use PhpParser\Node\Expr\PropertyFetch;
use PhpParser\Node\Expr\StaticPropertyFetch;
use PhpParser\Node\Stmt\Class_;
+use PhpParser\Node\Stmt\ClassLike;
use PhpParser\Node\Stmt\Property;
use PhpParser\Node\Stmt\PropertyProperty;
use Rector\BetterPhpDocParser\PhpDocNode\JMS\SerializerTypeTagValueNode;
@@ -132,7 +133,7 @@ public function isPropertyUsedInReadContext(PropertyProperty $propertyProperty):
}
// has class $this->$variable call?
- /** @var Node\Stmt\ClassLike $class */
+ /** @var ClassLike $class */
$class = $propertyProperty->getAttribute(AttributeKey::CLASS_NODE);
return (bool) $this->betterNodeFinder->findFirst($class->stmts, function (Node $node): bool {
if (! $node instanceof PropertyFetch) {
@@ -163,7 +164,7 @@ private function getProperty(PropertyProperty $propertyProperty): Property
}
/**
- * @param PropertyFetch|Expr\StaticPropertyFetch $node
+ * @param PropertyFetch|StaticPropertyFetch $node
*/
private function isReadContext(Node $node): bool
{
diff --git a/src/Rector/AbstractRector/NameResolverTrait.php b/src/Rector/AbstractRector/NameResolverTrait.php
index a94333384021..b8b2eccc35f4 100644
--- a/src/Rector/AbstractRector/NameResolverTrait.php
+++ b/src/Rector/AbstractRector/NameResolverTrait.php
@@ -5,6 +5,8 @@
namespace Rector\Rector\AbstractRector;
use PhpParser\Node;
+use PhpParser\Node\Identifier;
+use PhpParser\Node\Name;
use Rector\CodingStyle\Naming\ClassNaming;
use Rector\PhpParser\Node\Resolver\NameResolver;
@@ -57,7 +59,7 @@ public function getName(Node $node): ?string
}
/**
- * @param string|Node\Name|Node\Identifier $name
+ * @param string|Name|Identifier $name
*/
protected function getShortName($name): string
{
diff --git a/src/Util/RectorStrings.php b/src/Util/RectorStrings.php
index 6fdb254c3fdd..80a1e333af8c 100644
--- a/src/Util/RectorStrings.php
+++ b/src/Util/RectorStrings.php
@@ -42,6 +42,11 @@ public static function camelCaseToDashes(string $input): string
return self::camelCaseToGlue($input, '-');
}
+ public static function camelCaseToSlashes(string $input): string
+ {
+ return self::camelCaseToGlue($input, '/');
+ }
+
public static function camelCaseToUnderscore(string $input): string
{
return self::camelCaseToGlue($input, '_');