attributes = $attributes; } /** * Gets the type of the node. * * @return string Type of the node */ public function getType() : string { return strtr(substr(rtrim(get_class($this), '_'), 15), '\\', '_'); } /** * Gets line the node started in. * * @return int Line */ public function getLine() : int { return $this->getAttribute('startLine', -1); } /** * Sets line the node started in. * * @param int $line Line */ public function setLine(int $line) { $this->setAttribute('startLine', (int) $line); } /** * Gets the doc comment of the node. * * The doc comment has to be the last comment associated with the node. * * @return null|Comment\Doc Doc comment object or null */ public function getDocComment() { $comments = $this->getAttribute('comments'); if (!$comments) { return null; } $lastComment = $comments[count($comments) - 1]; if (!$lastComment instanceof Comment\Doc) { return null; } return $lastComment; } /** * Sets the doc comment of the node. * * This will either replace an existing doc comment or add it to the comments array. * * @param Comment\Doc $docComment Doc comment to set */ public function setDocComment(Comment\Doc $docComment) { $comments = $this->getAttribute('comments', []); $numComments = count($comments); if ($numComments > 0 && $comments[$numComments - 1] instanceof Comment\Doc) { // Replace existing doc comment $comments[$numComments - 1] = $docComment; } else { // Append new comment $comments[] = $docComment; } $this->setAttribute('comments', $comments); } public function setAttribute(string $key, $value) { $this->attributes[$key] = $value; } public function hasAttribute(string $key) : bool { return array_key_exists($key, $this->attributes); } public function &getAttribute(string $key, $default = null) { if (!array_key_exists($key, $this->attributes)) { return $default; } else { return $this->attributes[$key]; } } public function getAttributes() : array { return $this->attributes; } public function setAttributes(array $attributes) { $this->attributes = $attributes; } /** * @return array */ public function jsonSerialize() : array { return ['nodeType' => $this->getType()] + get_object_vars($this); } }