1<?php 2 3declare(strict_types=1); 4 5namespace PhpParser\Builder; 6 7use PhpParser; 8use PhpParser\BuilderHelpers; 9use PhpParser\Modifiers; 10use PhpParser\Node; 11use PhpParser\Node\Const_; 12use PhpParser\Node\Identifier; 13use PhpParser\Node\Stmt; 14 15class ClassConst implements PhpParser\Builder { 16 protected int $flags = 0; 17 /** @var array<string, mixed> */ 18 protected array $attributes = []; 19 /** @var list<Const_> */ 20 protected array $constants = []; 21 22 /** @var list<Node\AttributeGroup> */ 23 protected array $attributeGroups = []; 24 /** @var Identifier|Node\Name|Node\ComplexType|null */ 25 protected ?Node $type = null; 26 27 /** 28 * Creates a class constant builder 29 * 30 * @param string|Identifier $name Name 31 * @param Node\Expr|bool|null|int|float|string|array|\UnitEnum $value Value 32 */ 33 public function __construct($name, $value) { 34 $this->constants = [new Const_($name, BuilderHelpers::normalizeValue($value))]; 35 } 36 37 /** 38 * Add another constant to const group 39 * 40 * @param string|Identifier $name Name 41 * @param Node\Expr|bool|null|int|float|string|array|\UnitEnum $value Value 42 * 43 * @return $this The builder instance (for fluid interface) 44 */ 45 public function addConst($name, $value) { 46 $this->constants[] = new Const_($name, BuilderHelpers::normalizeValue($value)); 47 48 return $this; 49 } 50 51 /** 52 * Makes the constant public. 53 * 54 * @return $this The builder instance (for fluid interface) 55 */ 56 public function makePublic() { 57 $this->flags = BuilderHelpers::addModifier($this->flags, Modifiers::PUBLIC); 58 59 return $this; 60 } 61 62 /** 63 * Makes the constant protected. 64 * 65 * @return $this The builder instance (for fluid interface) 66 */ 67 public function makeProtected() { 68 $this->flags = BuilderHelpers::addModifier($this->flags, Modifiers::PROTECTED); 69 70 return $this; 71 } 72 73 /** 74 * Makes the constant private. 75 * 76 * @return $this The builder instance (for fluid interface) 77 */ 78 public function makePrivate() { 79 $this->flags = BuilderHelpers::addModifier($this->flags, Modifiers::PRIVATE); 80 81 return $this; 82 } 83 84 /** 85 * Makes the constant final. 86 * 87 * @return $this The builder instance (for fluid interface) 88 */ 89 public function makeFinal() { 90 $this->flags = BuilderHelpers::addModifier($this->flags, Modifiers::FINAL); 91 92 return $this; 93 } 94 95 /** 96 * Sets doc comment for the constant. 97 * 98 * @param PhpParser\Comment\Doc|string $docComment Doc comment to set 99 * 100 * @return $this The builder instance (for fluid interface) 101 */ 102 public function setDocComment($docComment) { 103 $this->attributes = [ 104 'comments' => [BuilderHelpers::normalizeDocComment($docComment)] 105 ]; 106 107 return $this; 108 } 109 110 /** 111 * Adds an attribute group. 112 * 113 * @param Node\Attribute|Node\AttributeGroup $attribute 114 * 115 * @return $this The builder instance (for fluid interface) 116 */ 117 public function addAttribute($attribute) { 118 $this->attributeGroups[] = BuilderHelpers::normalizeAttribute($attribute); 119 120 return $this; 121 } 122 123 /** 124 * Sets the constant type. 125 * 126 * @param string|Node\Name|Identifier|Node\ComplexType $type 127 * 128 * @return $this 129 */ 130 public function setType($type) { 131 $this->type = BuilderHelpers::normalizeType($type); 132 133 return $this; 134 } 135 136 /** 137 * Returns the built class node. 138 * 139 * @return Stmt\ClassConst The built constant node 140 */ 141 public function getNode(): PhpParser\Node { 142 return new Stmt\ClassConst( 143 $this->constants, 144 $this->flags, 145 $this->attributes, 146 $this->attributeGroups, 147 $this->type 148 ); 149 } 150} 151