code: public static function execute(
          Schema $schema,
          DocumentNode $documentNode,
          $rootValue = null,
          $contextValue = null,
          $variableValues = null,
          $operationName = null,
          ?callable $fieldResolver = null
      ) {
          // TODO: deprecate (just always use SyncAdapter here) and have `promiseToExecute()` for other cases
  
          $promiseAdapter = static::getPromiseAdapter();
  
          $result = static::promiseToExecute(
              $promiseAdapter,
              $schema,
              $documentNode,
              $rootValue,
              $contextValue,
              $variableValues,
              $operationName,
              $fieldResolver
          );
  
          if ($promiseAdapter instanceof SyncPromiseAdapter) {
              $result = $promiseAdapter->wait($result);
          }
  
          return $result;
      }
docs: Executes DocumentNode against given $schema.
  
  Always returns ExecutionResult and never throws. All errors which occur during operation
  execution are collected in `$result->errors`.
  
  @param mixed|null               $rootValue
  @param mixed|null               $contextValue
  @param mixed[]|ArrayAccess|null $variableValues
  @param string|null              $operationName
  
  @return ExecutionResult|Promise
  
  @api