Updated Rector to commit a2f70054a7d976acd2c73b06789095b998829be6

a2f70054a7 [DocBlock] Update docblock contents right in the rule (#4999)
This commit is contained in:
Tomas Votruba 2023-09-11 21:30:42 +00:00
parent 35a66f9d23
commit 3c6c1c03f8
28 changed files with 237 additions and 204 deletions

View File

@ -26,7 +26,6 @@ use Rector\BetterPhpDocParser\Annotation\AnnotationNaming;
use Rector\BetterPhpDocParser\PhpDoc\DoctrineAnnotationTagValueNode;
use Rector\BetterPhpDocParser\PhpDoc\SpacelessPhpDocTagNode;
use Rector\BetterPhpDocParser\PhpDocNodeFinder\PhpDocNodeByTypeFinder;
use Rector\BetterPhpDocParser\PhpDocNodeVisitor\ChangedPhpDocNodeVisitor;
use Rector\BetterPhpDocParser\ValueObject\Parser\BetterTokenIterator;
use Rector\BetterPhpDocParser\ValueObject\PhpDocAttributeKey;
use Rector\BetterPhpDocParser\ValueObject\Type\ShortenedIdentifierTypeNode;
@ -80,10 +79,6 @@ final class PhpDocInfo
* @var \PHPStan\PhpDocParser\Ast\PhpDoc\PhpDocNode
*/
private $originalPhpDocNode;
/**
* @var bool
*/
private $hasChanged = \false;
public function __construct(PhpDocNode $phpDocNode, BetterTokenIterator $betterTokenIterator, StaticTypeMapper $staticTypeMapper, \PhpParser\Node $node, AnnotationNaming $annotationNaming, PhpDocNodeByTypeFinder $phpDocNodeByTypeFinder)
{
$this->phpDocNode = $phpDocNode;
@ -341,26 +336,11 @@ final class PhpDocInfo
* @deprecated Change doc block and print directly in the node instead
* @internal
* Should be handled by attributes of phpdoc node - if stard_and_end is missing in one of nodes, it has been changed
* Similar to missing original node in php-aprser
*
* @api
*/
public function markAsChanged() : void
{
$this->hasChanged = \true;
}
public function hasChanged() : bool
{
if ($this->isNewNode()) {
return \true;
}
if ($this->hasChanged) {
return \true;
}
// has a single node with missing start_end
$phpDocNodeTraverser = new PhpDocNodeTraverser();
$changedPhpDocNodeVisitor = new ChangedPhpDocNodeVisitor();
$phpDocNodeTraverser->addPhpDocNodeVisitor($changedPhpDocNodeVisitor);
$phpDocNodeTraverser->traverse($this->phpDocNode);
return $changedPhpDocNodeVisitor->hasChanged();
}
public function makeMultiLined() : void
{

View File

@ -29,16 +29,17 @@ final class PhpDocClassRenamer
*
* @param string[] $oldToNewClasses
*/
public function changeTypeInAnnotationTypes(Node $node, PhpDocInfo $phpDocInfo, array $oldToNewClasses) : void
public function changeTypeInAnnotationTypes(Node $node, PhpDocInfo $phpDocInfo, array $oldToNewClasses, bool &$hasChanged) : bool
{
$this->processAssertChoiceTagValueNode($oldToNewClasses, $phpDocInfo);
$this->processDoctrineRelationTagValueNode($node, $oldToNewClasses, $phpDocInfo);
$this->processSerializerTypeTagValueNode($oldToNewClasses, $phpDocInfo);
$this->processAssertChoiceTagValueNode($oldToNewClasses, $phpDocInfo, $hasChanged);
$this->processDoctrineRelationTagValueNode($node, $oldToNewClasses, $phpDocInfo, $hasChanged);
$this->processSerializerTypeTagValueNode($oldToNewClasses, $phpDocInfo, $hasChanged);
return $hasChanged;
}
/**
* @param array<string, string> $oldToNewClasses
*/
private function processAssertChoiceTagValueNode(array $oldToNewClasses, PhpDocInfo $phpDocInfo) : void
private function processAssertChoiceTagValueNode(array $oldToNewClasses, PhpDocInfo $phpDocInfo, bool &$hasChanged) : void
{
$assertChoiceDoctrineAnnotationTagValueNode = $phpDocInfo->findOneByAnnotationClass('Symfony\\Component\\Validator\\Constraints\\Choice');
if (!$assertChoiceDoctrineAnnotationTagValueNode instanceof DoctrineAnnotationTagValueNode) {
@ -66,24 +67,25 @@ final class PhpDocClassRenamer
$classNameStringNode->value = $newClass;
// trigger reprint
$classNameArrayItemNode->setAttribute(PhpDocAttributeKey::ORIG_NODE, null);
$hasChanged = \true;
break;
}
}
/**
* @param array<string, string> $oldToNewClasses
*/
private function processDoctrineRelationTagValueNode(Node $node, array $oldToNewClasses, PhpDocInfo $phpDocInfo) : void
private function processDoctrineRelationTagValueNode(Node $node, array $oldToNewClasses, PhpDocInfo $phpDocInfo, bool &$hasChanged) : void
{
$doctrineAnnotationTagValueNode = $phpDocInfo->getByAnnotationClasses(['Doctrine\\ORM\\Mapping\\OneToMany', 'Doctrine\\ORM\\Mapping\\ManyToMany', 'Doctrine\\ORM\\Mapping\\Embedded']);
if (!$doctrineAnnotationTagValueNode instanceof DoctrineAnnotationTagValueNode) {
return;
}
$this->processDoctrineToMany($doctrineAnnotationTagValueNode, $node, $oldToNewClasses);
$this->processDoctrineToMany($doctrineAnnotationTagValueNode, $node, $oldToNewClasses, $hasChanged);
}
/**
* @param array<string, string> $oldToNewClasses
*/
private function processSerializerTypeTagValueNode(array $oldToNewClasses, PhpDocInfo $phpDocInfo) : void
private function processSerializerTypeTagValueNode(array $oldToNewClasses, PhpDocInfo $phpDocInfo, bool &$hasChanged) : void
{
$doctrineAnnotationTagValueNode = $phpDocInfo->findOneByAnnotationClass('JMS\\Serializer\\Annotation\\Type');
if (!$doctrineAnnotationTagValueNode instanceof DoctrineAnnotationTagValueNode) {
@ -99,6 +101,7 @@ final class PhpDocClassRenamer
}
$classNameStringNode->value = Strings::replace($classNameStringNode->value, '#\\b' . \preg_quote($oldClass, '#') . '\\b#', $newClass);
$classNameArrayItemNode->setAttribute(PhpDocAttributeKey::ORIG_NODE, null);
$hasChanged = \true;
}
$currentTypeArrayItemNode = $doctrineAnnotationTagValueNode->getValue('type');
if (!$currentTypeArrayItemNode instanceof ArrayItemNode) {
@ -110,13 +113,14 @@ final class PhpDocClassRenamer
}
if ($currentTypeStringNode->value === $oldClass) {
$currentTypeStringNode->value = $newClass;
$hasChanged = \true;
}
}
}
/**
* @param array<string, string> $oldToNewClasses
*/
private function processDoctrineToMany(DoctrineAnnotationTagValueNode $doctrineAnnotationTagValueNode, Node $node, array $oldToNewClasses) : void
private function processDoctrineToMany(DoctrineAnnotationTagValueNode $doctrineAnnotationTagValueNode, Node $node, array $oldToNewClasses, bool &$hasChanged) : void
{
$classKey = $doctrineAnnotationTagValueNode->hasClassName('Doctrine\\ORM\\Mapping\\Embedded') ? 'class' : 'targetEntity';
$targetEntityArrayItemNode = $doctrineAnnotationTagValueNode->getValue($classKey);
@ -136,6 +140,7 @@ final class PhpDocClassRenamer
}
$targetEntityStringNode->value = $newClass;
$targetEntityArrayItemNode->setAttribute(PhpDocAttributeKey::ORIG_NODE, null);
$hasChanged = \true;
}
}
}

View File

