1 <?php declare(strict_types=1);
5 use PhpParser\Node\Arg;
6 use PhpParser\Node\Expr;
7 use PhpParser\Node\Expr\BinaryOp\Concat;
8 use PhpParser\Node\Identifier;
9 use PhpParser\Node\Name;
10 use PhpParser\Node\Scalar\String_;
11 use PhpParser\Node\Stmt;
12 use PhpParser\Node\Stmt\Use_;
17 * Creates a namespace builder.
19 * @param null|string|Node\Name $name Name of the namespace
21 * @return Builder\Namespace_ The created namespace builder
23 public function namespace($name) : Builder\Namespace_ {
24 return new Builder\Namespace_($name);
28 * Creates a class builder.
30 * @param string $name Name of the class
32 * @return Builder\Class_ The created class builder
34 public function class(string $name) : Builder\Class_ {
35 return new Builder\Class_($name);
39 * Creates an interface builder.
41 * @param string $name Name of the interface
43 * @return Builder\Interface_ The created interface builder
45 public function interface(string $name) : Builder\Interface_ {
46 return new Builder\Interface_($name);
50 * Creates a trait builder.
52 * @param string $name Name of the trait
54 * @return Builder\Trait_ The created trait builder
56 public function trait(string $name) : Builder\Trait_ {
57 return new Builder\Trait_($name);
61 * Creates a trait use builder.
63 * @param Node\Name|string ...$traits Trait names
65 * @return Builder\TraitUse The create trait use builder
67 public function useTrait(...$traits) : Builder\TraitUse {
68 return new Builder\TraitUse(...$traits);
72 * Creates a trait use adaptation builder.
74 * @param Node\Name|string|null $trait Trait name
75 * @param Node\Identifier|string $method Method name
77 * @return Builder\TraitUseAdaptation The create trait use adaptation builder
79 public function traitUseAdaptation($trait, $method = null) : Builder\TraitUseAdaptation {
80 if (is_null($method)) {
85 return new Builder\TraitUseAdaptation($trait, $method);
89 * Creates a method builder.
91 * @param string $name Name of the method
93 * @return Builder\Method The created method builder
95 public function method(string $name) : Builder\Method {
96 return new Builder\Method($name);
100 * Creates a parameter builder.
102 * @param string $name Name of the parameter
104 * @return Builder\Param The created parameter builder
106 public function param(string $name) : Builder\Param {
107 return new Builder\Param($name);
111 * Creates a property builder.
113 * @param string $name Name of the property
115 * @return Builder\Property The created property builder
117 public function property(string $name) : Builder\Property {
118 return new Builder\Property($name);
122 * Creates a function builder.
124 * @param string $name Name of the function
126 * @return Builder\Function_ The created function builder
128 public function function(string $name) : Builder\Function_ {
129 return new Builder\Function_($name);
133 * Creates a namespace/class use builder.
135 * @param Node\Name|string $name Name of the entity (namespace or class) to alias
137 * @return Builder\Use_ The created use builder
139 public function use($name) : Builder\Use_ {
140 return new Builder\Use_($name, Use_::TYPE_NORMAL);
144 * Creates a function use builder.
146 * @param Node\Name|string $name Name of the function to alias
148 * @return Builder\Use_ The created use function builder
150 public function useFunction($name) : Builder\Use_ {
151 return new Builder\Use_($name, Use_::TYPE_FUNCTION);
155 * Creates a constant use builder.
157 * @param Node\Name|string $name Name of the const to alias
159 * @return Builder\Use_ The created use const builder
161 public function useConst($name) : Builder\Use_ {
162 return new Builder\Use_($name, Use_::TYPE_CONSTANT);
166 * Creates node a for a literal value.
168 * @param Expr|bool|null|int|float|string|array $value $value
172 public function val($value) : Expr {
173 return BuilderHelpers::normalizeValue($value);
177 * Creates variable node.
179 * @param string|Expr $name Name
181 * @return Expr\Variable
183 public function var($name) : Expr\Variable {
184 if (!\is_string($name) && !$name instanceof Expr) {
185 throw new \LogicException('Variable name must be string or Expr');
188 return new Expr\Variable($name);
192 * Normalizes an argument list.
194 * Creates Arg nodes for all arguments and converts literal values to expressions.
196 * @param array $args List of arguments to normalize
200 public function args(array $args) : array {
201 $normalizedArgs = [];
202 foreach ($args as $arg) {
203 if ($arg instanceof Arg) {
204 $normalizedArgs[] = $arg;
206 $normalizedArgs[] = new Arg(BuilderHelpers::normalizeValue($arg));
209 return $normalizedArgs;
213 * Creates a function call node.
215 * @param string|Name|Expr $name Function name
216 * @param array $args Function arguments
218 * @return Expr\FuncCall
220 public function funcCall($name, array $args = []) : Expr\FuncCall {
221 return new Expr\FuncCall(
222 BuilderHelpers::normalizeNameOrExpr($name),
228 * Creates a method call node.
230 * @param Expr $var Variable the method is called on
231 * @param string|Identifier|Expr $name Method name
232 * @param array $args Method arguments
234 * @return Expr\MethodCall
236 public function methodCall(Expr $var, $name, array $args = []) : Expr\MethodCall {
237 return new Expr\MethodCall(
239 BuilderHelpers::normalizeIdentifierOrExpr($name),
245 * Creates a static method call node.
247 * @param string|Name|Expr $class Class name
248 * @param string|Identifier|Expr $name Method name
249 * @param array $args Method arguments
251 * @return Expr\StaticCall
253 public function staticCall($class, $name, array $args = []) : Expr\StaticCall {
254 return new Expr\StaticCall(
255 BuilderHelpers::normalizeNameOrExpr($class),
256 BuilderHelpers::normalizeIdentifierOrExpr($name),
262 * Creates an object creation node.
264 * @param string|Name|Expr $class Class name
265 * @param array $args Constructor arguments
269 public function new($class, array $args = []) : Expr\New_ {
270 return new Expr\New_(
271 BuilderHelpers::normalizeNameOrExpr($class),
277 * Creates a constant fetch node.
279 * @param string|Name $name Constant name
281 * @return Expr\ConstFetch
283 public function constFetch($name) : Expr\ConstFetch {
284 return new Expr\ConstFetch(BuilderHelpers::normalizeName($name));
288 * Creates a property fetch node.
290 * @param Expr $var Variable holding object
291 * @param string|Identifier|Expr $name Property name
293 * @return Expr\PropertyFetch
295 public function propertyFetch(Expr $var, $name) : Expr\PropertyFetch {
296 return new Expr\PropertyFetch($var, BuilderHelpers::normalizeIdentifierOrExpr($name));
300 * Creates a class constant fetch node.
302 * @param string|Name|Expr $class Class name
303 * @param string|Identifier $name Constant name
305 * @return Expr\ClassConstFetch
307 public function classConstFetch($class, $name): Expr\ClassConstFetch {
308 return new Expr\ClassConstFetch(
309 BuilderHelpers::normalizeNameOrExpr($class),
310 BuilderHelpers::normalizeIdentifier($name)
315 * Creates nested Concat nodes from a list of expressions.
317 * @param Expr|string ...$exprs Expressions or literal strings
321 public function concat(...$exprs) : Concat {
322 $numExprs = count($exprs);
324 throw new \LogicException('Expected at least two expressions');
327 $lastConcat = $this->normalizeStringExpr($exprs[0]);
328 for ($i = 1; $i < $numExprs; $i++) {
329 $lastConcat = new Concat($lastConcat, $this->normalizeStringExpr($exprs[$i]));
335 * @param string|Expr $expr
338 private function normalizeStringExpr($expr) : Expr {
339 if ($expr instanceof Expr) {
343 if (\is_string($expr)) {
344 return new String_($expr);
347 throw new \LogicException('Expected string or Expr');