| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149 | <?php declare(strict_types=1);namespace PhpParser\Builder;use PhpParser;use PhpParser\BuilderHelpers;use PhpParser\Modifiers;use PhpParser\Node;class Param implements PhpParser\Builder {    protected string $name;    protected ?Node\Expr $default = null;    /** @var Node\Identifier|Node\Name|Node\ComplexType|null */    protected ?Node $type = null;    protected bool $byRef = false;    protected int $flags = 0;    protected bool $variadic = false;    /** @var list<Node\AttributeGroup> */    protected array $attributeGroups = [];    /**     * Creates a parameter builder.     *     * @param string $name Name of the parameter     */    public function __construct(string $name) {        $this->name = $name;    }    /**     * Sets default value for the parameter.     *     * @param mixed $value Default value to use     *     * @return $this The builder instance (for fluid interface)     */    public function setDefault($value) {        $this->default = BuilderHelpers::normalizeValue($value);        return $this;    }    /**     * Sets type for the parameter.     *     * @param string|Node\Name|Node\Identifier|Node\ComplexType $type Parameter type     *     * @return $this The builder instance (for fluid interface)     */    public function setType($type) {        $this->type = BuilderHelpers::normalizeType($type);        if ($this->type == 'void') {            throw new \LogicException('Parameter type cannot be void');        }        return $this;    }    /**     * Make the parameter accept the value by reference.     *     * @return $this The builder instance (for fluid interface)     */    public function makeByRef() {        $this->byRef = true;        return $this;    }    /**     * Make the parameter variadic     *     * @return $this The builder instance (for fluid interface)     */    public function makeVariadic() {        $this->variadic = true;        return $this;    }    /**     * Makes the (promoted) parameter public.     *     * @return $this The builder instance (for fluid interface)     */    public function makePublic() {        $this->flags = BuilderHelpers::addModifier($this->flags, Modifiers::PUBLIC);        return $this;    }    /**     * Makes the (promoted) parameter protected.     *     * @return $this The builder instance (for fluid interface)     */    public function makeProtected() {        $this->flags = BuilderHelpers::addModifier($this->flags, Modifiers::PROTECTED);        return $this;    }    /**     * Makes the (promoted) parameter private.     *     * @return $this The builder instance (for fluid interface)     */    public function makePrivate() {        $this->flags = BuilderHelpers::addModifier($this->flags, Modifiers::PRIVATE);        return $this;    }    /**     * Makes the (promoted) parameter readonly.     *     * @return $this The builder instance (for fluid interface)     */    public function makeReadonly() {        $this->flags = BuilderHelpers::addModifier($this->flags, Modifiers::READONLY);        return $this;    }    /**     * Adds an attribute group.     *     * @param Node\Attribute|Node\AttributeGroup $attribute     *     * @return $this The builder instance (for fluid interface)     */    public function addAttribute($attribute) {        $this->attributeGroups[] = BuilderHelpers::normalizeAttribute($attribute);        return $this;    }    /**     * Returns the built parameter node.     *     * @return Node\Param The built parameter node     */    public function getNode(): Node {        return new Node\Param(            new Node\Expr\Variable($this->name),            $this->default, $this->type, $this->byRef, $this->variadic, [], $this->flags, $this->attributeGroups        );    }}
 |