Skip to content

Commit

Permalink
[DowngradePhp70] Add anonymous class out of trait (#6384)
Browse files Browse the repository at this point in the history
  • Loading branch information
TomasVotruba committed May 7, 2021
1 parent 534f30d commit 550d147
Show file tree
Hide file tree
Showing 3 changed files with 73 additions and 13 deletions.
Original file line number Diff line number Diff line change
@@ -0,0 +1,32 @@
<?php

namespace Rector\Tests\DowngradePhp70\Rector\New_\DowngradeAnonymousClassRector\Fixture;

trait ClassInTrait
{
public function run()
{
$message = 'error';
return new class($message) extends \InvalidArgumentException {};
}
}

?>
-----
<?php

namespace Rector\Tests\DowngradePhp70\Rector\New_\DowngradeAnonymousClassRector\Fixture;

class AnonymousFor_NotInFunction extends \InvalidArgumentException
{
}
trait ClassInTrait
{
public function run()
{
$message = 'error';
return new AnonymousFor_NotInFunction($message);
}
}

?>
21 changes: 21 additions & 0 deletions rules/DowngradePhp70/NodeFactory/ClassFromAnonymousFactory.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
<?php

declare(strict_types=1);

namespace Rector\DowngradePhp70\NodeFactory;

use PhpParser\Node\Stmt\Class_;

final class ClassFromAnonymousFactory
{
public function create(string $className, Class_ $newClass): Class_
{
return new Class_($className, [
'flags' => $newClass->flags,
'extends' => $newClass->extends,
'implements' => $newClass->implements,
'stmts' => $newClass->stmts,
'attrGroups' => $newClass->attrGroups,
]);
}
}
33 changes: 20 additions & 13 deletions rules/DowngradePhp70/Rector/New_/DowngradeAnonymousClassRector.php
Original file line number Diff line number Diff line change
Expand Up @@ -11,10 +11,12 @@
use PhpParser\Node\Name;
use PhpParser\Node\Stmt;
use PhpParser\Node\Stmt\Class_;
use PhpParser\Node\Stmt\ClassLike;
use PhpParser\Node\Stmt\Function_;
use PhpParser\Node\Stmt\Namespace_;
use Rector\Core\NodeAnalyzer\ClassAnalyzer;
use Rector\Core\Rector\AbstractRector;
use Rector\DowngradePhp70\NodeFactory\ClassFromAnonymousFactory;
use Rector\NodeTypeResolver\Node\AttributeKey;
use Symplify\RuleDocGenerator\ValueObject\CodeSample\CodeSample;
use Symplify\RuleDocGenerator\ValueObject\RuleDefinition;
Expand All @@ -34,9 +36,17 @@ final class DowngradeAnonymousClassRector extends AbstractRector
*/
private $classAnalyzer;

public function __construct(ClassAnalyzer $classAnalyzer)
{
/**
* @var ClassFromAnonymousFactory
*/
private $classFromAnonymousFactory;

public function __construct(
ClassAnalyzer $classAnalyzer,
ClassFromAnonymousFactory $classFromAnonymousFactory
) {
$this->classAnalyzer = $classAnalyzer;
$this->classFromAnonymousFactory = $classFromAnonymousFactory;
}

/**
Expand Down Expand Up @@ -183,17 +193,14 @@ private function processMove(New_ $new, string $className, Node $node): ?New_
return null;
}

$class = new Class_(
$className,
[
'flags' => $new->class->flags,
'extends' => $new->class->extends,
'implements' => $new->class->implements,
'stmts' => $new->class->stmts,
'attrGroups' => $new->class->attrGroups,
]
);
$this->addNodeBeforeNode($class, $node);
$class = $this->classFromAnonymousFactory->create($className, $new->class);

$currentClass = $node->getAttribute(AttributeKey::CLASS_NODE);
if ($currentClass instanceof ClassLike) {
$this->addNodeBeforeNode($class, $currentClass);
} else {
$this->addNodeBeforeNode($class, $node);
}

return new New_(new Name($className), $new->args);
}
Expand Down

0 comments on commit 550d147

Please sign in to comment.