[project @ 2000-07-14 08:17:36 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, listTyCon, charTyCon )
15 import Name             ( Name, getName )
16 import NameSet
17 import BasicTypes       ( Boxity )
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             = HsContext             Name
28 type RenamedHsDecl              = HsDecl                Name RenamedPat
29 type RenamedRuleDecl            = RuleDecl              Name RenamedPat
30 type RenamedTyClDecl            = TyClDecl              Name RenamedPat
31 type RenamedSpecDataSig         = SpecDataSig           Name
32 type RenamedDefaultDecl         = DefaultDecl           Name
33 type RenamedForeignDecl         = ForeignDecl           Name
34 type RenamedGRHS                = GRHS                  Name RenamedPat
35 type RenamedGRHSs               = GRHSs                 Name RenamedPat
36 type RenamedHsBinds             = HsBinds               Name RenamedPat
37 type RenamedHsExpr              = HsExpr                Name RenamedPat
38 type RenamedHsModule            = HsModule              Name RenamedPat
39 type RenamedInstDecl            = InstDecl              Name RenamedPat
40 type RenamedMatch               = Match                 Name RenamedPat
41 type RenamedMonoBinds           = MonoBinds             Name RenamedPat
42 type RenamedPat                 = InPat                 Name
43 type RenamedHsType              = HsType                Name
44 type RenamedHsPred              = HsPred                Name
45 type RenamedRecordBinds         = HsRecordBinds         Name RenamedPat
46 type RenamedSig                 = Sig                   Name
47 type RenamedStmt                = Stmt                  Name RenamedPat
48 type RenamedFixitySig           = FixitySig             Name
49 type RenamedDeprecation         = DeprecDecl            Name
50
51 type RenamedClassOpPragmas      = ClassOpPragmas        Name
52 type RenamedClassPragmas        = ClassPragmas          Name
53 type RenamedDataPragmas         = DataPragmas           Name
54 type RenamedGenPragmas          = GenPragmas            Name
55 type RenamedInstancePragmas     = InstancePragmas       Name
56 \end{code}
57
58 %************************************************************************
59 %*                                                                      *
60 \subsection{Free variables}
61 %*                                                                      *
62 %************************************************************************
63
64 These free-variable finders returns tycons and classes too.
65
66 \begin{code}
67 charTyCon_name, listTyCon_name :: Name
68 charTyCon_name    = getName charTyCon
69 listTyCon_name    = getName listTyCon
70
71 tupleTyCon_name :: Boxity -> Int -> Name
72 tupleTyCon_name boxity n = getName (tupleTyCon boxity n)
73
74 extractHsTyNames   :: RenamedHsType -> NameSet
75 extractHsTyNames ty
76   = get ty
77   where
78     get (HsAppTy ty1 ty2)      = get ty1 `unionNameSets` get ty2
79     get (HsListTy ty)          = unitNameSet listTyCon_name 
80                                    `unionNameSets` get ty
81     get (HsTupleTy (HsTupCon n _) tys) = unitNameSet n
82                                          `unionNameSets` extractHsTyNames_s tys
83     get (HsFunTy ty1 ty2)      = get ty1 `unionNameSets` get ty2
84     get (HsPredTy p)           = extractHsPredTyNames p
85     get (HsUsgForAllTy uv ty)  = get ty
86     get (HsUsgTy u ty)         = get ty
87     get (HsTyVar tv)           = unitNameSet tv
88     get (HsForAllTy (Just tvs) 
89                     ctxt ty)   = (extractHsCtxtTyNames ctxt `unionNameSets` get ty)
90                                             `minusNameSet`
91                                     mkNameSet (hsTyVarNames tvs)
92     get ty@(HsForAllTy Nothing _ _) = pprPanic "extractHsTyNames" (ppr ty)
93
94 extractHsTyNames_s  :: [RenamedHsType] -> NameSet
95 extractHsTyNames_s tys = foldr (unionNameSets . extractHsTyNames) emptyNameSet tys
96
97 extractHsCtxtTyNames :: RenamedContext -> NameSet
98 extractHsCtxtTyNames ctxt = foldr (unionNameSets . extractHsPredTyNames) emptyNameSet ctxt
99
100 -- You don't import or export implicit parameters, so don't mention
101 -- the IP names
102 extractHsPredTyNames (HsPClass cls tys)
103   = unitNameSet cls `unionNameSets` extractHsTyNames_s tys
104 extractHsPredTyNames (HsPIParam n ty)
105   = extractHsTyNames ty
106 \end{code}
107