X-Git-Url: http://aleph1.co.uk/gitweb/?a=blobdiff_plain;f=vendor%2Fnikic%2Fphp-parser%2Flib%2FPhpParser%2FLexer.php;h=125c3b806e2ae6bf3be33cac44577f890c82b6ad;hb=052617e40b525f8b817d84c29b1c04951f427069;hp=75d3f35a39539699407b70e37445e0205271acc7;hpb=9917807b03b64faf00f6a1f29dcb6eafc454efa5;p=yaffs-website diff --git a/vendor/nikic/php-parser/lib/PhpParser/Lexer.php b/vendor/nikic/php-parser/lib/PhpParser/Lexer.php index 75d3f35a3..125c3b806 100644 --- a/vendor/nikic/php-parser/lib/PhpParser/Lexer.php +++ b/vendor/nikic/php-parser/lib/PhpParser/Lexer.php @@ -1,4 +1,4 @@ -tokenMap = $this->createTokenMap(); // map of tokens to drop while lexing (the map is only used for isset lookup, // that's why the value is simply set to 1; the value is never actually used.) $this->dropTokens = array_fill_keys( - array(T_WHITESPACE, T_OPEN_TAG, T_COMMENT, T_DOC_COMMENT), 1 + [\T_WHITESPACE, \T_OPEN_TAG, \T_COMMENT, \T_DOC_COMMENT], 1 ); // the usedAttributes member is a map of the used attribute names to a dummy // value (here "true") - $options += array( - 'usedAttributes' => array('comments', 'startLine', 'endLine'), - ); + $options += [ + 'usedAttributes' => ['comments', 'startLine', 'endLine'], + ]; $this->usedAttributes = array_fill_keys($options['usedAttributes'], true); } @@ -55,7 +55,7 @@ class Lexer * @param ErrorHandler|null $errorHandler Error handler to use for lexing errors. Defaults to * ErrorHandler\Throwing */ - public function startLexing($code, ErrorHandler $errorHandler = null) { + public function startLexing(string $code, ErrorHandler $errorHandler = null) { if (null === $errorHandler) { $errorHandler = new ErrorHandler\Throwing(); } @@ -71,7 +71,7 @@ class Lexer $scream = ini_set('xdebug.scream', '0'); - $this->resetErrors(); + error_clear_last(); $this->tokens = @token_get_all($code); $this->handleErrors($errorHandler); @@ -80,17 +80,6 @@ class Lexer } } - protected function resetErrors() { - if (function_exists('error_clear_last')) { - error_clear_last(); - } else { - // set error_get_last() to defined state by forcing an undefined variable error - set_error_handler(function() { return false; }, 0); - @$undefinedVariable; - restore_error_handler(); - } - } - private function handleInvalidCharacterRange($start, $end, $line, ErrorHandler $errorHandler) { for ($i = $start; $i < $end; $i++) { $chr = $this->code[$i]; @@ -117,22 +106,30 @@ class Lexer } } - private function isUnterminatedComment($token) { - return ($token[0] === T_COMMENT || $token[0] === T_DOC_COMMENT) + /** + * Check whether comment token is unterminated. + * + * @return bool + */ + private function isUnterminatedComment($token) : bool { + return ($token[0] === \T_COMMENT || $token[0] === \T_DOC_COMMENT) && substr($token[1], 0, 2) === '/*' && substr($token[1], -2) !== '*/'; } - private function errorMayHaveOccurred() { + /** + * Check whether an error *may* have occurred during tokenization. + * + * @return bool + */ + private function errorMayHaveOccurred() : bool { if (defined('HHVM_VERSION')) { // In HHVM token_get_all() does not throw warnings, so we need to conservatively // assume that an error occurred return true; } - $error = error_get_last(); - return null !== $error - && false === strpos($error['message'], 'Undefined variable'); + return null !== error_get_last(); } protected function handleErrors(ErrorHandler $errorHandler) { @@ -147,7 +144,7 @@ class Lexer $filePos = 0; $line = 1; - foreach ($this->tokens as $i => $token) { + foreach ($this->tokens as $token) { $tokenValue = \is_string($token) ? $token : $token[1]; $tokenLen = \strlen($tokenValue); @@ -156,7 +153,7 @@ class Lexer $nextFilePos = strpos($this->code, $tokenValue, $filePos); $this->handleInvalidCharacterRange( $filePos, $nextFilePos, $line, $errorHandler); - $filePos = $nextFilePos; + $filePos = (int) $nextFilePos; } $filePos += $tokenLen; @@ -176,7 +173,7 @@ class Lexer // Emulate the PHP behavior $isDocComment = isset($comment[3]) && $comment[3] === '*'; - $this->tokens[] = [$isDocComment ? T_DOC_COMMENT : T_COMMENT, $comment, $line]; + $this->tokens[] = [$isDocComment ? \T_DOC_COMMENT : \T_COMMENT, $comment, $line]; } else { // Invalid characters at the end of the input $this->handleInvalidCharacterRange( @@ -221,9 +218,9 @@ class Lexer * * @return int Token id */ - public function getNextToken(&$value = null, &$startAttributes = null, &$endAttributes = null) { - $startAttributes = array(); - $endAttributes = array(); + public function getNextToken(&$value = null, &$startAttributes = null, &$endAttributes = null) : int { + $startAttributes = []; + $endAttributes = []; while (1) { if (isset($this->tokens[++$this->pos])) { @@ -256,20 +253,20 @@ class Lexer } elseif (!isset($this->dropTokens[$token[0]])) { $value = $token[1]; $id = $this->tokenMap[$token[0]]; - if (T_CLOSE_TAG === $token[0]) { + if (\T_CLOSE_TAG === $token[0]) { $this->prevCloseTagHasNewline = false !== strpos($token[1], "\n"); - } else if (T_INLINE_HTML === $token[0]) { + } elseif (\T_INLINE_HTML === $token[0]) { $startAttributes['hasLeadingNewline'] = $this->prevCloseTagHasNewline; } $this->line += substr_count($value, "\n"); $this->filePos += \strlen($value); } else { - if (T_COMMENT === $token[0] || T_DOC_COMMENT === $token[0]) { + if (\T_COMMENT === $token[0] || \T_DOC_COMMENT === $token[0]) { if (isset($this->usedAttributes['comments'])) { - $comment = T_DOC_COMMENT === $token[0] - ? new Comment\Doc($token[1], $this->line, $this->filePos) - : new Comment($token[1], $this->line, $this->filePos); + $comment = \T_DOC_COMMENT === $token[0] + ? new Comment\Doc($token[1], $this->line, $this->filePos, $this->pos) + : new Comment($token[1], $this->line, $this->filePos, $this->pos); $startAttributes['comments'][] = $comment; } } @@ -305,7 +302,7 @@ class Lexer * * @return array Array of tokens in token_get_all() format */ - public function getTokens() { + public function getTokens() : array { return $this->tokens; } @@ -314,7 +311,7 @@ class Lexer * * @return string Remaining text */ - public function handleHaltCompiler() { + public function handleHaltCompiler() : string { // text after T_HALT_COMPILER, still including (); $textAfter = substr($this->code, $this->filePos); @@ -329,7 +326,7 @@ class Lexer $this->pos = count($this->tokens); // return with (); removed - return (string) substr($textAfter, strlen($matches[0])); // (string) converts false to '' + return substr($textAfter, strlen($matches[0])); } /** @@ -341,26 +338,26 @@ class Lexer * * @return array The token map */ - protected function createTokenMap() { - $tokenMap = array(); + protected function createTokenMap() : array { + $tokenMap = []; // 256 is the minimum possible token number, as everything below // it is an ASCII value for ($i = 256; $i < 1000; ++$i) { - if (T_DOUBLE_COLON === $i) { + if (\T_DOUBLE_COLON === $i) { // T_DOUBLE_COLON is equivalent to T_PAAMAYIM_NEKUDOTAYIM $tokenMap[$i] = Tokens::T_PAAMAYIM_NEKUDOTAYIM; - } elseif(T_OPEN_TAG_WITH_ECHO === $i) { + } elseif(\T_OPEN_TAG_WITH_ECHO === $i) { // T_OPEN_TAG_WITH_ECHO with dropped T_OPEN_TAG results in T_ECHO $tokenMap[$i] = Tokens::T_ECHO; - } elseif(T_CLOSE_TAG === $i) { + } elseif(\T_CLOSE_TAG === $i) { // T_CLOSE_TAG is equivalent to ';' $tokenMap[$i] = ord(';'); } elseif ('UNKNOWN' !== $name = token_name($i)) { if ('T_HASHBANG' === $name) { // HHVM uses a special token for #! hashbang lines $tokenMap[$i] = Tokens::T_INLINE_HTML; - } else if (defined($name = Tokens::class . '::' . $name)) { + } elseif (defined($name = Tokens::class . '::' . $name)) { // Other tokens can be mapped directly $tokenMap[$i] = constant($name); } @@ -369,11 +366,11 @@ class Lexer // HHVM uses a special token for numbers that overflow to double if (defined('T_ONUMBER')) { - $tokenMap[T_ONUMBER] = Tokens::T_DNUMBER; + $tokenMap[\T_ONUMBER] = Tokens::T_DNUMBER; } // HHVM also has a separate token for the __COMPILER_HALT_OFFSET__ constant if (defined('T_COMPILER_HALT_OFFSET')) { - $tokenMap[T_COMPILER_HALT_OFFSET] = Tokens::T_STRING; + $tokenMap[\T_COMPILER_HALT_OFFSET] = Tokens::T_STRING; } return $tokenMap;