/**
 * 5.1.8: Unboxing Conversion
 *
 * @author Martin Bravenboer
 */
module dryad/jls/conversions/Unboxing
imports
  dryad/jls/types/Primitive
  
signature
  constructors
    /**
     * @param From
     * @param To
     */
    UnboxingConversion : Type * Type -> UnBoxingConversion

strategies

  unboxing-conversion =
    !UnboxingConversion(<id>, <unboxing-conversion-of-type>)

strategies

  /**
   * @type Type -> Type
   */
  unboxing-conversion-of-type :
    RefTypeBoolean() -> Boolean()

  unboxing-conversion-of-type :
    RefTypeByte() -> Byte()

  unboxing-conversion-of-type :
    RefTypeShort() -> Short()

  unboxing-conversion-of-type :
    RefTypeInteger() -> Int()

  unboxing-conversion-of-type :
    RefTypeLong() -> Long()

  unboxing-conversion-of-type :
    RefTypeCharacter() -> Char()

  unboxing-conversion-of-type :
    RefTypeFloat() -> Float()

  unboxing-conversion-of-type :
    RefTypeDouble() -> Double()
    
strategies

  /**
   * Returns the types involved in this conversion.
   */
  types-of-conversion :
    UnboxingConversion(from, to) -> [from, to]        

  /**
   * Returns the result type of this conversion.
   *
   * @type Conversion -> Type
   */
  result-of-conversion =
    ?UnboxingConversion(_, <id>)

strategies

  /**
   * @type Type -> Type
   */
  is-convertible-to-numeric-type =
    is-numeric-type

  is-convertible-to-numeric-type =
    where(
      unboxing-conversion-of-type
      ; is-numeric-type
    )

strategies

  /**
   * @todo  JLS mentions that every numeric type is allowed. Might be a bug. Submitted.
   */
  is-convertible-to-integral-type =
    is-integral-type

  is-convertible-to-integral-type =
    where(
      unboxing-conversion-of-type
      ; is-integral-type
    )

strategies

  is-convertible-to-boolean-type =
    ?Boolean()

  is-convertible-to-boolean-type =
    where(
      unboxing-conversion-of-type
      ; ?Boolean()
    )