@ -130,14 +130,14 @@ final class PhpDocTypeChanger
$this->docBlockUpdater->updateRefactoredNodeWithPhpDocInfo($functionLike);
return \true;
}
public function changeParamType(FunctionLike $functionLike, PhpDocInfo $phpDocInfo, Type $newType, Param $param, string $paramName) : void
public function changeParamType(FunctionLike $functionLike, PhpDocInfo $phpDocInfo, Type $newType, Param $param, string $paramName) : bool
{
// better skip, could crash hard
if ($phpDocInfo->hasInvalidTag('@param')) {
return;
return \false;
}
if (!$this->newPhpDocFromPHPStanTypeGuard->isLegal($newType)) {
return;
return \false;
}
$phpDocTypeNode = $this->staticTypeMapper->mapPHPStanTypeToPHPStanPhpDocTypeNode($newType);
$paramTagValueNode = $phpDocInfo->getParamTagValueByName($paramName);
@ -147,10 +147,10 @@ final class PhpDocTypeChanger
$currentType = $this->staticTypeMapper->mapPHPStanPhpDocTypeNodeToPHPStanType($paramTagValueNode->type, $param);
// avoid overriding better type
if ($this->typeComparator->isSubtype($currentType, $newType)) {
return;
return \false;
}
if ($this->typeComparator->areTypesEqual($currentType, $newType)) {
return;
return \false;
}
$paramTagValueNode->type = $phpDocTypeNode;
} else {
@ -158,6 +158,7 @@ final class PhpDocTypeChanger
$phpDocInfo->addTagValueNode($paramTagValueNode);
}
$this->docBlockUpdater->updateRefactoredNodeWithPhpDocInfo($functionLike);
return \true;
}
public function isAllowed(TypeNode $typeNode) : bool
{

View File

@ -1,32 +0,0 @@
<?php
declare (strict_types=1);
namespace Rector\BetterPhpDocParser\PhpDocManipulator;
use PHPStan\PhpDocParser\Ast\PhpDoc\ParamTagValueNode;
use Rector\BetterPhpDocParser\PhpDocInfo\PhpDocInfoFactory;
use Rector\BetterPhpDocParser\ValueObject\PhpDocAttributeKey;
use Rector\Naming\ValueObject\ParamRename;
final class PropertyDocBlockManipulator
{
/**
* @readonly
* @var \Rector\BetterPhpDocParser\PhpDocInfo\PhpDocInfoFactory
*/
private $phpDocInfoFactory;
public function __construct(PhpDocInfoFactory $phpDocInfoFactory)
{
$this->phpDocInfoFactory = $phpDocInfoFactory;
}
public function renameParameterNameInDocBlock(ParamRename $paramRename) : void
{
$functionLike = $paramRename->getFunctionLike();
$phpDocInfo = $this->phpDocInfoFactory->createFromNodeOrEmpty($functionLike);
$paramTagValueNode = $phpDocInfo->getParamTagValueByName($paramRename->getCurrentName());
if (!$paramTagValueNode instanceof ParamTagValueNode) {
return;
}
$paramTagValueNode->parameterName = '$' . $paramRename->getExpectedName();
$paramTagValueNode->setAttribute(PhpDocAttributeKey::ORIG_NODE, null);
}
}

View File

@ -20,22 +20,6 @@ final class DocBlockUpdater
{
$this->phpDocInfoPrinter = $phpDocInfoPrinter;
}
public function updateNodeWithPhpDocInfo(Node $node) : void
{
// nothing to change? don't save it
$phpDocInfo = $this->resolveChangedPhpDocInfo($node);
if (!$phpDocInfo instanceof PhpDocInfo) {
return;
}
$phpDoc = $this->printPhpDocInfoToString($phpDocInfo);
// make sure, that many separated comments are not removed
if ($phpDoc === '') {
$this->setCommentsAttribute($node);
return;
}
// this is needed to remove duplicated // commentsAsText
$node->setDocComment(new Doc($phpDoc));
}
public function updateRefactoredNodeWithPhpDocInfo(Node $node) : void
{
// nothing to change? don't save it
@ -58,17 +42,6 @@ final class DocBlockUpdater
});
$node->setAttribute(AttributeKey::COMMENTS, $comments);
}
private function resolveChangedPhpDocInfo(Node $node) : ?PhpDocInfo
{
$phpDocInfo = $node->getAttribute(AttributeKey::PHP_DOC_INFO);
if (!$phpDocInfo instanceof PhpDocInfo) {
return null;
}
if (!$phpDocInfo->hasChanged()) {
return null;
}
return $phpDocInfo;
}
private function printPhpDocInfoToString(PhpDocInfo $phpDocInfo) : string
{
if ($phpDocInfo->isNewNode()) {

View File

@ -21,14 +21,15 @@ final class DocBlockClassRenamer
/**
* @param OldToNewType[] $oldToNewTypes
*/
public function renamePhpDocType(PhpDocInfo $phpDocInfo, array $oldToNewTypes) : void
public function renamePhpDocType(PhpDocInfo $phpDocInfo, array $oldToNewTypes) : bool
{
if ($oldToNewTypes === []) {
return;
return \false;
}
$phpDocNodeTraverser = new PhpDocNodeTraverser();
$phpDocNodeTraverser->addPhpDocNodeVisitor($this->classRenamePhpDocNodeVisitor);
$this->classRenamePhpDocNodeVisitor->setOldToNewTypes($oldToNewTypes);
$phpDocNodeTraverser->traverse($phpDocInfo->getPhpDocNode());
return $this->classRenamePhpDocNodeVisitor->hasChanged();
}
}

View File

@ -18,14 +18,15 @@ final class DocBlockNameImporter
{
$this->nameImportingPhpDocNodeVisitor = $nameImportingPhpDocNodeVisitor;
}
public function importNames(PhpDocNode $phpDocNode, Node $node) : void
public function importNames(PhpDocNode $phpDocNode, Node $node) : bool
{
if ($phpDocNode->children === []) {
return;
return \false;
}
$this->nameImportingPhpDocNodeVisitor->setCurrentNode($node);
$phpDocNodeTraverser = new PhpDocNodeTraverser();
$phpDocNodeTraverser->addPhpDocNodeVisitor($this->nameImportingPhpDocNodeVisitor);
$phpDocNodeTraverser->traverse($phpDocNode);
return $this->nameImportingPhpDocNodeVisitor->hasChanged();
}
}

View File

