/** * 5.1.9: Unchecked Conversion * * @author Martin Bravenboer <martin@cs.uu.nl> */ module dryad/jls/types/UncheckedConversion signature constructors /** * @param From * @param To */ UncheckedConversion : Type * Type -> UncheckedConversion strategies /** * Returns the types involved in this unchecked conversion. */ types-of-conversion : UncheckedConversion(from, to) -> [from, to] /** * Returns the result type of this conversion. * * @type Conversion -> Type */ result-of-conversion = ?UncheckedConversion(_, <id>) strategies /** * @type List(Conversion) -> List(Conversion) */ maybe-unchecked-conversion(|to) = if fetch-elem(where(result-of-conversion; ?to)) => conversion then // @todo What to do if there is more than one correct conversion? ![conversion] else if <is-parameterized-type> to then where(<typename-of-type> to => tn) ; filter({type, rawtype: where( result-of-conversion => type ; is-raw-type ; typename-of-type => tn ) ; ![<id>, UncheckedConversion(type, to)] }) ; filter(check-parameterized-types-of-conversion) // @todo What to do if there is more than one correct conversion? ; ?[<id> | _] else fail end end strategies /** * Checks if the chain of types involved in this conversion is ok. * * @type List(Conversion) -> List(Conversion) */ check-parameterized-types-of-conversion = where( map(types-of-conversion) ; concat ; filter(is-parameterized-type) ; make-set ; if not([]) then ?list ; map({t1: ?t1 ; <map({t2: ?t2; have-subtype-relation(|t1, t2)})> list }) end ) strategies /** * @todo Hack: handle member types */ typename-of-type = ?ClassType(<id>, _) /** * @todo Hack: handle member types */ typename-of-type = ?InterfaceType(<id>, _)