code: public static function doTypesOverlap(Schema $schema, CompositeType $typeA, CompositeType $typeB)
      {
          // Equivalent types overlap
          if ($typeA === $typeB) {
              return true;
          }
  
          if ($typeA instanceof AbstractType) {
              if ($typeB instanceof AbstractType) {
                  // If both types are abstract, then determine if there is any intersection
                  // between possible concrete types of each.
                  foreach ($schema->getPossibleTypes($typeA) as $type) {
                      if ($schema->isPossibleType($typeB, $type)) {
                          return true;
                      }
                  }
  
                  return false;
              }
  
              // Determine if the latter type is a possible concrete type of the former.
              return $schema->isPossibleType($typeA, $typeB);
          }
  
          if ($typeB instanceof AbstractType) {
              // Determine if the former type is a possible concrete type of the latter.
              return $schema->isPossibleType($typeB, $typeA);
          }
  
          // Otherwise the types do not overlap.
          return false;
      }
docs: Provided two composite types, determine if they "overlap". Two composite
  types overlap when the Sets of possible concrete types for each intersect.
  
  This is often used to determine if a fragment of a given type could possibly
  be visited in a context of another type.
  
  This function is commutative.
  
  @return bool