code: private function completeAbstractValue(AbstractType $returnType, $fieldNodes, ResolveInfo $info, $path, &$result)
      {
          $exeContext  = $this->exeContext;
          $runtimeType = $returnType->resolveType($result, $exeContext->contextValue, $info);
          if ($runtimeType === null) {
              $runtimeType = self::defaultTypeResolver($result, $exeContext->contextValue, $info, $returnType);
          }
          $promise = $this->getPromise($runtimeType);
          if ($promise) {
              return $promise->then(function ($resolvedRuntimeType) use (
                  $returnType,
                  $fieldNodes,
                  $info,
                  $path,
                  &$result
              ) {
                  return $this->completeObjectValue(
                      $this->ensureValidRuntimeType(
                          $resolvedRuntimeType,
                          $returnType,
                          $info,
                          $result
                      ),
                      $fieldNodes,
                      $info,
                      $path,
                      $result
                  );
              });
          }
  
          return $this->completeObjectValue(
              $this->ensureValidRuntimeType(
                  $runtimeType,
                  $returnType,
                  $info,
                  $result
              ),
              $fieldNodes,
              $info,
              $path,
              $result
          );
      }
docs: Complete a value of an abstract type by determining the runtime object type
  of that value, then complete the value for that type.
  
  @param FieldNode[] $fieldNodes
  @param mixed[]     $path
  @param mixed[]     $result
  
  @return mixed
  
  @throws Error