/**
 * 4.7: Reifiable Types
 *
 * @author Martin Bravenboer
 */
module dryad/jls/types/Reifiable
imports
  dryad/jls/types/Raw

strategies

  /**
   * Refers to a non-generic type declaration.
   *
   * @todo When does a type refer to a non-generic type declaration?
   */
  is-reifiable-type =
    fail

  /**
   * Parameterized type in which all type arguments are unbounded wildcards.
   */
  is-reifiable-type =
    ClassType(id, Some(type-args-unbounded-wildcards))

  is-reifiable-type =
    InterfaceType(id, Some(type-args-unbounded-wildcards))

  is-reifiable-type =
    ClassOrInterfaceType(id, Some(type-args-unbounded-wildcards))

  /**
   * Raw type
   */
  is-reifiable-type =
    is-raw-type

  /**
   * Array type whose component type is reifiable.
   */
  is-reifiable-type =
    ArrayType(is-reifiable-type)

strategies

  type-args-unbounded-wildcards =
    TypeArgs(map(Wildcard(None())))