mirror of
https://github.com/phabelio/PHP-Parser.git
synced 2024-11-30 04:29:15 +01:00
5900d78cc9
This is a huge hack... We temporarily create a new node with the correct structure and use that for printing. I think it would be better to always use a separate node type for NewAnonClass, rather than using a combination of New and Class, but this would require some larger changes, as this node type would have to be both Expr and ClassLike, which is not possible right now, as the latter is a class rather than an interface...
55 lines
1.7 KiB
PHP
55 lines
1.7 KiB
PHP
<?php
|
|
|
|
namespace PhpParser\Internal;
|
|
|
|
use PhpParser\Node;
|
|
use PhpParser\Node\Expr;
|
|
|
|
/**
|
|
* This node is used internally by the format-preserving pretty printer to print anonymous classes.
|
|
*
|
|
* The normal anonymous class structure violates assumptions about the order of token offsets.
|
|
* Namely, the constructor arguments are part of the Expr\New_ node and follow the class node, even
|
|
* though they are actually interleaved with them. This special node type is used temporarily to
|
|
* restore a sane token offset order.
|
|
*
|
|
* @internal
|
|
*/
|
|
class PrintableNewAnonClassNode extends Expr {
|
|
/** @var Node\Arg[] Arguments */
|
|
public $args;
|
|
/** @var null|Node\Name Name of extended class */
|
|
public $extends;
|
|
/** @var Node\Name[] Names of implemented interfaces */
|
|
public $implements;
|
|
/** @var Node\Stmt[] Statements */
|
|
public $stmts;
|
|
|
|
public function __construct(
|
|
array $args, Node\Name $extends = null, array $implements, array $stmts, array $attributes
|
|
) {
|
|
parent::__construct($attributes);
|
|
$this->args = $args;
|
|
$this->extends = $extends;
|
|
$this->implements = $implements;
|
|
$this->stmts = $stmts;
|
|
}
|
|
|
|
public static function fromNewNode(Expr\New_ $newNode) {
|
|
$class = $newNode->class;
|
|
assert($class instanceof Node\Stmt\Class_);
|
|
assert($class->name === null);
|
|
return new self(
|
|
$newNode->args, $class->extends, $class->implements,
|
|
$class->stmts, $newNode->getAttributes()
|
|
);
|
|
}
|
|
|
|
public function getType(): string {
|
|
return 'Expr_PrintableNewAnonClass';
|
|
}
|
|
|
|
public function getSubNodeNames() : array {
|
|
return ['args', 'extends', 'implements', 'stmts'];
|
|
}
|
|
} |