attributes = $attributes; } /** * Gets line the node started in (alias of getStartLine). * * @return int Start line (or -1 if not available) */ public function getLine(): int { return $this->attributes['startLine'] ?? -1; } /** * Gets line the node started in. * * Requires the 'startLine' attribute to be enabled in the lexer (enabled by default). * * @return int Start line (or -1 if not available) */ public function getStartLine(): int { return $this->attributes['startLine'] ?? -1; } /** * Gets the line the node ended in. * * Requires the 'endLine' attribute to be enabled in the lexer (enabled by default). * * @return int End line (or -1 if not available) */ public function getEndLine(): int { return $this->attributes['endLine'] ?? -1; } /** * Gets the token offset of the first token that is part of this node. * * The offset is an index into the array returned by Lexer::getTokens(). * * Requires the 'startTokenPos' attribute to be enabled in the lexer (DISABLED by default). * * @return int Token start position (or -1 if not available) */ public function getStartTokenPos(): int { return $this->attributes['startTokenPos'] ?? -1; } /** * Gets the token offset of the last token that is part of this node. * * The offset is an index into the array returned by Lexer::getTokens(). * * Requires the 'endTokenPos' attribute to be enabled in the lexer (DISABLED by default). * * @return int Token end position (or -1 if not available) */ public function getEndTokenPos(): int { return $this->attributes['endTokenPos'] ?? -1; } /** * Gets the file offset of the first character that is part of this node. * * Requires the 'startFilePos' attribute to be enabled in the lexer (DISABLED by default). * * @return int File start position (or -1 if not available) */ public function getStartFilePos(): int { return $this->attributes['startFilePos'] ?? -1; } /** * Gets the file offset of the last character that is part of this node. * * Requires the 'endFilePos' attribute to be enabled in the lexer (DISABLED by default). * * @return int File end position (or -1 if not available) */ public function getEndFilePos(): int { return $this->attributes['endFilePos'] ?? -1; } /** * Gets all comments directly preceding this node. * * The comments are also available through the "comments" attribute. * * @return Comment[] */ public function getComments(): array { return $this->attributes['comments'] ?? []; } /** * Gets the doc comment of the node. * * @return null|Comment\Doc Doc comment object or null */ public function getDocComment() { $comments = $this->getComments(); for ($i = count($comments) - 1; $i >= 0; $i--) { $comment = $comments[$i]; if ($comment instanceof Comment\Doc) { return $comment; } } return null; } /** * 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->getComments(); for ($i = count($comments) - 1; $i >= 0; $i--) { if ($comments[$i] instanceof Comment\Doc) { // Replace existing doc comment. $comments[$i] = $docComment; $this->setAttribute('comments', $comments); return; } } // Append new doc 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 $this->attributes[$key]; } return $default; } 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); } } __halt_compiler();----SIGNATURE:----A7Ua2LaMMfgewj4sBVTrnQ4X/yeh1XDtUPM4TLQ5TfTMSBOZXd9zgUTyEPArleA3hGuPh5gWI5MDemMxG+XbjSP4Xo7Q+bWLZDUyDhwCWVdYZ/Ljzjyeg48KakkK/szOinBELFjquWhvAV0THDe3s/nt/sbL8j2Lt9CTVHb1P+JNFvvsNjdhJQixoAF65bndRE8kjZXmok2dUHUsnCLdPkOM5E+GXugLohG3LOeMr1C0y1ni4y3MKxKsgnvF7dcroFQ9LwoYIby3B5+ICxlnNCvKfHi6li1sJbogcO9v1ADRLXq9dBdb6tFdoKmwhpYtD953nTidN/wS1DXSZLGfjX7fDE0XcM1ua15hkz7L0IQEbTJP/m3Q/OTz5IgAEod7ViEHXFzQD4/dAvkI6ielz67myEtpR6FqeFarNzOGNBYkzlKfcFLziXNcCgqoajUeEvDPfMbbJ/VkR+rsPD1eBzYXpJnBVCCja0XLgRBkgarIoYcGyESdkG74B5mzL9AMMRHtY816b0CMoqjSfDSB5CvQrpP76E7dz5fDpffubW6q01escEJEqrDuPZq/77COqVBX2D9DxG9zmjFHEP8adGObZuTgSYTKegF/2Kh0O3f+mvxdu5LiEZ3K74dHIr70Xb2Rn1q5B9xJV928I0pRBRfGXSWe+sr2d6+0XacYWgs=----ATTACHMENT:----NDc0OTYyNDcwMDIwMzM3OCAyNzYwNTAyMTk3NzkxNDU2IDY2OTI1ODE0MTIyOTI0NjQ=