From ab89f4b7803383fdac835b40bc8cf80be4073ca2 Mon Sep 17 00:00:00 2001 From: TomasVotruba Date: Sat, 1 Feb 2020 17:04:38 +0100 Subject: [PATCH] [CakePHPToSymfony] Add CakePHPImplicitRouteToExplicitRouteAnnotationRector --- .../cakephp-24-to-symfony-51.yaml | 1 + docs/AllRectorsOverview.md | 25 +++- ecs.yaml | 6 +- .../src/Printer/PhpDocInfoPrinter.php | 2 +- ...itRouteToExplicitRouteAnnotationRector.php | 121 ++++++++++++++++++ ...uteToExplicitRouteAnnotationRectorTest.php | 30 +++++ .../Fixture/fixture.php.inc | 29 +++++ .../src/Rector/If_/CombineIfRector.php | 2 +- ...aysTrueConditionSetInConstructorRector.php | 3 +- ...itedMethodVisibilitySameAsParentRector.php | 3 +- .../RemoveDeadZeroAndOneOperationRector.php | 12 +- ...ValidationRulesToArrayDefinitionRector.php | 2 +- ...erFunctionToConstructorInjectionRector.php | 3 +- .../FunctionMethodAndClassNodeVisitor.php | 2 +- .../PerNodeTypeResolver/CastTypeResolver.php | 2 +- .../NodeAnalyzer/DocBlockManipulator.php | 25 ++-- .../Assign/PHPStormVarAnnotationRector.php | 3 +- .../Rector/FunctionLike/UnionTypesRector.php | 7 +- .../src/PHPStan/Type/ObjectTypeSpecifier.php | 7 +- .../Manipulator/ClassConstManipulator.php | 3 +- .../Node/Manipulator/PropertyManipulator.php | 5 +- .../AbstractRector/NameResolverTrait.php | 4 +- src/Util/RectorStrings.php | 5 + 23 files changed, 261 insertions(+), 41 deletions(-) create mode 100644 packages/CakePHPToSymfony/src/Rector/Class_/CakePHPImplicitRouteToExplicitRouteAnnotationRector.php create mode 100644 packages/CakePHPToSymfony/tests/Rector/Class_/CakePHPImplicitRouteToExplicitRouteAnnotationRector/CakePHPImplicitRouteToExplicitRouteAnnotationRectorTest.php create mode 100644 packages/CakePHPToSymfony/tests/Rector/Class_/CakePHPImplicitRouteToExplicitRouteAnnotationRector/Fixture/fixture.php.inc 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, '_');