Skip to content

Commit

Permalink
[Renaming] Remove parent attribute on ClassRenamer (#4446)
Browse files Browse the repository at this point in the history
* [Renaming] Remove parent attribute on ClassRenamer

* [ci-review] Rector Rectify

* [ci-review] Rector Rectify

---------

Co-authored-by: GitHub Action <actions@github.com>
  • Loading branch information
samsonasik and actions-user committed Jul 9, 2023
1 parent c8da7a5 commit 919f5d4
Show file tree
Hide file tree
Showing 3 changed files with 38 additions and 11 deletions.
10 changes: 10 additions & 0 deletions packages/NodeTypeResolver/Node/AttributeKey.php
Expand Up @@ -302,6 +302,16 @@ final class AttributeKey
*/
public const IS_PARAM_VAR = 'IS_PARAM_VAR';

/**
* @var string
*/
public const IS_CLASS_EXTENDS = 'is_class_extends';

/**
* @var string
*/
public const IS_CLASS_IMPLEMENT = 'is_class_implement';

/**
* @var string
*/
Expand Down
Expand Up @@ -13,6 +13,7 @@
use PhpParser\Node\Expr\Closure;
use PhpParser\Node\Expr\Isset_;
use PhpParser\Node\Expr\Variable;
use PhpParser\Node\Name\FullyQualified;
use PhpParser\Node\Param;
use PhpParser\Node\Stmt\Break_;
use PhpParser\Node\Stmt\Class_;
Expand Down Expand Up @@ -77,9 +78,23 @@ public function enterNode(Node $node): ?Node
$node->var->setAttribute(AttributeKey::IS_PARAM_VAR, true);
}

$this->processContextInClass($node);
return null;
}

private function processContextInClass(Node $node): void
{
if ($node instanceof Class_) {
if ($node->extends instanceof FullyQualified) {
$node->extends->setAttribute(AttributeKey::IS_CLASS_EXTENDS, true);
}

foreach ($node->implements as $implement) {
$implement->setAttribute(AttributeKey::IS_CLASS_IMPLEMENT, true);
}
}
}

private function processContextInAttribute(Attribute $attribute): void
{
$this->simpleCallableNodeTraverser->traverseNodesWithCallable(
Expand Down
24 changes: 13 additions & 11 deletions rules/Renaming/NodeManipulator/ClassRenamer.php
Expand Up @@ -249,18 +249,16 @@ private function isClassToInterfaceValidChange(Name $name, string $newClassName)
}

$classReflection = $this->reflectionProvider->getClass($newClassName);

// ensure new is not with interface
if ($name->getAttribute(AttributeKey::IS_NEW_INSTANCE_NAME) === true && $classReflection->isInterface()) {
return false;
if ($name->getAttribute(AttributeKey::IS_NEW_INSTANCE_NAME) !== true) {
return $this->isValidClassNameChange($name, $classReflection);
}

$parentNode = $name->getAttribute(AttributeKey::PARENT_NODE);
if ($parentNode instanceof Class_) {
return $this->isValidClassNameChange($name, $parentNode, $classReflection);
if (!$classReflection->isInterface()) {
return $this->isValidClassNameChange($name, $classReflection);
}

return true;
return false;
}

/**
Expand Down Expand Up @@ -328,9 +326,9 @@ private function changeNameToFullyQualifiedName(ClassLike $classLike): void
});
}

private function isValidClassNameChange(Name $name, Class_ $class, ClassReflection $classReflection): bool
private function isValidClassNameChange(Name $name, ClassReflection $classReflection): bool
{
if ($class->extends === $name) {
if ($name->getAttribute(AttributeKey::IS_CLASS_EXTENDS) === true) {
// is class to interface?
if ($classReflection->isInterface()) {
return false;
Expand All @@ -341,8 +339,12 @@ private function isValidClassNameChange(Name $name, Class_ $class, ClassReflecti
}
}

// is interface to class?
return ! (in_array($name, $class->implements, true) && $classReflection->isClass());
if ($name->getAttribute(AttributeKey::IS_CLASS_IMPLEMENT) === true) {
// is interface to class?
return ! $classReflection->isClass();
}

return true;
}

/**
Expand Down

0 comments on commit 919f5d4

Please sign in to comment.