summaryrefslogtreecommitdiff
path: root/vendor/nikic/php-parser/lib/PhpParser/Lexer/TokenEmulator/KeywordEmulator.php
diff options
context:
space:
mode:
Diffstat (limited to 'vendor/nikic/php-parser/lib/PhpParser/Lexer/TokenEmulator/KeywordEmulator.php')
-rw-r--r--vendor/nikic/php-parser/lib/PhpParser/Lexer/TokenEmulator/KeywordEmulator.php62
1 files changed, 62 insertions, 0 deletions
diff --git a/vendor/nikic/php-parser/lib/PhpParser/Lexer/TokenEmulator/KeywordEmulator.php b/vendor/nikic/php-parser/lib/PhpParser/Lexer/TokenEmulator/KeywordEmulator.php
new file mode 100644
index 000000000..ea261cc17
--- /dev/null
+++ b/vendor/nikic/php-parser/lib/PhpParser/Lexer/TokenEmulator/KeywordEmulator.php
@@ -0,0 +1,62 @@
+<?php declare(strict_types=1);
+
+namespace PhpParser\Lexer\TokenEmulator;
+
+abstract class KeywordEmulator extends TokenEmulator
+{
+ abstract function getKeywordString(): string;
+ abstract function getKeywordToken(): int;
+
+ public function isEmulationNeeded(string $code): bool
+ {
+ return strpos(strtolower($code), $this->getKeywordString()) !== false;
+ }
+
+ protected function isKeywordContext(array $tokens, int $pos): bool
+ {
+ $previousNonSpaceToken = $this->getPreviousNonSpaceToken($tokens, $pos);
+ return $previousNonSpaceToken === null || $previousNonSpaceToken[0] !== \T_OBJECT_OPERATOR;
+ }
+
+ public function emulate(string $code, array $tokens): array
+ {
+ $keywordString = $this->getKeywordString();
+ foreach ($tokens as $i => $token) {
+ if ($token[0] === T_STRING && strtolower($token[1]) === $keywordString
+ && $this->isKeywordContext($tokens, $i)) {
+ $tokens[$i][0] = $this->getKeywordToken();
+ }
+ }
+
+ return $tokens;
+ }
+
+ /**
+ * @param mixed[] $tokens
+ * @return mixed[]|null
+ */
+ private function getPreviousNonSpaceToken(array $tokens, int $start)
+ {
+ for ($i = $start - 1; $i >= 0; --$i) {
+ if ($tokens[$i][0] === T_WHITESPACE) {
+ continue;
+ }
+
+ return $tokens[$i];
+ }
+
+ return null;
+ }
+
+ public function reverseEmulate(string $code, array $tokens): array
+ {
+ $keywordToken = $this->getKeywordToken();
+ foreach ($tokens as $i => $token) {
+ if ($token[0] === $keywordToken) {
+ $tokens[$i][0] = \T_STRING;
+ }
+ }
+
+ return $tokens;
+ }
+}