packages feed

HaRe-0.6: tools/base/TI/TiPNT.hs

{-+
This module defines instances for the
identifier types #PN# and #PNT# in the classes needed by the type checker.
-}
module TiPNT where
import PNT(PNT(..),PId)
import TiNames
import SrcLoc1(loc0,SrcLoc(..))
import UniqueNames as U
import SpecialNames
import TypedIds
import MUtils
import TiFresh
import HsConstants as Hs(tuple,mod_Prelude)
import QualNames(getQualified)
import TiHsName

instance TypeCon i => TypeCon (PN i) where
  topType m n = PN (topType m n) (G m n noSrcLoc)

instance ValueId i => ValueId (PN i) where
  topName s m n ty = PN (topName s m n ty) (G m n (optSrcLoc s))
  localVal' n Nothing = PN (localVal n) (Sn n loc0) -- hmm
  localVal' n (Just s) = PN (localVal' (n++sh s) (Just s)) (Sn n s)
         where sh (SrcLoc f _ 0 0) = ""
	       sh (SrcLoc f _ r c) = "_"++show r++"_"++show c
--instName m s = PN (instName m s) (I m s)
  dictName' i s = PN (localVal' "d" s) (D i (optSrcLoc s))
  superName (PN n (G m n' s)) k = PN (superName n k) (G m ("super"++show k++"_"++n') s)
  defaultName (PN n (G m n' s)) = PN (defaultName n) (G m (defaultName n') s)

instance TypeVar i => TypeVar (PN i) where
  tvar n = PN (ltvar "t") (D n noSrcLoc)
  ltvar n = PN (ltvar n) P -- just for pretty printing

instance TypeId i => TypeId (PN i)

instance TypeVar i => Fresh (PN i) where
  fresh = tvar # fresh

instance TypeCon PNT where
   topType m n = PNT (topType m n) (Type blankTypeInfo) noSrcLoc

instance ValueId PNT where
  topName s m n ty = PNT (topName s m n ty) ty (optSrcLoc s)
  localVal' n s = PNT (localVal' n s) Value (optSrcLoc s)
--instName m s = PNT (instName m s) Value (U.srcLoc s)
  dictName' i s = PNT (dictName' i s) Value (N s)
  superName (PNT n (Class cnt ms) s) k = PNT (superName n k) (MethodOf (getQualified n) cnt ms) s
  defaultName (PNT n _ s) = PNT (defaultName n) Value s

instance TypeVar PNT where
   tvar n = PNT (tvar n) (Type blankTypeInfo) noSrcLoc
   ltvar n = PNT (ltvar n) (Type blankTypeInfo) noSrcLoc

instance Fresh PNT where fresh = tvar # fresh
instance TypeId PNT

instance TypedId PId PNT where
  idName (PNT n _ _) = getQualified n

instance IsSpecialName i => IsSpecialName (PN i) where
  -- Should probably use the original name instead!
  is_list_tycon_name (PN i _) = is_list_tycon_name i
  is_fun_tycon_name (PN i _) = is_fun_tycon_name i
  is_char_tycon_name (PN _ (G m "Char" _)) = m == mod_Prelude
  is_char_tycon_name _ = False
  is_tuple_tycon_name n (PN i _) = is_tuple_tycon_name n i

instance (TypeCon i,HasSpecialNames i) => HasSpecialNames (PN i) where
  list_tycon_name = prelType "[]"
  fun_tycon_name = prelType "->"
  char_tycon_name = prelType "Char"
  tuple_tycon_name = prelType . Hs.tuple

instance IsSpecialName PNT where
  is_list_tycon_name (PNT i _ _) = is_list_tycon_name i
  is_fun_tycon_name (PNT i _ _) = is_fun_tycon_name i
  is_char_tycon_name (PNT i _ _) = is_char_tycon_name i
  is_tuple_tycon_name n (PNT i _ _) = is_tuple_tycon_name n i

instance HasSpecialNames PNT where
  list_tycon_name = prelType "[]"
  fun_tycon_name = prelType "->"
  char_tycon_name = prelType "Char"
  tuple_tycon_name = prelType . Hs.tuple