ab07b885e6ae40604f3ba0d29f830e2840dcc316
[ghc-hetmet.git] / ghc / compiler / reader / RdrHsSyn.lhs
1 %
2 % (c) The AQUA Project, Glasgow University, 1996
3 %
4 \section[RdrHsSyn]{Specialisations of the @HsSyn@ syntax for the reader}
5
6 (Well, really, for specialisations involving @RdrName@s, even if
7 they are used somewhat later on in the compiler...)
8
9 \begin{code}
10 #include "HsVersions.h"
11
12 module RdrHsSyn (
13         SYN_IE(RdrNameArithSeqInfo),
14         SYN_IE(RdrNameBangType),
15         SYN_IE(RdrNameBind),
16         SYN_IE(RdrNameClassDecl),
17         SYN_IE(RdrNameClassOpSig),
18         SYN_IE(RdrNameConDecl),
19         SYN_IE(RdrNameContext),
20         SYN_IE(RdrNameSpecDataSig),
21         SYN_IE(RdrNameDefaultDecl),
22         SYN_IE(RdrNameFixityDecl),
23         SYN_IE(RdrNameGRHS),
24         SYN_IE(RdrNameGRHSsAndBinds),
25         SYN_IE(RdrNameHsBinds),
26         SYN_IE(RdrNameHsDecl),
27         SYN_IE(RdrNameHsExpr),
28         SYN_IE(RdrNameHsModule),
29         SYN_IE(RdrNameIE),
30         SYN_IE(RdrNameImportDecl),
31         SYN_IE(RdrNameInstDecl),
32         SYN_IE(RdrNameMatch),
33         SYN_IE(RdrNameMonoBinds),
34         SYN_IE(RdrNamePat),
35         SYN_IE(RdrNameHsType),
36         SYN_IE(RdrNameQual),
37         SYN_IE(RdrNameSig),
38         SYN_IE(RdrNameSpecInstSig),
39         SYN_IE(RdrNameStmt),
40         SYN_IE(RdrNameTyDecl),
41
42         SYN_IE(RdrNameClassOpPragmas),
43         SYN_IE(RdrNameClassPragmas),
44         SYN_IE(RdrNameDataPragmas),
45         SYN_IE(RdrNameGenPragmas),
46         SYN_IE(RdrNameInstancePragmas),
47         SYN_IE(RdrNameCoreExpr),
48         extractHsTyVars,
49
50         RdrName(..),
51         qual, varQual, tcQual, varUnqual,
52         dummyRdrVarName, dummyRdrTcName,
53         isUnqual, isQual,
54         showRdr, rdrNameOcc,
55         cmpRdr,
56         mkOpApp
57
58     ) where
59
60 IMP_Ubiq()
61
62 import HsSyn
63 import Lex
64 import PrelMods         ( pRELUDE )
65 import Name             ( ExportFlag(..), Module(..), pprModule,
66                           OccName(..), pprOccName )
67 import Pretty           
68 import PprStyle         ( PprStyle(..) )
69 import Util             ( cmpPString, panic, thenCmp )
70 \end{code}
71
72 \begin{code}
73 type RdrNameArithSeqInfo        = ArithSeqInfo          Fake Fake RdrName RdrNamePat
74 type RdrNameBangType            = BangType              RdrName
75 type RdrNameBind                = Bind                  Fake Fake RdrName RdrNamePat
76 type RdrNameClassDecl           = ClassDecl             Fake Fake RdrName RdrNamePat
77 type RdrNameClassOpSig          = Sig                   RdrName
78 type RdrNameConDecl             = ConDecl               RdrName
79 type RdrNameContext             = Context               RdrName
80 type RdrNameHsDecl              = HsDecl                Fake Fake RdrName RdrNamePat
81 type RdrNameSpecDataSig         = SpecDataSig           RdrName
82 type RdrNameDefaultDecl         = DefaultDecl           RdrName
83 type RdrNameFixityDecl          = FixityDecl            RdrName
84 type RdrNameGRHS                = GRHS                  Fake Fake RdrName RdrNamePat
85 type RdrNameGRHSsAndBinds       = GRHSsAndBinds         Fake Fake RdrName RdrNamePat
86 type RdrNameHsBinds             = HsBinds               Fake Fake RdrName RdrNamePat
87 type RdrNameHsExpr              = HsExpr                Fake Fake RdrName RdrNamePat
88 type RdrNameHsModule            = HsModule              Fake Fake RdrName RdrNamePat
89 type RdrNameIE                  = IE                    RdrName
90 type RdrNameImportDecl          = ImportDecl            RdrName
91 type RdrNameInstDecl            = InstDecl              Fake Fake RdrName RdrNamePat
92 type RdrNameMatch               = Match                 Fake Fake RdrName RdrNamePat
93 type RdrNameMonoBinds           = MonoBinds             Fake Fake RdrName RdrNamePat
94 type RdrNamePat                 = InPat                 RdrName
95 type RdrNameHsType              = HsType                RdrName
96 type RdrNameQual                = Qualifier             Fake Fake RdrName RdrNamePat
97 type RdrNameSig                 = Sig                   RdrName
98 type RdrNameSpecInstSig         = SpecInstSig           RdrName
99 type RdrNameStmt                = Stmt                  Fake Fake RdrName RdrNamePat
100 type RdrNameTyDecl              = TyDecl                RdrName
101
102 type RdrNameClassOpPragmas      = ClassOpPragmas        RdrName
103 type RdrNameClassPragmas        = ClassPragmas          RdrName
104 type RdrNameDataPragmas         = DataPragmas           RdrName
105 type RdrNameGenPragmas          = GenPragmas            RdrName
106 type RdrNameInstancePragmas     = InstancePragmas       RdrName
107 type RdrNameCoreExpr            = GenCoreExpr           RdrName RdrName RdrName RdrName 
108 \end{code}
109
110 @extractHsTyVars@ looks just for things that could be type variables.
111 It's used when making the for-alls explicit.
112
113 \begin{code}
114 extractHsTyVars :: HsType RdrName -> [RdrName]
115 extractHsTyVars ty
116   = get ty []
117   where
118     get (MonoTyApp ty1 ty2)      acc = get ty1 (get ty2 acc)
119     get (MonoListTy tc ty)       acc = get ty acc
120     get (MonoTupleTy tc tys)     acc = foldr get acc tys
121     get (MonoFunTy ty1 ty2)      acc = get ty1 (get ty2 acc)
122     get (MonoDictTy cls ty)      acc = get ty acc
123     get (MonoTyVar tv)           acc = insert tv acc
124     get (HsPreForAllTy ctxt ty)  acc = foldr (get . snd) (get ty acc) ctxt
125     get (HsForAllTy tvs ctxt ty) acc = filter (`notElem` locals) $
126                                        foldr (get . snd) (get ty acc) ctxt
127                                      where
128                                        locals = map getTyVarName tvs
129
130     insert (Qual _ _)         acc = acc
131     insert (Unqual (TCOcc _)) acc = acc
132     insert other              acc | other `elem` acc = acc
133                                   | otherwise        = other : acc
134 \end{code}
135
136
137 A useful function for building @OpApps@.  The operator is always a variable,
138 and we don't know the fixity yet.
139
140 \begin{code}
141 mkOpApp e1 op e2 = OpApp e1 (HsVar op) (error "mkOpApp:fixity") e2
142 \end{code}
143
144
145 %************************************************************************
146 %*                                                                      *
147 \subsection[RdrName]{The @RdrName@ datatype; names read from files}
148 %*                                                                      *
149 %************************************************************************
150
151 \begin{code}
152 data RdrName
153   = Unqual OccName
154   | Qual   Module OccName
155
156 qual     (m,n) = Qual m n
157 tcQual   (m,n) = Qual m (TCOcc n)
158 varQual  (m,n) = Qual m (VarOcc n)
159
160         -- This guy is used by the reader when HsSyn has a slot for
161         -- an implicit name that's going to be filled in by
162         -- the renamer.  We can't just put "error..." because
163         -- we sometimes want to print out stuff after reading but
164         -- before renaming
165 dummyRdrVarName = Unqual (VarOcc SLIT("V-DUMMY"))
166 dummyRdrTcName = Unqual (VarOcc SLIT("TC-DUMMY"))
167
168 varUnqual n = Unqual (VarOcc n)
169
170 isUnqual (Unqual _) = True
171 isUnqual (Qual _ _) = False
172
173 isQual (Unqual _) = False
174 isQual (Qual _ _) = True
175
176 cmpRdr (Unqual  n1) (Unqual  n2) = n1 `cmp` n2
177 cmpRdr (Unqual  n1) (Qual m2 n2) = LT_
178 cmpRdr (Qual m1 n1) (Unqual  n2) = GT_
179 cmpRdr (Qual m1 n1) (Qual m2 n2) = (n1 `cmp` n2) `thenCmp` (_CMP_STRING_ m1 m2)
180                                    -- always compare module-names *second*
181
182 rdrNameOcc :: RdrName -> OccName
183 rdrNameOcc (Unqual occ) = occ
184 rdrNameOcc (Qual _ occ) = occ
185
186 instance Text RdrName where -- debugging
187     showsPrec _ rn = showString (ppShow 80 (ppr PprDebug rn))
188
189 instance Eq RdrName where
190     a == b = case (a `cmp` b) of { EQ_ -> True;  _ -> False }
191     a /= b = case (a `cmp` b) of { EQ_ -> False; _ -> True }
192
193 instance Ord RdrName where
194     a <= b = case (a `cmp` b) of { LT_ -> True;  EQ_ -> True;  GT__ -> False }
195     a <  b = case (a `cmp` b) of { LT_ -> True;  EQ_ -> False; GT__ -> False }
196     a >= b = case (a `cmp` b) of { LT_ -> False; EQ_ -> True;  GT__ -> True  }
197     a >  b = case (a `cmp` b) of { LT_ -> False; EQ_ -> False; GT__ -> True  }
198
199 instance Ord3 RdrName where
200     cmp = cmpRdr
201
202 instance Outputable RdrName where
203     ppr sty (Unqual n) = pprOccName sty n
204     ppr sty (Qual m n) = ppBesides [pprModule sty m, ppStr ".", pprOccName sty n]
205
206 instance NamedThing RdrName where               -- Just so that pretty-printing of expressions works
207     getOccName = rdrNameOcc
208     getName = panic "no getName for RdrNames"
209
210 showRdr sty rdr = ppShow 100 (ppr sty rdr)
211 \end{code}
212