summaryrefslogtreecommitdiff
path: root/vendor/nikic/php-parser/lib/PhpParser/Comment.php
diff options
context:
space:
mode:
Diffstat (limited to 'vendor/nikic/php-parser/lib/PhpParser/Comment.php')
-rw-r--r--vendor/nikic/php-parser/lib/PhpParser/Comment.php239
1 files changed, 239 insertions, 0 deletions
diff --git a/vendor/nikic/php-parser/lib/PhpParser/Comment.php b/vendor/nikic/php-parser/lib/PhpParser/Comment.php
new file mode 100644
index 000000000..61e98d3dc
--- /dev/null
+++ b/vendor/nikic/php-parser/lib/PhpParser/Comment.php
@@ -0,0 +1,239 @@
+<?php declare(strict_types=1);
+
+namespace PhpParser;
+
+class Comment implements \JsonSerializable
+{
+ protected $text;
+ protected $startLine;
+ protected $startFilePos;
+ protected $startTokenPos;
+ protected $endLine;
+ protected $endFilePos;
+ protected $endTokenPos;
+
+ /**
+ * Constructs a comment node.
+ *
+ * @param string $text Comment text (including comment delimiters like /*)
+ * @param int $startLine Line number the comment started on
+ * @param int $startFilePos File offset the comment started on
+ * @param int $startTokenPos Token offset the comment started on
+ */
+ public function __construct(
+ string $text,
+ int $startLine = -1, int $startFilePos = -1, int $startTokenPos = -1,
+ int $endLine = -1, int $endFilePos = -1, int $endTokenPos = -1
+ ) {
+ $this->text = $text;
+ $this->startLine = $startLine;
+ $this->startFilePos = $startFilePos;
+ $this->startTokenPos = $startTokenPos;
+ $this->endLine = $endLine;
+ $this->endFilePos = $endFilePos;
+ $this->endTokenPos = $endTokenPos;
+ }
+
+ /**
+ * Gets the comment text.
+ *
+ * @return string The comment text (including comment delimiters like /*)
+ */
+ public function getText() : string {
+ return $this->text;
+ }
+
+ /**
+ * Gets the line number the comment started on.
+ *
+ * @return int Line number (or -1 if not available)
+ */
+ public function getStartLine() : int {
+ return $this->startLine;
+ }
+
+ /**
+ * Gets the file offset the comment started on.
+ *
+ * @return int File offset (or -1 if not available)
+ */
+ public function getStartFilePos() : int {
+ return $this->startFilePos;
+ }
+
+ /**
+ * Gets the token offset the comment started on.
+ *
+ * @return int Token offset (or -1 if not available)
+ */
+ public function getStartTokenPos() : int {
+ return $this->startTokenPos;
+ }
+
+ /**
+ * Gets the line number the comment ends on.
+ *
+ * @return int Line number (or -1 if not available)
+ */
+ public function getEndLine() : int {
+ return $this->endLine;
+ }
+
+ /**
+ * Gets the file offset the comment ends on.
+ *
+ * @return int File offset (or -1 if not available)
+ */
+ public function getEndFilePos() : int {
+ return $this->endFilePos;
+ }
+
+ /**
+ * Gets the token offset the comment ends on.
+ *
+ * @return int Token offset (or -1 if not available)
+ */
+ public function getEndTokenPos() : int {
+ return $this->endTokenPos;
+ }
+
+ /**
+ * Gets the line number the comment started on.
+ *
+ * @deprecated Use getStartLine() instead
+ *
+ * @return int Line number
+ */
+ public function getLine() : int {
+ return $this->startLine;
+ }
+
+ /**
+ * Gets the file offset the comment started on.
+ *
+ * @deprecated Use getStartFilePos() instead
+ *
+ * @return int File offset
+ */
+ public function getFilePos() : int {
+ return $this->startFilePos;
+ }
+
+ /**
+ * Gets the token offset the comment started on.
+ *
+ * @deprecated Use getStartTokenPos() instead
+ *
+ * @return int Token offset
+ */
+ public function getTokenPos() : int {
+ return $this->startTokenPos;
+ }
+
+ /**
+ * Gets the comment text.
+ *
+ * @return string The comment text (including comment delimiters like /*)
+ */
+ public function __toString() : string {
+ return $this->text;
+ }
+
+ /**
+ * Gets the reformatted comment text.
+ *
+ * "Reformatted" here means that we try to clean up the whitespace at the
+ * starts of the lines. This is necessary because we receive the comments
+ * without trailing whitespace on the first line, but with trailing whitespace
+ * on all subsequent lines.
+ *
+ * @return mixed|string
+ */
+ public function getReformattedText() {
+ $text = trim($this->text);
+ $newlinePos = strpos($text, "\n");
+ if (false === $newlinePos) {
+ // Single line comments don't need further processing
+ return $text;
+ } elseif (preg_match('((*BSR_ANYCRLF)(*ANYCRLF)^.*(?:\R\s+\*.*)+$)', $text)) {
+ // Multi line comment of the type
+ //
+ // /*
+ // * Some text.
+ // * Some more text.
+ // */
+ //
+ // is handled by replacing the whitespace sequences before the * by a single space
+ return preg_replace('(^\s+\*)m', ' *', $this->text);
+ } elseif (preg_match('(^/\*\*?\s*[\r\n])', $text) && preg_match('(\n(\s*)\*/$)', $text, $matches)) {
+ // Multi line comment of the type
+ //
+ // /*
+ // Some text.
+ // Some more text.
+ // */
+ //
+ // is handled by removing the whitespace sequence on the line before the closing
+ // */ on all lines. So if the last line is " */", then " " is removed at the
+ // start of all lines.
+ return preg_replace('(^' . preg_quote($matches[1]) . ')m', '', $text);
+ } elseif (preg_match('(^/\*\*?\s*(?!\s))', $text, $matches)) {
+ // Multi line comment of the type
+ //
+ // /* Some text.
+ // Some more text.
+ // Indented text.
+ // Even more text. */
+ //
+ // is handled by removing the difference between the shortest whitespace prefix on all
+ // lines and the length of the "/* " opening sequence.
+ $prefixLen = $this->getShortestWhitespacePrefixLen(substr($text, $newlinePos + 1));
+ $removeLen = $prefixLen - strlen($matches[0]);
+ return preg_replace('(^\s{' . $removeLen . '})m', '', $text);
+ }
+
+ // No idea how to format this comment, so simply return as is
+ return $text;
+ }
+
+ /**
+ * Get length of shortest whitespace prefix (at the start of a line).
+ *
+ * If there is a line with no prefix whitespace, 0 is a valid return value.
+ *
+ * @param string $str String to check
+ * @return int Length in characters. Tabs count as single characters.
+ */
+ private function getShortestWhitespacePrefixLen(string $str) : int {
+ $lines = explode("\n", $str);
+ $shortestPrefixLen = \INF;
+ foreach ($lines as $line) {
+ preg_match('(^\s*)', $line, $matches);
+ $prefixLen = strlen($matches[0]);
+ if ($prefixLen < $shortestPrefixLen) {
+ $shortestPrefixLen = $prefixLen;
+ }
+ }
+ return $shortestPrefixLen;
+ }
+
+ /**
+ * @return array
+ * @psalm-return array{nodeType:string, text:mixed, line:mixed, filePos:mixed}
+ */
+ public function jsonSerialize() : array {
+ // Technically not a node, but we make it look like one anyway
+ $type = $this instanceof Comment\Doc ? 'Comment_Doc' : 'Comment';
+ return [
+ 'nodeType' => $type,
+ 'text' => $this->text,
+ // TODO: Rename these to include "start".
+ 'line' => $this->startLine,
+ 'filePos' => $this->startFilePos,
+ 'tokenPos' => $this->startTokenPos,
+ 'endLine' => $this->endLine,
+ 'endFilePos' => $this->endFilePos,
+ 'endTokenPos' => $this->endTokenPos,
+ ];
+ }
+}