| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146 | <?php declare(strict_types=1);namespace PhpParser\Builder;use PhpParser;use PhpParser\BuilderHelpers;use PhpParser\Node;use PhpParser\Node\Stmt;class Method extends FunctionLike{    protected $name;    protected $flags = 0;    /** @var array|null */    protected $stmts = [];    /** @var Node\AttributeGroup[] */    protected $attributeGroups = [];    /**     * Creates a method builder.     *     * @param string $name Name of the method     */    public function __construct(string $name) {        $this->name = $name;    }    /**     * Makes the method public.     *     * @return $this The builder instance (for fluid interface)     */    public function makePublic() {        $this->flags = BuilderHelpers::addModifier($this->flags, Stmt\Class_::MODIFIER_PUBLIC);        return $this;    }    /**     * Makes the method protected.     *     * @return $this The builder instance (for fluid interface)     */    public function makeProtected() {        $this->flags = BuilderHelpers::addModifier($this->flags, Stmt\Class_::MODIFIER_PROTECTED);        return $this;    }    /**     * Makes the method private.     *     * @return $this The builder instance (for fluid interface)     */    public function makePrivate() {        $this->flags = BuilderHelpers::addModifier($this->flags, Stmt\Class_::MODIFIER_PRIVATE);        return $this;    }    /**     * Makes the method static.     *     * @return $this The builder instance (for fluid interface)     */    public function makeStatic() {        $this->flags = BuilderHelpers::addModifier($this->flags, Stmt\Class_::MODIFIER_STATIC);        return $this;    }    /**     * Makes the method abstract.     *     * @return $this The builder instance (for fluid interface)     */    public function makeAbstract() {        if (!empty($this->stmts)) {            throw new \LogicException('Cannot make method with statements abstract');        }        $this->flags = BuilderHelpers::addModifier($this->flags, Stmt\Class_::MODIFIER_ABSTRACT);        $this->stmts = null; // abstract methods don't have statements        return $this;    }    /**     * Makes the method final.     *     * @return $this The builder instance (for fluid interface)     */    public function makeFinal() {        $this->flags = BuilderHelpers::addModifier($this->flags, Stmt\Class_::MODIFIER_FINAL);        return $this;    }    /**     * Adds a statement.     *     * @param Node|PhpParser\Builder $stmt The statement to add     *     * @return $this The builder instance (for fluid interface)     */    public function addStmt($stmt) {        if (null === $this->stmts) {            throw new \LogicException('Cannot add statements to an abstract method');        }        $this->stmts[] = BuilderHelpers::normalizeStmt($stmt);        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 method node.     *     * @return Stmt\ClassMethod The built method node     */    public function getNode() : Node {        return new Stmt\ClassMethod($this->name, [            'flags'      => $this->flags,            'byRef'      => $this->returnByRef,            'params'     => $this->params,            'returnType' => $this->returnType,            'stmts'      => $this->stmts,            'attrGroups' => $this->attributeGroups,        ], $this->attributes);    }}
 |