/**
* 5.1.2: Widening Primitive Conversion
*
* @author Martin Bravenboer <martin@cs.uu.nl>
*/
module dryad/jls/conversions/WideningPrimitive
signature
constructors
/**
* @param From
* @param To
*/
WideningPrimitiveConversion : Type * Type -> WideningPrimitiveConversion
strategies
/**
* Checks if the type (current term) is convertable to type t by a
* widening primitive conversion.
*
* @param t Type
* @type Type -> Type
*/
is-widening-primitive-convertable(|to) =
where(widening-primitive-conversion(|to))
/**
* Fails if there is no widening primitive conversion.
*
* @type Type -> WideningPrimitiveConversion.
*/
widening-primitive-conversion(|to) =
widening-primitive-conversions
; fetch-elem(?WideningPrimitiveConversion(_, to))
strategies
/**
* Returns the types involved in this widening primitive conversion.
*/
types-of-conversion :
WideningPrimitiveConversion(from, to) -> [from, to]
/**
* Returns the result type of this conversion.
*
* @type Conversion -> Type
*/
result-of-conversion =
?WideningPrimitiveConversion(_, <id>)
/**
* Returns a list of all the widening primitive conversions from this type.
*
* @todo Fails if there are no widening reference conversions. Do we want that?
* @type Type -> List(WideningPrimitiveConversion)
*/
rules
widening-primitive-conversions :
Byte() ->
[ WideningPrimitiveConversion(Byte(), Short())
, WideningPrimitiveConversion(Byte(), Int())
, WideningPrimitiveConversion(Byte(), Long())
, WideningPrimitiveConversion(Byte(), Float())
, WideningPrimitiveConversion(Byte(), Double())
]
widening-primitive-conversions :
Short() ->
[ WideningPrimitiveConversion(Short(), Int())
, WideningPrimitiveConversion(Short(), Long())
, WideningPrimitiveConversion(Short(), Float())
, WideningPrimitiveConversion(Short(), Double())
]
widening-primitive-conversions :
Char() ->
[ WideningPrimitiveConversion(Char(), Int())
, WideningPrimitiveConversion(Char(), Long())
, WideningPrimitiveConversion(Char(), Float())
, WideningPrimitiveConversion(Char(), Double())
]
widening-primitive-conversions :
Int() ->
[ WideningPrimitiveConversion(Int(), Long())
, WideningPrimitiveConversion(Int(), Float())
, WideningPrimitiveConversion(Int(), Double())
]
widening-primitive-conversions :
Long() ->
[ WideningPrimitiveConversion(Long(), Float())
, WideningPrimitiveConversion(Long(), Double())
]
widening-primitive-conversions:
Float() ->
[ WideningPrimitiveConversion(Float(), Double()) ]