docs: def _handle_function_call(tokens, tokens_len, index):
      """Handle function calls, which could include a control statement.
  
      In CMake, all control flow statements are also function calls, so handle
      the function call first and then direct tree construction to the
      appropriate control flow statement constructor found in
      _FUNCTION_CALL_DISAMBIGUATE
      """
      def _end_function_call(token_index, tokens):
          """Function call termination detector."""
          return tokens[token_index].type == TokenType.RightParen
  
      # First handle the "function call"
      next_index, call_body = _ast_worker(tokens, tokens_len,
                                          index + 2,
                                          _end_function_call)
  
      function_call = FunctionCall(name=tokens[index].content,
                                   arguments=call_body.arguments,
                                   line=tokens[index].line,
                                   col=tokens[index].col,
                                   index=index)
  
      # Next find a handler for the body and pass control to that
      try:
          handler = _FUNCTION_CALL_DISAMBIGUATE[tokens[index].content.lower()]
      except KeyError:
          handler = None
  
      if handler:
          return handler(tokens, tokens_len, next_index, function_call)
      else:
          return (next_index, function_call)