2020-08-03 21:31:32 +02:00
|
|
|
<?php
|
|
|
|
|
2020-08-13 18:30:12 +02:00
|
|
|
namespace Phabel\Target\Php70;
|
2020-08-03 21:31:32 +02:00
|
|
|
|
2020-08-13 18:30:12 +02:00
|
|
|
use Phabel\Plugin;
|
2020-08-03 21:31:32 +02:00
|
|
|
use PhpParser\Node;
|
|
|
|
|
2020-08-13 18:30:12 +02:00
|
|
|
class AnonymousClassReplacer extends Plugin
|
2020-08-03 21:31:32 +02:00
|
|
|
{
|
|
|
|
/**
|
|
|
|
* @var array
|
|
|
|
*/
|
|
|
|
protected $anonymousClassNodes = [];
|
|
|
|
public static $count = 0;
|
|
|
|
/**
|
|
|
|
* {@inheritdoc}
|
|
|
|
*/
|
|
|
|
public function leaveNode(Node $node)
|
|
|
|
{
|
|
|
|
if (!$node instanceof Node\Expr\New_) {
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
|
|
|
$classNode = $node->class;
|
|
|
|
if (!$classNode instanceof Node\Stmt\Class_) {
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
|
|
|
$newClassName = 'AnonymousClass'.(self::$count++);
|
|
|
|
|
|
|
|
$classNode->name = $newClassName;
|
|
|
|
|
|
|
|
$this->anonymousClassNodes[] = $classNode;
|
|
|
|
|
|
|
|
// Generate new code that instantiate our new class
|
|
|
|
$newNode = new Node\Expr\New_(
|
|
|
|
new Node\Expr\ConstFetch(
|
|
|
|
new Node\Name($newClassName)
|
|
|
|
),
|
|
|
|
$node->args
|
|
|
|
);
|
|
|
|
|
|
|
|
return $newNode;
|
|
|
|
}
|
|
|
|
}
|