/**
* 4.6: Type Erasure
*
* @author Martin Bravenboer
*/
module dryad/jls/types/Erasure
strategies
type-erasure = rec rec(
type-erasure-parameterized-type(rec)
<+ type-erasure-nested-type(rec)
<+ type-erasure-array-type(rec)
<+ type-erasure-type-variable(rec)
<+ id
)
type-erasure-parameterized-type(rec) :
ClassType(tn, Some(TypeArgs(_))) -> <rec> ClassType(tn, None())
type-erasure-parameterized-type(rec) :
InterfaceType(tn, Some(TypeArgs(_))) -> <rec> InterfaceType(tn, None())
/**
* @todo Implement erasure of nested types.
*/
type-erasure-nested-type(rec) =
fail
type-erasure-array-type(rec) :
ArrayType(t) -> ArrayType(<rec> t)
type-erasure-type-variable(rec) :
tv@TypeVar(_, _) -> <rec> leftmost
where
<lookup-type-parameter> tv
; get-upper-bound => [leftmost | _]
/**
* @todo Move to a better place.
*/
strategies
/**
* @type TypeParam -> List(Type)
*/
get-upper-bound =
?TypeParam(_, Some(TypeBound(<id>)))
/**
* @type TypeParam -> List(Type)
*/
get-upper-bound =
?TypeParam(_, None())
; ![TypeObject]