/** * 5.1.5: Windening Reference Conversions * * @author Martin Bravenboer <martin@cs.uu.nl> */ module dryad/jls/conversions/WideningReference signature constructors /** * First element of the list is the type being converted to. */ WideningReferenceConversion : List(Type) -> WideningConversion strategies /** * Checks if the current type is convertable to t by a widening * conversion. * * @todo Is check for reference type necessary? * @param t Type * @type Type -> Type */ is-widening-reference-convertable(|t) = is-reference-type ; is-subtype(|t) /** * @todo Cannot list all the supertypes of Null. * @type Type -> List(WideningReferenceConversion) */ widening-reference-conversions = is-reference-type // iset for the results ; where(new-iset => results) // initial conversion ; ![WideningReferenceConversion([<id>])] ; let next = {hd, tail, current: ?current@WideningReferenceConversion([hd | tail]) ; where(<iset-add(|current)> results) ; <direct-supertypes> hd ; map(!WideningReferenceConversion([<id>, hd | tail])) } in rec x( map(next; x) ) end ; <iset-elements> results ; where(<iset-destroy> results) /** * @type Type -> List(WideningConversions) */ widening-reference-conversions(|to) = widening-reference-conversions ; filter( where(?WideningReferenceConversion([to | _])) ) widening-reference-conversions(|to) = adhoc-widening-reference-conversions(|to) /** * The direct supertypes of the null type are all reference types other than the null type itself. * Thus, a widening reference conversion exists from Null to every reference type. */ adhoc-widening-reference-conversions(|to) : Null() -> [ WideningReferenceConversion([to, Null()]) ] where not(to := Null()) ; <is-reference-type> to /** * Getting info about a widening reference conversion. */ strategies /** * Returns the types involved in this widening reference conversion. * * @type WideningReferenceConversion -> List(Type) */ types-of-conversion = ?WideningReferenceConversion(<id>) /** * Returns the result type of this conversion. * * @type Conversion -> Type */ result-of-conversion = ?WideningReferenceConversion([<id> | _])