/**
* Formats PHP code for class instantiating, function calling or property setting in PHP.
* @return string
*/
private function formatStatement(Statement $statement)
{
$entity = $statement->getEntity();
$arguments = $statement->arguments;
if (is_string($entity) && Strings::contains($entity, '?')) {
// PHP literal
return $this->formatPhp($entity, $arguments);
} elseif ($service = $this->builder->getServiceName($entity)) {
// factory calling
return $this->formatPhp('$this->?(?*)', [Container::getMethodName($service), $arguments]);
} elseif ($entity === 'not') {
// operator
return $this->formatPhp('!?', [$arguments[0]]);
} elseif (is_string($entity)) {
// class name
return $this->formatPhp("new {$entity}" . ($arguments ? '(?*)' : ''), [$arguments]);
} elseif ($entity[0] === '') {
// globalFunc
return $this->formatPhp("{$entity['1']}(?*)", [$arguments]);
} elseif ($entity[0] instanceof Statement) {
$inner = $this->formatPhp('?', [$entity[0]]);
if (substr($inner, 0, 4) === 'new ') {
$inner = "({$inner})";
}
return $this->formatPhp("{$inner}->?(?*)", [$entity[1], $arguments]);
} elseif ($entity[1][0] === '$') {
// property getter, setter or appender
$name = substr($entity[1], 1);
if ($append = substr($name, -2) === '[]') {
$name = substr($name, 0, -2);
}
if ($this->builder->getServiceName($entity[0])) {
$prop = $this->formatPhp('?->?', [$entity[0], $name]);
} else {
$prop = $this->formatPhp($entity[0] . '::$?', [$name]);
}
return $arguments ? $this->formatPhp($prop . ($append ? '[]' : '') . ' = ?', [$arguments[0]]) : $prop;
} elseif ($service = $this->builder->getServiceName($entity[0])) {
// service method
return $this->formatPhp('?->?(?*)', [$entity[0], $entity[1], $arguments]);
} else {
// static method
return $this->formatPhp("{$entity['0']}::{$entity['1']}(?*)", [$arguments]);
}
}