Browse Source

DX: improve `Tokens` checking for found tokens (#7139)

Kuba Werłos 1 year ago
parent
commit
61bede76d8
2 changed files with 25 additions and 10 deletions
  1. 11 10
      src/Tokenizer/Tokens.php
  2. 14 0
      tests/Tokenizer/TokensTest.php

+ 11 - 10
src/Tokenizer/Tokens.php

@@ -297,7 +297,9 @@ class Tokens extends \SplFixedArray
     {
         $this->changed = true;
         $this->namespaceDeclarations = null;
-        $this->unregisterFoundToken($this[$index]);
+        if (isset($this[$index])) {
+            $this->unregisterFoundToken($this[$index]);
+        }
 
         parent::offsetUnset($index);
     }
@@ -322,7 +324,6 @@ class Tokens extends \SplFixedArray
             if (isset($this[$index])) {
                 $this->unregisterFoundToken($this[$index]);
             }
-
             $this->registerFoundToken($newval);
         }
 
@@ -1048,7 +1049,7 @@ class Tokens extends \SplFixedArray
     public function isAllTokenKindsFound(array $tokenKinds): bool
     {
         foreach ($tokenKinds as $tokenKind) {
-            if (empty($this->foundTokenKinds[$tokenKind])) {
+            if (!isset($this->foundTokenKinds[$tokenKind])) {
                 return false;
             }
         }
@@ -1064,7 +1065,7 @@ class Tokens extends \SplFixedArray
     public function isAnyTokenKindsFound(array $tokenKinds): bool
     {
         foreach ($tokenKinds as $tokenKind) {
-            if (!empty($this->foundTokenKinds[$tokenKind])) {
+            if (isset($this->foundTokenKinds[$tokenKind])) {
                 return true;
             }
         }
@@ -1079,7 +1080,7 @@ class Tokens extends \SplFixedArray
      */
     public function isTokenKindFound($tokenKind): bool
     {
-        return !empty($this->foundTokenKinds[$tokenKind]);
+        return isset($this->foundTokenKinds[$tokenKind]);
     }
 
     /**
@@ -1381,7 +1382,7 @@ class Tokens extends \SplFixedArray
     }
 
     /**
-     * Register token as found.
+     * Unregister token as not found.
      *
      * @param array{int}|string|Token $token token prototype
      */
@@ -1392,11 +1393,11 @@ class Tokens extends \SplFixedArray
             ? ($token->isArray() ? $token->getId() : $token->getContent())
             : (\is_array($token) ? $token[0] : $token);
 
-        if (!isset($this->foundTokenKinds[$tokenKind])) {
-            return;
+        if (1 === $this->foundTokenKinds[$tokenKind]) {
+            unset($this->foundTokenKinds[$tokenKind]);
+        } else {
+            --$this->foundTokenKinds[$tokenKind];
         }
-
-        --$this->foundTokenKinds[$tokenKind];
     }
 
     /**

+ 14 - 0
tests/Tokenizer/TokensTest.php

@@ -1743,6 +1743,20 @@ EOF
         );
     }
 
+    public function testFindingToken(): void
+    {
+        $tokens = Tokens::fromCode('<?php $x;');
+
+        self::assertTrue($tokens->isTokenKindFound(T_VARIABLE));
+
+        $tokens->offsetUnset(1);
+        $tokens->offsetUnset(1); // 2nd unset of the same index should not crash anything
+        self::assertFalse($tokens->isTokenKindFound(T_VARIABLE));
+
+        $tokens[1] = new Token([T_VARIABLE, '$x']);
+        self::assertTrue($tokens->isTokenKindFound(T_VARIABLE));
+    }
+
     private function getBlockEdgeCachingTestTokens(): Tokens
     {
         Tokens::clearCache();