protected function _functionNode()
{
$node = new FunctionDef();
$token = $this->_stream->current(true);
$parent = $this->_states['current'];
$body = $token[1];
$name = substr($this->_stream->next('('), 0, -1);
$body .= $name;
$node->name = trim($name);
$args = $this->_parseArgs();
$node->args = $args['args'];
$body .= $args['body'] . $this->_stream->next([';', '{']);
if ($parent) {
$isMethod = $parent->hasMethods;
if ($parent->type === 'interface') {
$node->type = 'signature';
}
} else {
$isMethod = false;
}
$node->isMethod = $isMethod;
$node->isClosure = !$node->name;
if ($isMethod) {
$node->visibility = $this->_states['visibility'];
$this->_states['visibility'] = [];
}
$node->body = $body;
$this->_codeNode();
$this->_states['body'] = $body;
$this->_contextualize($node);
// Looking for curly brackets only if not an "abstract function"
if ($this->_stream->current() === '{') {
$this->_states['current'] = $node;
}
return $node->function = $node;
}