code: private function hasVoidReturn(Tokens $tokens, $startIndex, $endIndex)
      {
          $tokensAnalyzer = new TokensAnalyzer($tokens);
  
          for ($i = $startIndex; $i < $endIndex; ++$i) {
              if (
                  // skip anonymous classes
                  ($tokens[$i]->isGivenKind(T_CLASS) && $tokensAnalyzer->isAnonymousClass($i)) ||
                   // skip lambda functions
                  ($tokens[$i]->isGivenKind(T_FUNCTION) && $tokensAnalyzer->isLambda($i))
              ) {
                  $i = $tokens->getNextTokenOfKind($i, ['{']);
                  $i = $tokens->findBlockEnd(Tokens::BLOCK_TYPE_CURLY_BRACE, $i);
  
                  continue;
              }
  
              if ($tokens[$i]->isGivenKind([T_YIELD, T_YIELD_FROM])) {
                  return false; // Generators cannot return void.
              }
  
              if (!$tokens[$i]->isGivenKind(T_RETURN)) {
                  continue;
              }
  
              $i = $tokens->getNextMeaningfulToken($i);
              if (!$tokens[$i]->equals(';')) {
                  return false;
              }
          }
  
          return true;
      }
docs: Determine whether the function has a void return.
  
  @param Tokens $tokens
  @param int    $startIndex Start of function body
  @param int    $endIndex   End of function body
  
  @return bool