Example #1
0
  /**
   * Returns the upper bound of a type if it has one, or the type itself if not. Correctly handles
   * wildcards and capture variables.
   */
  public static Type getUpperBound(Type type, Types types) {
    if (type.hasTag(TypeTag.WILDCARD)) {
      return types.wildUpperBound(type);
    }

    if (type.hasTag(TypeTag.TYPEVAR) && ((TypeVar) type).isCaptured()) {
      return types.cvarUpperBound(type);
    }

    if (type.getUpperBound() != null) {
      return type.getUpperBound();
    }

    // concrete type, e.g. java.lang.String, or a case we haven't considered
    return type;
  }
 /**
  * This routine applies following mappings: - if input type is primitive, apply numeric
  * promotion - if input type is either 'void', 'null' or 'String' leave it untouched - otherwise
  * return 'Object'
  */
 private Type stringPromotion(Type t) {
   if (t.isPrimitive()) {
     return unaryPromotion(t);
   } else if (t.hasTag(TypeTag.VOID)
       || t.hasTag(TypeTag.BOT)
       || types.isSameType(t, syms.stringType)) {
     return t;
   } else if (t.hasTag(TypeTag.TYPEVAR)) {
     return stringPromotion(t.getUpperBound());
   } else {
     return syms.objectType;
   }
 }