code: private function fixTokensCompare(
          Tokens $tokens,
          $startLeft,
          $endLeft,
          $compareOperatorIndex,
          $startRight,
          $endRight
      ) {
          $type = $tokens[$compareOperatorIndex]->getId();
          $content = $tokens[$compareOperatorIndex]->getContent();
          if (\array_key_exists($type, $this->candidatesMap)) {
              $tokens[$compareOperatorIndex] = clone $this->candidatesMap[$type];
          } elseif (\array_key_exists($content, $this->candidatesMap)) {
              $tokens[$compareOperatorIndex] = clone $this->candidatesMap[$content];
          }
  
          $right = $this->fixTokensComparePart($tokens, $startRight, $endRight);
          $left = $this->fixTokensComparePart($tokens, $startLeft, $endLeft);
  
          for ($i = $startRight; $i <= $endRight; ++$i) {
              $tokens->clearAt($i);
          }
  
          for ($i = $startLeft; $i <= $endLeft; ++$i) {
              $tokens->clearAt($i);
          }
  
          $tokens->insertAt($startRight, $left);
          $tokens->insertAt($startLeft, $right);
  
          return $startLeft;
      }
docs: Fixes the comparison at the given index.
  
  A comparison is considered fixed when
  - both sides are a variable (e.g. $a === $b)
  - neither side is a variable (e.g. self::CONST === 3)
  - only the right-hand side is a variable (e.g. 3 === self::$var)
  
  If the left-hand side and right-hand side of the given comparison are
  swapped, this function runs recursively on the previous left-hand-side.
  
  @param Tokens $tokens
  @param int    $startLeft
  @param int    $endLeft
  @param int    $compareOperatorIndex
  @param int    $startRight
  @param int    $endRight
  
  @return int a upper bound for all non-fixed comparisons