@ -45,6 +45,10 @@ final class ClassRenamePhpDocNodeVisitor extends AbstractPhpDocNodeVisitor
* @var OldToNewType[]
*/
private $oldToNewTypes = [];
/**
* @var bool
*/
private $hasChanged = \false;
public function __construct(StaticTypeMapper $staticTypeMapper, CurrentNodeProvider $currentNodeProvider, UseImportsResolver $useImportsResolver)
{
$this->staticTypeMapper = $staticTypeMapper;
@ -56,6 +60,7 @@ final class ClassRenamePhpDocNodeVisitor extends AbstractPhpDocNodeVisitor
if ($this->oldToNewTypes === []) {
throw new ShouldNotHappenException('Configure "$oldToNewClasses" first');
}
$this->hasChanged = \false;
}
public function enterNode(Node $node) : ?Node
{
@ -91,6 +96,7 @@ final class ClassRenamePhpDocNodeVisitor extends AbstractPhpDocNodeVisitor
// mirror attributes
$newTypeNode->setAttribute(PhpDocAttributeKey::PARENT, $parentType);
}
$this->hasChanged = \true;
return $newTypeNode;
}
return null;
@ -102,6 +108,10 @@ final class ClassRenamePhpDocNodeVisitor extends AbstractPhpDocNodeVisitor
{
$this->oldToNewTypes = $oldToNewTypes;
}
public function hasChanged() : bool
{
return $this->hasChanged;
}
private function resolveNamespacedName(IdentifierTypeNode $identifierTypeNode, PhpParserNode $phpParserNode, string $name) : string
{
if (\strncmp($name, '\\', \strlen('\\')) === 0) {

View File

@ -54,6 +54,10 @@ final class NameImportingPhpDocNodeVisitor extends AbstractPhpDocNodeVisitor
* @var PhpParserNode|null
*/
private $currentPhpParserNode;
/**
* @var bool
*/
private $hasChanged = \false;
public function __construct(ClassNameImportSkipper $classNameImportSkipper, UseNodesToAddCollector $useNodesToAddCollector, CurrentFileProvider $currentFileProvider, ReflectionProvider $reflectionProvider, IdentifierTypeMapper $identifierTypeMapper)
{
$this->classNameImportSkipper = $classNameImportSkipper;
@ -99,8 +103,13 @@ final class NameImportingPhpDocNodeVisitor extends AbstractPhpDocNodeVisitor
}
public function setCurrentNode(PhpParserNode $phpParserNode) : void
{
$this->hasChanged = \false;
$this->currentPhpParserNode = $phpParserNode;
}
public function hasChanged() : bool
{
return $this->hasChanged;
}
private function processFqnNameImport(PhpParserNode $phpParserNode, IdentifierTypeNode $identifierTypeNode, FullyQualifiedObjectType $fullyQualifiedObjectType, File $file) : ?IdentifierTypeNode
{
$parentNode = $identifierTypeNode->getAttribute(PhpDocAttributeKey::PARENT);
@ -108,6 +117,7 @@ final class NameImportingPhpDocNodeVisitor extends AbstractPhpDocNodeVisitor
// might break
return null;
}
// standardize to FQN
if (\strncmp($fullyQualifiedObjectType->getClassName(), '@', \strlen('@')) === 0) {
$fullyQualifiedObjectType = new FullyQualifiedObjectType(\ltrim($fullyQualifiedObjectType->getClassName(), '@'));
}
@ -121,6 +131,7 @@ final class NameImportingPhpDocNodeVisitor extends AbstractPhpDocNodeVisitor
}
if ($this->shouldImport($newNode, $identifierTypeNode, $fullyQualifiedObjectType)) {
$this->useNodesToAddCollector->addUseImport($fullyQualifiedObjectType);
$this->hasChanged = \true;
return $newNode;
}
return null;

View File

@ -14,9 +14,11 @@ use PhpParser\Node\Stmt\InlineHTML;
use PhpParser\Node\Stmt\Namespace_;
use PhpParser\Node\Stmt\Use_;
use PHPStan\Reflection\ReflectionProvider;
use Rector\BetterPhpDocParser\PhpDocInfo\PhpDocInfo;
use Rector\BetterPhpDocParser\PhpDocInfo\PhpDocInfoFactory;
use Rector\CodingStyle\ClassNameImport\ClassNameImportSkipper;
use Rector\CodingStyle\Node\NameImporter;
use Rector\Comments\NodeDocBlock\DocBlockUpdater;
use Rector\Core\Configuration\Option;
use Rector\Core\Configuration\Parameter\SimpleParameterProvider;
use Rector\Core\PhpParser\Node\CustomNode\FileWithoutNamespace;
@ -68,7 +70,12 @@ final class NameImportingPostRector extends \Rector\PostRector\Rector\AbstractPo
* @var \Rector\Naming\Naming\AliasNameResolver
*/
private $aliasNameResolver;
public function __construct(NameImporter $nameImporter, DocBlockNameImporter $docBlockNameImporter, ClassNameImportSkipper $classNameImportSkipper, PhpDocInfoFactory $phpDocInfoFactory, ReflectionProvider $reflectionProvider, CurrentFileProvider $currentFileProvider, UseImportsResolver $useImportsResolver, AliasNameResolver $aliasNameResolver)
/**
* @readonly
* @var \Rector\Comments\NodeDocBlock\DocBlockUpdater
*/
private $docBlockUpdater;
public function __construct(NameImporter $nameImporter, DocBlockNameImporter $docBlockNameImporter, ClassNameImportSkipper $classNameImportSkipper, PhpDocInfoFactory $phpDocInfoFactory, ReflectionProvider $reflectionProvider, CurrentFileProvider $currentFileProvider, UseImportsResolver $useImportsResolver, AliasNameResolver $aliasNameResolver, DocBlockUpdater $docBlockUpdater)
{
$this->nameImporter = $nameImporter;
$this->docBlockNameImporter = $docBlockNameImporter;
@ -78,6 +85,7 @@ final class NameImportingPostRector extends \Rector\PostRector\Rector\AbstractPo
$this->currentFileProvider = $currentFileProvider;
$this->useImportsResolver = $useImportsResolver;
$this->aliasNameResolver = $aliasNameResolver;
$this->docBlockUpdater = $docBlockUpdater;
}
public function enterNode(Node $node) : ?Node
{
@ -88,19 +96,30 @@ final class NameImportingPostRector extends \Rector\PostRector\Rector\AbstractPo
if (!$file instanceof File) {
return null;
}
$currentStmt = \current($file->getNewStmts());
if ($currentStmt instanceof FileWithoutNamespace && \current($currentStmt->stmts) instanceof InlineHTML) {
$firstStmt = \current($file->getNewStmts());
if ($firstStmt instanceof FileWithoutNamespace && \current($firstStmt->stmts) instanceof InlineHTML) {
return null;
}
if ($node instanceof Name) {
return $this->processNodeName($node, $file);
}
if (($node instanceof Stmt || $node instanceof Param) && SimpleParameterProvider::provideBoolParameter(Option::AUTO_IMPORT_DOC_BLOCK_NAMES)) {
$phpDocInfo = $this->phpDocInfoFactory->createFromNodeOrEmpty($node);
$this->docBlockNameImporter->importNames($phpDocInfo->getPhpDocNode(), $node);
return $node;
if (!$node instanceof Stmt && !$node instanceof Param) {
return null;
}
return null;
$shouldImportDocBlocks = SimpleParameterProvider::provideBoolParameter(Option::AUTO_IMPORT_DOC_BLOCK_NAMES);
if (!$shouldImportDocBlocks) {
return null;
}
$phpDocInfo = $this->phpDocInfoFactory->createFromNode($node);
if (!$phpDocInfo instanceof PhpDocInfo) {
return null;
}
$hasDocChanged = $this->docBlockNameImporter->importNames($phpDocInfo->getPhpDocNode(), $node);
if (!$hasDocChanged) {
return null;
}
$this->docBlockUpdater->updateRefactoredNodeWithPhpDocInfo($node);
return $node;
}
private function processNodeName(Name $name, File $file) : ?Node
{

View File

@ -131,12 +131,9 @@ CODE_SAMPLE
if ($this->hasNoComment($comments)) {
return $rangeLine;
}
$phpDocInfo = $this->phpDocInfoFactory->createFromNodeOrEmpty($nextStmt);
if ($phpDocInfo->hasChanged()) {
return $rangeLine;
}
/** @var Comment[] $comments */
$line = $comments[0]->getStartLine();
$firstComment = $comments[0];
$line = $firstComment->getStartLine();
return $line - $endLine;
}
/**
@ -144,10 +141,7 @@ CODE_SAMPLE
*/
private function hasNoComment(?array $comments) : bool
{
if ($comments === null) {
return \true;
}
return !isset($comments[0]);
return $comments === null || $comments === [];
}
private function shouldSkip(Stmt $stmt) : bool
{

View File

@ -3,7 +3,11 @@
declare (strict_types=1);
namespace Rector\Naming\ParamRenamer;
use Rector\BetterPhpDocParser\PhpDocManipulator\PropertyDocBlockManipulator;
use PHPStan\PhpDocParser\Ast\PhpDoc\ParamTagValueNode;
use Rector\BetterPhpDocParser\PhpDocInfo\PhpDocInfo;
use Rector\BetterPhpDocParser\PhpDocInfo\PhpDocInfoFactory;
use Rector\BetterPhpDocParser\ValueObject\PhpDocAttributeKey;
use Rector\Comments\NodeDocBlock\DocBlockUpdater;
use Rector\Naming\ValueObject\ParamRename;
use Rector\Naming\VariableRenamer;
final class ParamRenamer
@ -15,13 +19,19 @@ final class ParamRenamer
private $variableRenamer;
/**
* @readonly
* @var \Rector\BetterPhpDocParser\PhpDocManipulator\PropertyDocBlockManipulator
* @var \Rector\Comments\NodeDocBlock\DocBlockUpdater
*/
private $propertyDocBlockManipulator;
public function __construct(VariableRenamer $variableRenamer, PropertyDocBlockManipulator $propertyDocBlockManipulator)
private $docBlockUpdater;
/**
* @readonly
* @var \Rector\BetterPhpDocParser\PhpDocInfo\PhpDocInfoFactory
*/
private $phpDocInfoFactory;
public function __construct(VariableRenamer $variableRenamer, DocBlockUpdater $docBlockUpdater, PhpDocInfoFactory $phpDocInfoFactory)
{
$this->variableRenamer = $variableRenamer;
$this->propertyDocBlockManipulator = $propertyDocBlockManipulator;
$this->docBlockUpdater = $docBlockUpdater;
$this->phpDocInfoFactory = $phpDocInfoFactory;
}
public function rename(ParamRename $paramRename) : void
{
@ -30,6 +40,21 @@ final class ParamRenamer
// 2. rename param in the rest of the method
$this->variableRenamer->renameVariableInFunctionLike($paramRename->getFunctionLike(), $paramRename->getCurrentName(), $paramRename->getExpectedName(), null);
// 3. rename @param variable in docblock too
$this->propertyDocBlockManipulator->renameParameterNameInDocBlock($paramRename);
$this->renameParameterNameInDocBlock($paramRename);
}
private function renameParameterNameInDocBlock(ParamRename $paramRename) : void
{
$functionLike = $paramRename->getFunctionLike();
$phpDocInfo = $this->phpDocInfoFactory->createFromNode($functionLike);
if (!$phpDocInfo instanceof PhpDocInfo) {
return;
}
$paramTagValueNode = $phpDocInfo->getParamTagValueByName($paramRename->getCurrentName());
if (!$paramTagValueNode instanceof ParamTagValueNode) {
return;
}
$paramTagValueNode->parameterName = '$' . $paramRename->getExpectedName();
$paramTagValueNode->setAttribute(PhpDocAttributeKey::ORIG_NODE, null);
$this->docBlockUpdater->updateRefactoredNodeWithPhpDocInfo($functionLike);
}
}

View File

@ -13,6 +13,7 @@ use PhpParser\Node\Stmt\Interface_;
use PHPStan\PhpDocParser\Ast\PhpDoc\ParamTagValueNode;
use Rector\BetterPhpDocParser\PhpDocInfo\PhpDocInfo;
use Rector\BetterPhpDocParser\PhpDocInfo\PhpDocInfoFactory;
use Rector\Comments\NodeDocBlock\DocBlockUpdater;
use Rector\Core\Php\PhpVersionProvider;
use Rector\Core\ValueObject\MethodName;
use Rector\Core\ValueObject\PhpVersionFeature;
@ -64,7 +65,12 @@ final class PropertyPromotionRenamer
* @var \Rector\Naming\VariableRenamer
*/
private $variableRenamer;
public function __construct(PhpVersionProvider $phpVersionProvider, MatchParamTypeExpectedNameResolver $matchParamTypeExpectedNameResolver, ParamRenameFactory $paramRenameFactory, PhpDocInfoFactory $phpDocInfoFactory, ParamRenamer $paramRenamer, \Rector\Naming\PropertyRenamer\PropertyFetchRenamer $propertyFetchRenamer, NodeNameResolver $nodeNameResolver, VariableRenamer $variableRenamer)
/**
* @readonly
* @var \Rector\Comments\NodeDocBlock\DocBlockUpdater
*/
private $docBlockUpdater;
public function __construct(PhpVersionProvider $phpVersionProvider, MatchParamTypeExpectedNameResolver $matchParamTypeExpectedNameResolver, ParamRenameFactory $paramRenameFactory, PhpDocInfoFactory $phpDocInfoFactory, ParamRenamer $paramRenamer, \Rector\Naming\PropertyRenamer\PropertyFetchRenamer $propertyFetchRenamer, NodeNameResolver $nodeNameResolver, VariableRenamer $variableRenamer, DocBlockUpdater $docBlockUpdater)
{
$this->phpVersionProvider = $phpVersionProvider;
$this->matchParamTypeExpectedNameResolver = $matchParamTypeExpectedNameResolver;
@ -74,6 +80,7 @@ final class PropertyPromotionRenamer
$this->propertyFetchRenamer = $propertyFetchRenamer;
$this->nodeNameResolver = $nodeNameResolver;
$this->variableRenamer = $variableRenamer;
$this->docBlockUpdater = $docBlockUpdater;
}
/**
* @param \PhpParser\Node\Stmt\Class_|\PhpParser\Node\Stmt\Interface_ $classLike
@ -125,7 +132,7 @@ final class PropertyPromotionRenamer
$param->var = new Variable($desiredPropertyName);
$this->variableRenamer->renameVariableInFunctionLike($classMethod, $paramVarName, $desiredPropertyName);
}
private function renameParamDoc(PhpDocInfo $phpDocInfo, ClassMethod $classMethod, Param $param, string $paramVarName, string $desiredPropertyName) : void
public function renameParamDoc(PhpDocInfo $phpDocInfo, ClassMethod $classMethod, Param $param, string $paramVarName, string $desiredPropertyName) : void
{
$paramTagValueNode = $phpDocInfo->getParamTagValueByName($paramVarName);
if (!$paramTagValueNode instanceof ParamTagValueNode) {
@ -136,6 +143,7 @@ final class PropertyPromotionRenamer
return;
}
$this->paramRenamer->rename($paramRename);
$this->docBlockUpdater->updateRefactoredNodeWithPhpDocInfo($classMethod);
}
/**
* Sometimes the bare type is not enough.

View File

@ -10,6 +10,8 @@ use PhpParser\Node\Expr\Closure;
use PhpParser\Node\Stmt\ClassMethod;
use PhpParser\Node\Stmt\Expression;
use PhpParser\Node\Stmt\Function_;
use Rector\BetterPhpDocParser\PhpDocInfo\PhpDocInfo;
use Rector\Comments\NodeDocBlock\DocBlockUpdater;
use Rector\Core\Rector\AbstractRector;
use Rector\Naming\Guard\BreakingVariableRenameGuard;
use Rector\Naming\Matcher\VariableAndCallAssignMatcher;
@ -55,12 +57,17 @@ final class RenameVariableToMatchMethodCallReturnTypeRector extends AbstractRect
* @var \Rector\Naming\VariableRenamer
*/
private $variableRenamer;
/**
* @readonly
* @var \Rector\Comments\NodeDocBlock\DocBlockUpdater
*/
private $docBlockUpdater;
/**
* @var string
* @see https://regex101.com/r/JG5w9j/1
*/
private const OR_BETWEEN_WORDS_REGEX = '#[a-z]Or[A-Z]#';
public function __construct(BreakingVariableRenameGuard $breakingVariableRenameGuard, ExpectedNameResolver $expectedNameResolver, NamingConventionAnalyzer $namingConventionAnalyzer, VarTagValueNodeRenamer $varTagValueNodeRenamer, VariableAndCallAssignMatcher $variableAndCallAssignMatcher, VariableRenamer $variableRenamer)
public function __construct(BreakingVariableRenameGuard $breakingVariableRenameGuard, ExpectedNameResolver $expectedNameResolver, NamingConventionAnalyzer $namingConventionAnalyzer, VarTagValueNodeRenamer $varTagValueNodeRenamer, VariableAndCallAssignMatcher $variableAndCallAssignMatcher, VariableRenamer $variableRenamer, DocBlockUpdater $docBlockUpdater)
{
$this->breakingVariableRenameGuard = $breakingVariableRenameGuard;
$this->expectedNameResolver = $expectedNameResolver;
@ -68,6 +75,7 @@ final class RenameVariableToMatchMethodCallReturnTypeRector extends AbstractRect
$this->varTagValueNodeRenamer = $varTagValueNodeRenamer;
$this->variableAndCallAssignMatcher = $variableAndCallAssignMatcher;
$this->variableRenamer = $variableRenamer;
$this->docBlockUpdater = $docBlockUpdater;
}
public function getRuleDefinition() : RuleDefinition
{
@ -139,7 +147,7 @@ CODE_SAMPLE
if ($this->shouldSkip($variableAndCallAssign, $expectedName)) {
continue;
}
$this->renameVariable($variableAndCallAssign, $expectedName);
$this->renameVariable($variableAndCallAssign, $expectedName, $stmt);
return $node;
}
return null;
@ -155,11 +163,14 @@ CODE_SAMPLE
}
return $this->breakingVariableRenameGuard->shouldSkipVariable($variableAndCallAssign->getVariableName(), $expectedName, $variableAndCallAssign->getFunctionLike(), $variableAndCallAssign->getVariable());
}
private function renameVariable(VariableAndCallAssign $variableAndCallAssign, string $expectedName) : void
private function renameVariable(VariableAndCallAssign $variableAndCallAssign, string $expectedName, Expression $expression) : void
{
$assign = $variableAndCallAssign->getAssign();
$assignPhpDocInfo = $this->phpDocInfoFactory->createFromNodeOrEmpty($assign);
$this->varTagValueNodeRenamer->renameAssignVarTagVariableName($assignPhpDocInfo, $variableAndCallAssign->getVariableName(), $expectedName);
$this->variableRenamer->renameVariableInFunctionLike($variableAndCallAssign->getFunctionLike(), $variableAndCallAssign->getVariableName(), $expectedName, $variableAndCallAssign->getAssign());
$assignPhpDocInfo = $this->phpDocInfoFactory->createFromNode($expression);
if (!$assignPhpDocInfo instanceof PhpDocInfo) {
return;
}
$this->varTagValueNodeRenamer->renameAssignVarTagVariableName($assignPhpDocInfo, $variableAndCallAssign->getVariableName(), $expectedName);
$this->docBlockUpdater->updateRefactoredNodeWithPhpDocInfo($expression);
}
}

