1<?php
2
3declare(strict_types=1);
4
5namespace PhpParser\Builder;
6
7use PhpParser;
8use PhpParser\BuilderHelpers;
9use PhpParser\Node;
10use PhpParser\Node\Identifier;
11use PhpParser\Node\Stmt;
12
13class EnumCase implements PhpParser\Builder {
14    /** @var Identifier|string */
15    protected $name;
16    protected ?Node\Expr $value = null;
17    /** @var array<string, mixed> */
18    protected array $attributes = [];
19
20    /** @var list<Node\AttributeGroup> */
21    protected array $attributeGroups = [];
22
23    /**
24     * Creates an enum case builder.
25     *
26     * @param string|Identifier $name Name
27     */
28    public function __construct($name) {
29        $this->name = $name;
30    }
31
32    /**
33     * Sets the value.
34     *
35     * @param Node\Expr|string|int $value
36     *
37     * @return $this
38     */
39    public function setValue($value) {
40        $this->value = BuilderHelpers::normalizeValue($value);
41
42        return $this;
43    }
44
45    /**
46     * Sets doc comment for the constant.
47     *
48     * @param PhpParser\Comment\Doc|string $docComment Doc comment to set
49     *
50     * @return $this The builder instance (for fluid interface)
51     */
52    public function setDocComment($docComment) {
53        $this->attributes = [
54            'comments' => [BuilderHelpers::normalizeDocComment($docComment)]
55        ];
56
57        return $this;
58    }
59
60    /**
61     * Adds an attribute group.
62     *
63     * @param Node\Attribute|Node\AttributeGroup $attribute
64     *
65     * @return $this The builder instance (for fluid interface)
66     */
67    public function addAttribute($attribute) {
68        $this->attributeGroups[] = BuilderHelpers::normalizeAttribute($attribute);
69
70        return $this;
71    }
72
73    /**
74     * Returns the built enum case node.
75     *
76     * @return Stmt\EnumCase The built constant node
77     */
78    public function getNode(): PhpParser\Node {
79        return new Stmt\EnumCase(
80            $this->name,
81            $this->value,
82            $this->attributeGroups,
83            $this->attributes
84        );
85    }
86}
87