code: public function getArguments(Tokens $tokens, $openParenthesis, $closeParenthesis)
      {
          $arguments = [];
          $firstSensibleToken = $tokens->getNextMeaningfulToken($openParenthesis);
          if ($tokens[$firstSensibleToken]->equals(')')) {
              return $arguments;
          }
  
          $paramContentIndex = $openParenthesis + 1;
          $argumentsStart = $paramContentIndex;
          for (; $paramContentIndex < $closeParenthesis; ++$paramContentIndex) {
              $token = $tokens[$paramContentIndex];
  
              // skip nested (), [], {} constructs
              $blockDefinitionProbe = Tokens::detectBlockType($token);
  
              if (null !== $blockDefinitionProbe && true === $blockDefinitionProbe['isStart']) {
                  $paramContentIndex = $tokens->findBlockEnd($blockDefinitionProbe['type'], $paramContentIndex);
  
                  continue;
              }
  
              // if comma matched, increase arguments counter
              if ($token->equals(',')) {
                  if ($tokens->getNextMeaningfulToken($paramContentIndex) === $closeParenthesis) {
                      break; // trailing ',' in function call (PHP 7.3)
                  }
  
                  $arguments[$argumentsStart] = $paramContentIndex - 1;
                  $argumentsStart = $paramContentIndex + 1;
              }
          }
  
          $arguments[$argumentsStart] = $paramContentIndex - 1;
  
          return $arguments;
      }
docs: Returns start and end token indexes of arguments.
  
  Returns an array with each key being the first token of an
  argument and the value the last. Including non-function tokens
  such as comments and white space tokens, but without the separation
  tokens like '(', ',' and ')'.
  
  @param Tokens $tokens
  @param int    $openParenthesis
  @param int    $closeParenthesis
  
  @return array<int, int>