[project @ 1998-12-18 17:40:31 by simonpj]
[ghc-hetmet.git] / ghc / compiler / rename / RnHsSyn.lhs
1 %
2 % (c) The AQUA Project, Glasgow University, 1996-1998
3 %
4 \section[RnHsSyn]{Specialisations of the @HsSyn@ syntax for the renamer}
5
6 \begin{code}
7 module RnHsSyn where
8
9 #include "HsVersions.h"
10
11 import HsSyn
12 import HsPragmas        ( InstancePragmas, GenPragmas, DataPragmas, ClassPragmas, ClassOpPragmas )
13
14 import TysWiredIn       ( tupleTyCon, unboxedTupleTyCon, 
15                           listTyCon, charTyCon )
16 import Name             ( Name, getName )
17 import NameSet
18 import Util
19 import Outputable
20 \end{code}
21
22
23 \begin{code}
24 type RenamedArithSeqInfo        = ArithSeqInfo          Name RenamedPat
25 type RenamedClassOpSig          = Sig                   Name
26 type RenamedConDecl             = ConDecl               Name
27 type RenamedContext             = Context               Name
28 type RenamedHsDecl              = HsDecl                Name RenamedPat
29 type RenamedTyClDecl            = TyClDecl              Name RenamedPat
30 type RenamedSpecDataSig         = SpecDataSig           Name
31 type RenamedDefaultDecl         = DefaultDecl           Name
32 type RenamedForeignDecl         = ForeignDecl           Name
33 type RenamedGRHS                = GRHS                  Name RenamedPat
34 type RenamedGRHSs               = GRHSs                 Name RenamedPat
35 type RenamedHsBinds             = HsBinds               Name RenamedPat
36 type RenamedHsExpr              = HsExpr                Name RenamedPat
37 type RenamedHsModule            = HsModule              Name RenamedPat
38 type RenamedInstDecl            = InstDecl              Name RenamedPat
39 type RenamedMatch               = Match                 Name RenamedPat
40 type RenamedMonoBinds           = MonoBinds             Name RenamedPat
41 type RenamedPat                 = InPat                 Name
42 type RenamedHsType              = HsType                Name
43 type RenamedRecordBinds         = HsRecordBinds         Name RenamedPat
44 type RenamedSig                 = Sig                   Name
45 type RenamedStmt                = Stmt                  Name RenamedPat
46 type RenamedFixitySig           = FixitySig             Name
47
48 type RenamedClassOpPragmas      = ClassOpPragmas        Name
49 type RenamedClassPragmas        = ClassPragmas          Name
50 type RenamedDataPragmas         = DataPragmas           Name
51 type RenamedGenPragmas          = GenPragmas            Name
52 type RenamedInstancePragmas     = InstancePragmas       Name
53 \end{code}
54
55 %************************************************************************
56 %*                                                                      *
57 \subsection{Free variables}
58 %*                                                                      *
59 %************************************************************************
60
61 These free-variable finders returns tycons and classes too.
62
63 \begin{code}
64 charTyCon_name, listTyCon_name :: Name
65 charTyCon_name    = getName charTyCon
66 listTyCon_name    = getName listTyCon
67
68 tupleTyCon_name :: Bool -> Int -> Name
69 tupleTyCon_name True  n = getName (tupleTyCon n)
70 tupleTyCon_name False n = getName (unboxedTupleTyCon n)
71
72 extractHsTyNames   :: RenamedHsType -> NameSet
73 extractHsTyNames ty
74   = get ty
75   where
76     get (MonoTyApp ty1 ty2)      = get ty1 `unionNameSets` get ty2
77     get (MonoListTy ty)          = unitNameSet listTyCon_name 
78                                    `unionNameSets` get ty
79     get (MonoTupleTy tys boxed)  = unitNameSet (tupleTyCon_name boxed (length tys)) 
80                                    `unionNameSets` extractHsTyNames_s tys
81     get (MonoFunTy ty1 ty2)      = get ty1 `unionNameSets` get ty2
82     get (MonoDictTy cls tys)     = unitNameSet cls `unionNameSets` extractHsTyNames_s tys
83     get (MonoTyVar tv)           = unitNameSet tv
84     get (HsForAllTy tvs ctxt ty) = (extractHsCtxtTyNames ctxt `unionNameSets` get ty)
85                                             `minusNameSet`
86                                     mkNameSet (map getTyVarName tvs)
87
88 extractHsTyNames_s  :: [RenamedHsType] -> NameSet
89 extractHsTyNames_s tys = foldr (unionNameSets . extractHsTyNames) emptyNameSet tys
90
91 extractHsCtxtTyNames :: RenamedContext -> NameSet
92 extractHsCtxtTyNames ctxt = foldr (unionNameSets . get) emptyNameSet ctxt
93   where
94     get (cls, tys) = unitNameSet cls `unionNameSets` extractHsTyNames_s tys
95 \end{code}
96