code: private function completeObjectValue(ObjectType $returnType, $fieldNodes, ResolveInfo $info, $path, &$result)
      {
          // If there is an isTypeOf predicate function, call it with the
          // current result. If isTypeOf returns false, then raise an error rather
          // than continuing execution.
          $isTypeOf = $returnType->isTypeOf($result, $this->exeContext->contextValue, $info);
          if ($isTypeOf !== null) {
              $promise = $this->getPromise($isTypeOf);
              if ($promise) {
                  return $promise->then(function ($isTypeOfResult) use (
                      $returnType,
                      $fieldNodes,
                      $path,
                      &$result
                  ) {
                      if (! $isTypeOfResult) {
                          throw $this->invalidReturnTypeError($returnType, $result, $fieldNodes);
                      }
  
                      return $this->collectAndExecuteSubfields(
                          $returnType,
                          $fieldNodes,
                          $path,
                          $result
                      );
                  });
              }
              if (! $isTypeOf) {
                  throw $this->invalidReturnTypeError($returnType, $result, $fieldNodes);
              }
          }
  
          return $this->collectAndExecuteSubfields(
              $returnType,
              $fieldNodes,
              $path,
              $result
          );
      }
docs: Complete an Object value by executing all sub-selections.
  
  @param FieldNode[] $fieldNodes
  @param mixed[]     $path
  @param mixed       $result
  
  @return mixed[]|Promise|stdClass
  
  @throws Error