code: protected function find($functionNameToSearch, Tokens $tokens, $start = 0, $end = null)
      {
          // make interface consistent with findSequence
          $end = null === $end ? $tokens->count() : $end;
  
          // find raw sequence which we can analyse for context
          $candidateSequence = [[T_STRING, $functionNameToSearch], '('];
          $matches = $tokens->findSequence($candidateSequence, $start, $end, false);
          if (null === $matches) {
              // not found, simply return without further attempts
              return null;
          }
  
          // translate results for humans
          list($functionName, $openParenthesis) = array_keys($matches);
  
          $functionsAnalyzer = new FunctionsAnalyzer();
  
          if (!$functionsAnalyzer->isGlobalFunctionCall($tokens, $functionName)) {
              return $this->find($functionNameToSearch, $tokens, $openParenthesis, $end);
          }
  
          return [$functionName, $openParenthesis, $tokens->findBlockEnd(Tokens::BLOCK_TYPE_PARENTHESIS_BRACE, $openParenthesis)];
      }
docs: Looks up Tokens sequence for suitable candidates and delivers boundaries information,
  which can be supplied by other methods in this abstract class.
  
  @param string   $functionNameToSearch
  @param Tokens   $tokens
  @param int      $start
  @param null|int $end
  
  @return null|int[] returns $functionName, $openParenthesis, $closeParenthesis packed into array