/**
 * @author  Martin Bravenboer <martin@cs.uu.nl>
 */
module dryad/util/jtree-overlays
imports libstratego-lib

/**
 * Type names
 */
overlays

  /**
   * @type s String
   * @type   TypeName
   */
  JavaLangTypeName(s) =
    TypeName(PackageName([Id("java"), Id("lang")]), Id(s))

  /**
   * @type TypeName
   */
  TypeNameString() =
    JavaLangTypeName("String")

  /**
   * @type TypeName
   */
  TypeNameClass() =
    JavaLangTypeName("Class")

  TypeNameObject() =
    JavaLangTypeName("Object")

/**
 * Types
 */
overlays

  TypeObject() =
    ClassType(TypeNameObject(), None())
    
  TypeString() =
    RefTypeString()

  /**
   * @type Type
   */
  TypeVoid() =
    ClassType(JavaLangTypeName("Void"), None())

  /**
   * @type s Type
   * @type   Type
   */
  TypeClass(c) =
    ClassType(TypeNameClass(), Some(TypeArgs([c])))
    
  TypeException() =
    ClassType(JavaLangTypeName("Exception"), None())

overlays

  /**
   * @type Type
   */
  RefTypeString() =
    ClassType(TypeNameString(), None())

  RefTypeBoolean() =
    ClassType(JavaLangTypeName("Boolean"), None())

  RefTypeByte() =
    ClassType(JavaLangTypeName("Byte"), None())

  RefTypeShort() =
    ClassType(JavaLangTypeName("Short"), None())

  RefTypeCharacter() =
    ClassType(JavaLangTypeName("Character"), None())

  RefTypeInteger() =
    ClassType(JavaLangTypeName("Integer"), None())

  RefTypeLong() =
    ClassType(JavaLangTypeName("Long"), None())

  RefTypeFloat() =
    ClassType(JavaLangTypeName("Float"), None())

  RefTypeDouble() =
    ClassType(JavaLangTypeName("Double"), None())
    
  TypeString() =
    RefTypeString()
    
  /**
   * There are no overlays for the other primitives, since the
   * reference types of these primitives have the same name as
   * their primitive counterparts, which is confusing.
   */
  
  TypeCharacter() =
    RefTypeCharacter()  
  
  TypeInteger() =
    RefTypeInteger()

/**
 * Common library types
 */
overlays

  TypeSerializable() =
    InterfaceType(
      TypeName(PackageName([Id("java"), Id("io")]), Id("Serializable"))
    , None()
    )

  TypeCloneable() =
    InterfaceType(
      TypeName(PackageName([Id("java"), Id("lang")]), Id("Cloneable"))
    , None()
    )

  TypeIterable() =
    InterfaceType(
      TypeName(PackageName([Id("java"), Id("lang")]), Id("Iterable"))
    , None()
    )