View File

@ -12,6 +12,7 @@ use PHPStan\PhpDocParser\Ast\PhpDoc\VarTagValueNode;
use Rector\BetterPhpDocParser\PhpDocInfo\PhpDocInfoFactory;
use Rector\BetterPhpDocParser\PhpDocManipulator\PhpDocTypeChanger;
use Rector\BetterPhpDocParser\Printer\PhpDocInfoPrinter;
use Rector\Comments\NodeDocBlock\DocBlockUpdater;
use Rector\DeadCode\PhpDoc\TagRemover\VarTagRemover;
use Rector\NodeTypeResolver\Node\AttributeKey;
use Rector\StaticTypeMapper\StaticTypeMapper;
@ -42,13 +43,19 @@ final class PropertyPromotionDocBlockMerger
* @var \Rector\BetterPhpDocParser\Printer\PhpDocInfoPrinter
*/
private $phpDocInfoPrinter;
public function __construct(PhpDocInfoFactory $phpDocInfoFactory, StaticTypeMapper $staticTypeMapper, PhpDocTypeChanger $phpDocTypeChanger, VarTagRemover $varTagRemover, PhpDocInfoPrinter $phpDocInfoPrinter)
/**
* @readonly
* @var \Rector\Comments\NodeDocBlock\DocBlockUpdater
*/
private $docBlockUpdater;
public function __construct(PhpDocInfoFactory $phpDocInfoFactory, StaticTypeMapper $staticTypeMapper, PhpDocTypeChanger $phpDocTypeChanger, VarTagRemover $varTagRemover, PhpDocInfoPrinter $phpDocInfoPrinter, DocBlockUpdater $docBlockUpdater)
{
$this->phpDocInfoFactory = $phpDocInfoFactory;
$this->staticTypeMapper = $staticTypeMapper;
$this->phpDocTypeChanger = $phpDocTypeChanger;
$this->varTagRemover = $varTagRemover;
$this->phpDocInfoPrinter = $phpDocInfoPrinter;
$this->docBlockUpdater = $docBlockUpdater;
}
public function mergePropertyAndParamDocBlocks(Property $property, Param $param, ?ParamTagValueNode $paramTagValueNode) : void
{
@ -65,6 +72,7 @@ final class PropertyPromotionDocBlockMerger
$param->setAttribute(AttributeKey::COMMENTS, $mergedComments);
}
}
$this->docBlockUpdater->updateRefactoredNodeWithPhpDocInfo($param);
}
public function decorateParamWithPropertyPhpDocInfo(ClassMethod $classMethod, Property $property, Param $param, string $paramName) : void
{

View File

@ -24,6 +24,7 @@ use Rector\Core\Rector\AbstractRector;
use Rector\Core\Reflection\ReflectionResolver;
use Rector\Core\ValueObject\MethodName;
use Rector\Core\ValueObject\PhpVersionFeature;
use Rector\Naming\PropertyRenamer\PropertyPromotionRenamer;
use Rector\Naming\VariableRenamer;
use Rector\NodeTypeResolver\Node\AttributeKey;
use Rector\NodeTypeResolver\TypeComparator\TypeComparator;
@ -76,6 +77,11 @@ final class ClassPropertyAssignToConstructorPromotionRector extends AbstractRect
* @var \Rector\Core\Reflection\ReflectionResolver
*/
private $reflectionResolver;
/**
* @readonly
* @var \Rector\Naming\PropertyRenamer\PropertyPromotionRenamer
*/
private $propertyPromotionRenamer;
/**
* @api
* @var string
@ -91,7 +97,7 @@ final class ClassPropertyAssignToConstructorPromotionRector extends AbstractRect
* @var bool
*/
private $inlinePublic = \false;
public function __construct(PromotedPropertyCandidateResolver $promotedPropertyCandidateResolver, VariableRenamer $variableRenamer, ParamAnalyzer $paramAnalyzer, PropertyPromotionDocBlockMerger $propertyPromotionDocBlockMerger, MakePropertyPromotionGuard $makePropertyPromotionGuard, TypeComparator $typeComparator, ReflectionResolver $reflectionResolver)
public function __construct(PromotedPropertyCandidateResolver $promotedPropertyCandidateResolver, VariableRenamer $variableRenamer, ParamAnalyzer $paramAnalyzer, PropertyPromotionDocBlockMerger $propertyPromotionDocBlockMerger, MakePropertyPromotionGuard $makePropertyPromotionGuard, TypeComparator $typeComparator, ReflectionResolver $reflectionResolver, PropertyPromotionRenamer $propertyPromotionRenamer)
{
$this->promotedPropertyCandidateResolver = $promotedPropertyCandidateResolver;
$this->variableRenamer = $variableRenamer;
@ -100,6 +106,7 @@ final class ClassPropertyAssignToConstructorPromotionRector extends AbstractRect
$this->makePropertyPromotionGuard = $makePropertyPromotionGuard;
$this->typeComparator = $typeComparator;
$this->reflectionResolver = $reflectionResolver;
$this->propertyPromotionRenamer = $propertyPromotionRenamer;
}
public function getRuleDefinition() : RuleDefinition
{
@ -180,8 +187,7 @@ CODE_SAMPLE
if (!$paramTagValueNode instanceof ParamTagValueNode) {
$this->propertyPromotionDocBlockMerger->decorateParamWithPropertyPhpDocInfo($constructClassMethod, $property, $param, $paramName);
} elseif ($paramTagValueNode->parameterName !== '$' . $propertyName) {
$paramTagValueNode->parameterName = '$' . $propertyName;
$paramTagValueNode->setAttribute(PhpDocAttributeKey::ORIG_NODE, null);
$this->propertyPromotionRenamer->renameParamDoc($constructorPhpDocInfo, $constructClassMethod, $param, $paramTagValueNode->parameterName, $propertyName);
}
// property name has higher priority
$paramName = $this->getName($property);

View File

@ -20,6 +20,7 @@ use Rector\BetterPhpDocParser\PhpDocInfo\PhpDocInfoFactory;
use Rector\BetterPhpDocParser\PhpDocManipulator\PhpDocClassRenamer;
use Rector\BetterPhpDocParser\ValueObject\NodeTypes;
use Rector\CodingStyle\Naming\ClassNaming;
use Rector\Comments\NodeDocBlock\DocBlockUpdater;
use Rector\Core\PhpParser\Node\BetterNodeFinder;
use Rector\Core\Util\FileHasher;
use Rector\NodeNameResolver\NodeNameResolver;
@ -75,6 +76,11 @@ final class ClassRenamer
* @var \Rector\Core\Util\FileHasher
*/
private $fileHasher;
/**
* @readonly
* @var \Rector\Comments\NodeDocBlock\DocBlockUpdater
*/
private $docBlockUpdater;
/**
* @var string[]
*/
@ -83,7 +89,7 @@ final class ClassRenamer
* @var array<string, OldToNewType[]>
*/
private $oldToNewTypesByCacheKey = [];
public function __construct(BetterNodeFinder $betterNodeFinder, SimpleCallableNodeTraverser $simpleCallableNodeTraverser, ClassNaming $classNaming, NodeNameResolver $nodeNameResolver, PhpDocClassRenamer $phpDocClassRenamer, PhpDocInfoFactory $phpDocInfoFactory, DocBlockClassRenamer $docBlockClassRenamer, ReflectionProvider $reflectionProvider, FileHasher $fileHasher)
public function __construct(BetterNodeFinder $betterNodeFinder, SimpleCallableNodeTraverser $simpleCallableNodeTraverser, ClassNaming $classNaming, NodeNameResolver $nodeNameResolver, PhpDocClassRenamer $phpDocClassRenamer, PhpDocInfoFactory $phpDocInfoFactory, DocBlockClassRenamer $docBlockClassRenamer, ReflectionProvider $reflectionProvider, FileHasher $fileHasher, DocBlockUpdater $docBlockUpdater)
{
$this->betterNodeFinder = $betterNodeFinder;
$this->simpleCallableNodeTraverser = $simpleCallableNodeTraverser;
@ -94,6 +100,7 @@ final class ClassRenamer
$this->docBlockClassRenamer = $docBlockClassRenamer;
$this->reflectionProvider = $reflectionProvider;
$this->fileHasher = $fileHasher;
$this->docBlockUpdater = $docBlockUpdater;
}
/**
* @param array<string, string> $oldToNewClasses
@ -104,33 +111,40 @@ final class ClassRenamer
if ($node instanceof Name) {
return $this->refactorName($node, $oldToNewClasses);
}
$phpDocInfo = $this->phpDocInfoFactory->createFromNodeOrEmpty($node);
$this->refactorPhpDoc($node, $oldToNewTypes, $oldToNewClasses, $phpDocInfo);
$phpDocInfo = $this->phpDocInfoFactory->createFromNode($node);
if ($phpDocInfo instanceof PhpDocInfo) {
$hasPhpDocChanged = $this->refactorPhpDoc($node, $oldToNewTypes, $oldToNewClasses, $phpDocInfo);
if ($hasPhpDocChanged) {
return $node;
}
}
if ($node instanceof Namespace_) {
return $this->refactorNamespace($node, $oldToNewClasses);
}
if ($node instanceof ClassLike) {
return $this->refactorClassLike($node, $oldToNewClasses, $scope);
}
if ($phpDocInfo->hasChanged()) {
return $node;
}
return null;
}
/**
* @param OldToNewType[] $oldToNewTypes
* @param array<string, string> $oldToNewClasses
*/
private function refactorPhpDoc(Node $node, array $oldToNewTypes, array $oldToNewClasses, PhpDocInfo $phpDocInfo) : void
private function refactorPhpDoc(Node $node, array $oldToNewTypes, array $oldToNewClasses, PhpDocInfo $phpDocInfo) : bool
{
if (!$phpDocInfo->hasByTypes(NodeTypes::TYPE_AWARE_NODES) && !$phpDocInfo->hasByAnnotationClasses(NodeTypes::TYPE_AWARE_DOCTRINE_ANNOTATION_CLASSES)) {
return;
return \false;
}
if ($node instanceof AttributeGroup) {
return;
return \false;
}
$this->docBlockClassRenamer->renamePhpDocType($phpDocInfo, $oldToNewTypes);
$this->phpDocClassRenamer->changeTypeInAnnotationTypes($node, $phpDocInfo, $oldToNewClasses);
$hasChanged = $this->docBlockClassRenamer->renamePhpDocType($phpDocInfo, $oldToNewTypes);
$hasChanged = $this->phpDocClassRenamer->changeTypeInAnnotationTypes($node, $phpDocInfo, $oldToNewClasses, $hasChanged);
if ($hasChanged) {
$this->docBlockUpdater->updateRefactoredNodeWithPhpDocInfo($node);
return \true;
}
return \false;
}
private function shouldSkip(string $newName, Name $name) : bool
{

View File

@ -8,6 +8,8 @@ use PhpParser\Node\Stmt\Class_;
use PhpParser\Node\Stmt\ClassMethod;
use PhpParser\Node\Stmt\Expression;
use PhpParser\Node\Stmt\Property;
use Rector\BetterPhpDocParser\PhpDocInfo\PhpDocInfo;
use Rector\Comments\NodeDocBlock\DocBlockUpdater;
use Rector\Core\Contract\Rector\ConfigurableRectorInterface;
use Rector\Core\Rector\AbstractRector;
use Rector\NodeTypeResolver\PhpDoc\NodeAnalyzer\DocBlockTagReplacer;
@ -26,13 +28,19 @@ final class RenameAnnotationRector extends AbstractRector implements Configurabl
* @var \Rector\NodeTypeResolver\PhpDoc\NodeAnalyzer\DocBlockTagReplacer
*/
private $docBlockTagReplacer;
/**
* @readonly
* @var \Rector\Comments\NodeDocBlock\DocBlockUpdater
*/
private $docBlockUpdater;
/**
* @var RenameAnnotationInterface[]
*/
private $renameAnnotations = [];
public function __construct(DocBlockTagReplacer $docBlockTagReplacer)
public function __construct(DocBlockTagReplacer $docBlockTagReplacer, DocBlockUpdater $docBlockUpdater)
{
$this->docBlockTagReplacer = $docBlockTagReplacer;
$this->docBlockUpdater = $docBlockUpdater;
}
public function getRuleDefinition() : RuleDefinition
{
@ -76,31 +84,25 @@ CODE_SAMPLE
*/
public function refactor(Node $node) : ?Node
{
$hasChanged = \false;
if ($node instanceof Expression) {
$phpDocInfo = $this->phpDocInfoFactory->createFromNodeOrEmpty($node);
foreach ($this->renameAnnotations as $renameAnnotation) {
$hasDocBlockChanged = $this->docBlockTagReplacer->replaceTagByAnother($phpDocInfo, $renameAnnotation->getOldAnnotation(), $renameAnnotation->getNewAnnotation());
if ($hasDocBlockChanged) {
$hasChanged = \true;
}
}
if ($hasChanged) {
return $node;
}
return null;
return $this->refactorExpression($node);
}
$hasChanged = \false;
foreach ($node->stmts as $stmt) {
if (!$stmt instanceof ClassMethod && !$stmt instanceof Property) {
continue;
}
$phpDocInfo = $this->phpDocInfoFactory->createFromNodeOrEmpty($stmt);
$phpDocInfo = $this->phpDocInfoFactory->createFromNode($stmt);
if (!$phpDocInfo instanceof PhpDocInfo) {
continue;
}
foreach ($this->renameAnnotations as $renameAnnotation) {
if ($renameAnnotation instanceof RenameAnnotationByType && !$this->isObjectType($node, $renameAnnotation->getObjectType())) {
continue;
}
$hasDocBlockChanged = $this->docBlockTagReplacer->replaceTagByAnother($phpDocInfo, $renameAnnotation->getOldAnnotation(), $renameAnnotation->getNewAnnotation());
if ($hasDocBlockChanged) {
$this->docBlockUpdater->updateRefactoredNodeWithPhpDocInfo($stmt);
$hasChanged = \true;
}
}
@ -118,4 +120,20 @@ CODE_SAMPLE
Assert::allIsAOf($configuration, RenameAnnotationInterface::class);
$this->renameAnnotations = $configuration;
}
private function refactorExpression(Expression $expression) : ?Expression
{
$hasChanged = \false;
$phpDocInfo = $this->phpDocInfoFactory->createFromNodeOrEmpty($expression);
foreach ($this->renameAnnotations as $renameAnnotation) {
$hasDocBlockChanged = $this->docBlockTagReplacer->replaceTagByAnother($phpDocInfo, $renameAnnotation->getOldAnnotation(), $renameAnnotation->getNewAnnotation());
if ($hasDocBlockChanged) {
$hasChanged = \true;
}
}
if ($hasChanged) {
$this->docBlockUpdater->updateRefactoredNodeWithPhpDocInfo($expression);
return $expression;
}
return null;
}
}

View File

@ -77,6 +77,7 @@ CODE_SAMPLE
return null;
}
$functionLikePhpDocInfo = $this->phpDocInfoFactory->createFromNodeOrEmpty($node);
$hasChanged = \false;
foreach ($node->getParams() as $param) {
if ($param->type === null) {
continue;
@ -96,9 +97,12 @@ CODE_SAMPLE
continue;
}
$paramName = $this->getName($param);
$this->phpDocTypeChanger->changeParamType($node, $functionLikePhpDocInfo, $genericParamType, $param, $paramName);
$changedParamType = $this->phpDocTypeChanger->changeParamType($node, $functionLikePhpDocInfo, $genericParamType, $param, $paramName);
if ($changedParamType) {
$hasChanged = \true;
}
}
if ($functionLikePhpDocInfo->hasChanged()) {
if ($hasChanged) {
return $node;
}
return null;

View File

@ -19,12 +19,12 @@ final class VersionResolver
* @api
* @var string
*/
public const PACKAGE_VERSION = '596bbc98a25903c525914b4d16ea5f9c76b500fb';
public const PACKAGE_VERSION = 'a2f70054a7d976acd2c73b06789095b998829be6';
/**
* @api
* @var string
*/
public const RELEASE_DATE = '2023-09-11 20:30:55';
public const RELEASE_DATE = '2023-09-12 04:28:02';
/**
* @var int
*/

View File

@ -19,7 +19,6 @@ use PhpParser\Node\Scalar\DNumber;
use PhpParser\Node\Scalar\EncapsedStringPart;
use PhpParser\Node\Scalar\LNumber;
use PhpParser\Node\Scalar\String_;
use PhpParser\Node\Stmt;
use PhpParser\Node\Stmt\Class_;
use PhpParser\Node\Stmt\ClassMethod;
use PhpParser\Node\Stmt\Declare_;
@ -27,7 +26,6 @@ use PhpParser\Node\Stmt\Nop;
use PhpParser\Node\Stmt\Use_;
use PhpParser\PrettyPrinter\Standard;
use PHPStan\Node\Expr\AlwaysRememberedExpr;
use Rector\Comments\NodeDocBlock\DocBlockUpdater;
use Rector\Core\Configuration\Option;
use Rector\Core\Configuration\Parameter\SimpleParameterProvider;
use Rector\Core\PhpParser\Node\CustomNode\FileWithoutNamespace;
@ -39,11 +37,6 @@ use Rector\NodeTypeResolver\Node\AttributeKey;
*/
final class BetterStandardPrinter extends Standard
{
/**
* @readonly
* @var \Rector\Comments\NodeDocBlock\DocBlockUpdater
*/
private $docBlockUpdater;
/**
* @var string
* @see https://regex101.com/r/DrsMY4/1
@ -60,9 +53,8 @@ final class BetterStandardPrinter extends Standard
* @var string
*/
private const REPLACE_COLON_WITH_SPACE_REGEX = '#(^.*function .*\\(.*\\)) : #';
public function __construct(DocBlockUpdater $docBlockUpdater)
public function __construct()
{
$this->docBlockUpdater = $docBlockUpdater;
parent::__construct(['shortArraySyntax' => \true]);
// print return type double colon right after the bracket "function(): string"
$this->initializeInsertionMap();
@ -187,7 +179,6 @@ final class BetterStandardPrinter extends Standard
{
// reindex positions for printer
$nodes = \array_values($nodes);
$this->moveCommentsFromAttributeObjectToCommentsAttribute($nodes);
$content = parent::pArray($nodes, $origNodes, $pos, $indentAdjustment, $parentNodeType, $subNodeName, $fixup);
if ($content === null) {
return $content;
@ -406,19 +397,6 @@ final class BetterStandardPrinter extends Standard
}
return $stmts;
}
/**
* @param array<Node|null> $nodes
*/
private function moveCommentsFromAttributeObjectToCommentsAttribute(array $nodes) : void
{
// move phpdoc from node to "comment" attribute
foreach ($nodes as $node) {
if (!$node instanceof Stmt && !$node instanceof Param) {
continue;
}
$this->docBlockUpdater->updateNodeWithPhpDocInfo($node);
}
}
/**
* @param Node[] $nodes
*/

2
vendor/autoload.php vendored
View File

@ -22,4 +22,4 @@ if (PHP_VERSION_ID < 50600) {
require_once __DIR__ . '/composer/autoload_real.php';
return ComposerAutoloaderInitc2db957c3ce342c948d5b630218dd433::getLoader();
return ComposerAutoloaderInite0dc58a2abf8b2ef17f09118048a0298::getLoader();

View File

@ -951,7 +951,6 @@ return array(
'Rector\\BetterPhpDocParser\\PhpDocManipulator\\PhpDocClassRenamer' => $baseDir . '/packages/BetterPhpDocParser/PhpDocManipulator/PhpDocClassRenamer.php',
'Rector\\BetterPhpDocParser\\PhpDocManipulator\\PhpDocTagRemover' => $baseDir . '/packages/BetterPhpDocParser/PhpDocManipulator/PhpDocTagRemover.php',
'Rector\\BetterPhpDocParser\\PhpDocManipulator\\PhpDocTypeChanger' => $baseDir . '/packages/BetterPhpDocParser/PhpDocManipulator/PhpDocTypeChanger.php',
'Rector\\BetterPhpDocParser\\PhpDocManipulator\\PropertyDocBlockManipulator' => $baseDir . '/packages/BetterPhpDocParser/PhpDocManipulator/PropertyDocBlockManipulator.php',
'Rector\\BetterPhpDocParser\\PhpDocNodeFinder\\PhpDocNodeByTypeFinder' => $baseDir . '/packages/BetterPhpDocParser/PhpDocNodeFinder/PhpDocNodeByTypeFinder.php',
'Rector\\BetterPhpDocParser\\PhpDocNodeMapper' => $baseDir . '/packages/BetterPhpDocParser/PhpDocNodeMapper.php',
'Rector\\BetterPhpDocParser\\PhpDocNodeVisitor\\ArrayTypePhpDocNodeVisitor' => $baseDir . '/packages/BetterPhpDocParser/PhpDocNodeVisitor/ArrayTypePhpDocNodeVisitor.php',

View File

@ -2,7 +2,7 @@
// autoload_real.php @generated by Composer
class ComposerAutoloaderInitc2db957c3ce342c948d5b630218dd433
class ComposerAutoloaderInite0dc58a2abf8b2ef17f09118048a0298
{
private static $loader;
@ -22,17 +22,17 @@ class ComposerAutoloaderInitc2db957c3ce342c948d5b630218dd433
return self::$loader;
}
spl_autoload_register(array('ComposerAutoloaderInitc2db957c3ce342c948d5b630218dd433', 'loadClassLoader'), true, true);
spl_autoload_register(array('ComposerAutoloaderInite0dc58a2abf8b2ef17f09118048a0298', 'loadClassLoader'), true, true);
self::$loader = $loader = new \Composer\Autoload\ClassLoader(\dirname(__DIR__));
spl_autoload_unregister(array('ComposerAutoloaderInitc2db957c3ce342c948d5b630218dd433', 'loadClassLoader'));
spl_autoload_unregister(array('ComposerAutoloaderInite0dc58a2abf8b2ef17f09118048a0298', 'loadClassLoader'));
require __DIR__ . '/autoload_static.php';
call_user_func(\Composer\Autoload\ComposerStaticInitc2db957c3ce342c948d5b630218dd433::getInitializer($loader));
call_user_func(\Composer\Autoload\ComposerStaticInite0dc58a2abf8b2ef17f09118048a0298::getInitializer($loader));
$loader->setClassMapAuthoritative(true);
$loader->register(true);
$filesToLoad = \Composer\Autoload\ComposerStaticInitc2db957c3ce342c948d5b630218dd433::$files;
$filesToLoad = \Composer\Autoload\ComposerStaticInite0dc58a2abf8b2ef17f09118048a0298::$files;
$requireFile = \Closure::bind(static function ($fileIdentifier, $file) {
if (empty($GLOBALS['__composer_autoload_files'][$fileIdentifier])) {
$GLOBALS['__composer_autoload_files'][$fileIdentifier] = true;

View File

@ -4,7 +4,7 @@
namespace Composer\Autoload;
class ComposerStaticInitc2db957c3ce342c948d5b630218dd433
class ComposerStaticInite0dc58a2abf8b2ef17f09118048a0298
{
public static $files = array (
'ad155f8f1cf0d418fe49e248db8c661b' => __DIR__ . '/..' . '/react/promise/src/functions_include.php',
@ -1171,7 +1171,6 @@ class ComposerStaticInitc2db957c3ce342c948d5b630218dd433
'Rector\\BetterPhpDocParser\\PhpDocManipulator\\PhpDocClassRenamer' => __DIR__ . '/../..' . '/packages/BetterPhpDocParser/PhpDocManipulator/PhpDocClassRenamer.php',
'Rector\\BetterPhpDocParser\\PhpDocManipulator\\PhpDocTagRemover' => __DIR__ . '/../..' . '/packages/BetterPhpDocParser/PhpDocManipulator/PhpDocTagRemover.php',
'Rector\\BetterPhpDocParser\\PhpDocManipulator\\PhpDocTypeChanger' => __DIR__ . '/../..' . '/packages/BetterPhpDocParser/PhpDocManipulator/PhpDocTypeChanger.php',
'Rector\\BetterPhpDocParser\\PhpDocManipulator\\PropertyDocBlockManipulator' => __DIR__ . '/../..' . '/packages/BetterPhpDocParser/PhpDocManipulator/PropertyDocBlockManipulator.php',
'Rector\\BetterPhpDocParser\\PhpDocNodeFinder\\PhpDocNodeByTypeFinder' => __DIR__ . '/../..' . '/packages/BetterPhpDocParser/PhpDocNodeFinder/PhpDocNodeByTypeFinder.php',
'Rector\\BetterPhpDocParser\\PhpDocNodeMapper' => __DIR__ . '/../..' . '/packages/BetterPhpDocParser/PhpDocNodeMapper.php',
'Rector\\BetterPhpDocParser\\PhpDocNodeVisitor\\ArrayTypePhpDocNodeVisitor' => __DIR__ . '/../..' . '/packages/BetterPhpDocParser/PhpDocNodeVisitor/ArrayTypePhpDocNodeVisitor.php',
@ -2593,9 +2592,9 @@ class ComposerStaticInitc2db957c3ce342c948d5b630218dd433
public static function getInitializer(ClassLoader $loader)
{
return \Closure::bind(function () use ($loader) {
$loader->prefixLengthsPsr4 = ComposerStaticInitc2db957c3ce342c948d5b630218dd433::$prefixLengthsPsr4;
$loader->prefixDirsPsr4 = ComposerStaticInitc2db957c3ce342c948d5b630218dd433::$prefixDirsPsr4;
$loader->classMap = ComposerStaticInitc2db957c3ce342c948d5b630218dd433::$classMap;
$loader->prefixLengthsPsr4 = ComposerStaticInite0dc58a2abf8b2ef17f09118048a0298::$prefixLengthsPsr4;
$loader->prefixDirsPsr4 = ComposerStaticInite0dc58a2abf8b2ef17f09118048a0298::$prefixDirsPsr4;
$loader->classMap = ComposerStaticInite0dc58a2abf8b2ef17f09118048a0298::$classMap;
}, null, ClassLoader::class);
}

View File

@ -1744,12 +1744,12 @@
"source": {
"type": "git",
"url": "https:\/\/github.com\/rectorphp\/rector-doctrine.git",
"reference": "c8420dcc698c05de5f85fc7d21bd05b66ceb60dc"
"reference": "7f9e1329d06b0b90b36dd310b562a27cfd7b6aa6"
},
"dist": {
"type": "zip",
"url": "https:\/\/api.github.com\/repos\/rectorphp\/rector-doctrine\/zipball\/c8420dcc698c05de5f85fc7d21bd05b66ceb60dc",
"reference": "c8420dcc698c05de5f85fc7d21bd05b66ceb60dc",
"url": "https:\/\/api.github.com\/repos\/rectorphp\/rector-doctrine\/zipball\/7f9e1329d06b0b90b36dd310b562a27cfd7b6aa6",
"reference": "7f9e1329d06b0b90b36dd310b562a27cfd7b6aa6",
"shasum": ""
},
"require": {
@ -1774,7 +1774,7 @@
"tomasvotruba\/type-coverage": "^0.2",
"tomasvotruba\/unused-public": "^0.3"
},
"time": "2023-09-11T18:26:33+00:00",
"time": "2023-09-11T18:44:21+00:00",
"default-branch": true,
"type": "rector-extension",
"extra": {

File diff suppressed because one or more lines are too long

View File

@ -9,7 +9,7 @@ namespace Rector\RectorInstaller;
*/
final class GeneratedConfig
{
public const EXTENSIONS = array('rector/rector-doctrine' => array('install_path' => '/home/runner/work/rector-src/rector-src/vendor/rector/rector-doctrine', 'relative_install_path' => '../../rector-doctrine', 'extra' => NULL, 'version' => 'dev-main c8420dc'), 'rector/rector-downgrade-php' => array('install_path' => '/home/runner/work/rector-src/rector-src/vendor/rector/rector-downgrade-php', 'relative_install_path' => '../../rector-downgrade-php', 'extra' => NULL, 'version' => 'dev-main 86f57ee'), 'rector/rector-phpunit' => array('install_path' => '/home/runner/work/rector-src/rector-src/vendor/rector/rector-phpunit', 'relative_install_path' => '../../rector-phpunit', 'extra' => NULL, 'version' => 'dev-main d4ca7d7'), 'rector/rector-symfony' => array('install_path' => '/home/runner/work/rector-src/rector-src/vendor/rector/rector-symfony', 'relative_install_path' => '../../rector-symfony', 'extra' => NULL, 'version' => 'dev-main 6ef9eb7'));
public const EXTENSIONS = array('rector/rector-doctrine' => array('install_path' => '/home/runner/work/rector-src/rector-src/vendor/rector/rector-doctrine', 'relative_install_path' => '../../rector-doctrine', 'extra' => NULL, 'version' => 'dev-main 7f9e132'), 'rector/rector-downgrade-php' => array('install_path' => '/home/runner/work/rector-src/rector-src/vendor/rector/rector-downgrade-php', 'relative_install_path' => '../../rector-downgrade-php', 'extra' => NULL, 'version' => 'dev-main 86f57ee'), 'rector/rector-phpunit' => array('install_path' => '/home/runner/work/rector-src/rector-src/vendor/rector/rector-phpunit', 'relative_install_path' => '../../rector-phpunit', 'extra' => NULL, 'version' => 'dev-main d4ca7d7'), 'rector/rector-symfony' => array('install_path' => '/home/runner/work/rector-src/rector-src/vendor/rector/rector-symfony', 'relative_install_path' => '../../rector-symfony', 'extra' => NULL, 'version' => 'dev-main 6ef9eb7'));
private function __construct()
{
}