-
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathFunctionDataAccessor.php
57 lines (48 loc) · 1.51 KB
/
FunctionDataAccessor.php
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
<?php
/*
* This file is part of the Symfony package.
*
* (c) Fabien Potencier <fabien@symfony.com>
*
* For the full copyright and license information, please view the LICENSE
* file that was distributed with this source code.
*/
namespace Symfony\Component\JsonStreamer\DataModel;
use PhpParser\BuilderFactory;
use PhpParser\Node\Expr;
/**
* Defines the way to access data using a function (or a method).
*
* @author Mathias Arlaud <mathias.arlaud@gmail.com>
*
* @internal
*/
final class FunctionDataAccessor implements DataAccessorInterface
{
/**
* @param list<DataAccessorInterface> $arguments
*/
public function __construct(
private string $functionName,
private array $arguments,
private ?DataAccessorInterface $objectAccessor = null,
) {
}
public function getObjectAccessor(): ?DataAccessorInterface
{
return $this->objectAccessor;
}
public function withObjectAccessor(?DataAccessorInterface $accessor): self
{
return new self($this->functionName, $this->arguments, $accessor);
}
public function toPhpExpr(): Expr
{
$builder = new BuilderFactory();
$arguments = array_map(static fn (DataAccessorInterface $argument): Expr => $argument->toPhpExpr(), $this->arguments);
if (null === $this->objectAccessor) {
return $builder->funcCall($this->functionName, $arguments);
}
return $builder->methodCall($this->objectAccessor->toPhpExpr(), $this->functionName, $arguments);
}
}