code: Type mostSpecificReturnType(Type mt1, Type mt2) {
          Type rt1 = mt1.getReturnType();
          Type rt2 = mt2.getReturnType();
  
          if (mt1.hasTag(FORALL) && mt2.hasTag(FORALL)) {
              //if both are generic methods, adjust return type ahead of subtyping check
              rt1 = types.subst(rt1, mt1.getTypeArguments(), mt2.getTypeArguments());
          }
          //first use subtyping, then return type substitutability
          if (types.isSubtype(rt1, rt2)) {
              return mt1;
          } else if (types.isSubtype(rt2, rt1)) {
              return mt2;
          } else if (types.returnTypeSubstitutable(mt1, mt2)) {
              return mt1;
          } else if (types.returnTypeSubstitutable(mt2, mt1)) {
              return mt2;
          } else {
              return null;
          }
      }
docs: where