digraph SQLTypes {

  size="4,4"
  rankdir=BT
  rank=max
  ratio=compress

  node [shape = record]

  Type

  SimpleTypeProxy [label = "{SimpleTypeProxy|(trait)}"]
  SimpleTypeProxy -> Type

  RewrappingTypeProxy [label = "{RewrappingTypeProxy|(trait)}"]
  RewrappingTypeProxy -> SimpleTypeProxy

  SubType -> Type

  NotNullType [label = "{NotNullType|underlying: Type}"]
  NotNullType -> SubType
  NotNullType -> RewrappingTypeProxy

  SingletonType -> SubType
  SingletonType -> SimpleTypeProxy

  ErrorType [label = "{ErrorType|(object)}"]
  ErrorType -> Type

  WildcardType [label = "{WildcardType|(object)}"]
  WildcardType -> Type

  BoundedWildcardType [label = "{BoundedWildcardType|bounds: TypeBounds}"]
  BoundedWildcardType -> Type

  NoType [label = "{NoType|(object)}"]
  NoType -> Type

  NoPrefix [label = "{NoPrefix|(object)}"]
  NoPrefix -> Type

  DeBruijnIndex -> Type

  ThisType [label = "{ThisType|sym: Symbol}"]
  ThisType -> SingletonType

  SingleType [label = "{SingleType|pre: Type\nsym: Symbol}"]
  SingleType -> SingletonType

  SuperType [label = "{SuperType|thistpe: Type\nsupertp: Type}"]
  SuperType -> SingletonType

  TypeBounds [label = "{TypeBounds|lo: Type\nhi: Type}"]
  TypeBounds -> SubType

  CompoundType -> Type

  RefinedType[label = "{RefinedType|parents: List[Type]\ndecls: Scope}"]
  RefinedType -> CompoundType

  ClassInfoType[label = "{ClassInfoType|parents: List[Type]\ndecls: Scope\nsymbol: Symbol}"]
  ClassInfoType -> CompoundType

  PackageClassInfoType[label = "{PackageClassInfoType|decls: Scope\nclazz: Symbol\nloader: LazyType}"]
  PackageClassInfoType -> ClassInfoType

  ConstantType[label = "{ConstantType|value: Constant}"]
  ConstantType -> SingletonType

  TypeRef[label = "{TypeRef|pre: Type\nsym: Symbol\nargs: List[Type]}"]
  TypeRef -> Type

  MethodType[label = "{MethodType|paramTypes: List[Type]\nresultType: Type}"]
  MethodType -> Type

  ImplicitMethodType[label = "{MethodType|pts: List[Type]\nrt: Type}"]
  ImplicitMethodType -> MethodType

  JavaMethodType[label = "{MethodType|pts: List[Type]\nrt: Type}"]
  JavaMethodType -> MethodType

  PolyType[label = "{PolyType|typeParams: List[Symbol]\nresultType: Type}"]
  PolyType -> Type

  OverloadedType[label = "{OverloadedType|quantified: List[Symbol]\nunderlying: Type}"]
  ExistentialType -> RewrappingTypeProxy

  OverloadedType[label = "{OverloadedType|pre: Type\nalternatives: List[Symbol]}"]
  OverloadedType -> Type

  AntiPolyType[label = "{AntiPolyType|pre: Type\ntargs: List[Type]}"]
  AntiPolyType -> Type

  TypeVar[label = "{TypeVar|origin: Type\nconstr: TypeConstraint}"]
  TypeVar -> Type

  AnnotatedType[label = "{AnnotatedType|attributes: List[AnnotationInfo]\nunderlying: Type\nselfsym: Symbol}"]
  AnnotatedType -> RewrappingTypeProxy

  LazyType -> Type

}
