/** * 5.2: Assignment Conversion * * @author Martin Bravenboer <martin@cs.uu.nl> */ module dryad/jls/conversions/AssignmentConversion imports dryad/jls/conversions/Kinds signature constructors AssignmentConversion : List(Conversion) -> AssignmentConversion strategies /** * Checks if the current type is assignment convertable to type to. * * @todo Additional conversion rules for constant expressions (5.2) * @todo Optimize conversion to Object? * @param Type * @type Type -> Type */ is-assignment-convertable(|to) = where(assignment-conversion(|to)) strategies /** * @type Type -> AssignmentConversion */ assignment-conversion(|to) = ( identity-conversion(|to) ; ![<id>] + widening-reference-conversions ; maybe-unchecked-conversion(|to) + adhoc-widening-reference-conversions(|to) + widening-primitive-conversion(|to) ; ![<id>] + boxing-conversion ; optional-widening-reference-conversion(|to) + unboxing-conversion ; optional-widening-primitive-conversion(|to) ) ; !AssignmentConversion(<id>) /** * @type Conversion -> List(Conversion) */ optional-widening-reference-conversion(|to) = ?conversion ; where(result-of-conversion => current) ; if !current => to then ![conversion] else <widening-reference-conversions(|to)> current // @todo what to do if there is more than one? ; ?[<id> | _] ; ![conversion, <id>] end /** * @type Conversion -> List(Conversion) */ optional-widening-primitive-conversion(|to) = ?conversion ; where(result-of-conversion => current) ; if !current => to then ![conversion] else <widening-primitive-conversion(|to)> current ; ![conversion, <id>] end strategies /** * Returns the types involved in this assignment conversion. * * @type Conversion -> List(Type) */ types-of-conversion = ?AssignmentConversion(<id>) ; map(types-of-conversion) ; concat /** * Returns the result type of this assignment conversion. * * @type Conversion -> Type */ result-of-conversion = ?AssignmentConversion(<last>) ; result-of-conversion