[project @ 1997-07-05 02:55:34 by sof]
[ghc-hetmet.git] / ghc / compiler / reader / ReadPrefix.lhs
1 %
2 % (c) The AQUA Project, Glasgow University, 1994-1996
3 %
4 \section{Read parse tree built by Yacc parser}
5
6 \begin{code}
7 #include "HsVersions.h"
8
9 module ReadPrefix ( rdModule )  where
10
11 IMP_Ubiq()
12 IMPORT_1_3(IO(hPutStr, stderr))
13 #if __GLASGOW_HASKELL__ == 201
14 import GHCio(stThen)
15 #elif __GLASGOW_HASKELL__ >= 202
16 import GlaExts
17 import IOBase
18 import PrelRead
19 #endif
20
21 import UgenAll          -- all Yacc parser gumpff...
22 import PrefixSyn        -- and various syntaxen.
23 import HsSyn
24 import HsTypes          ( HsTyVar(..) )
25 import HsPragmas        ( noDataPragmas, noClassPragmas, noInstancePragmas, noGenPragmas )
26 import RdrHsSyn         
27 import BasicTypes       ( Fixity(..), FixityDirection(..), NewOrData(..), IfaceFlavour(..) )
28 import PrefixToHs
29
30 import CmdLineOpts      ( opt_PprUserLength )
31 import ErrUtils         ( addErrLoc, ghcExit )
32 import FiniteMap        ( elemFM, FiniteMap )
33 import Name             ( OccName(..), SYN_IE(Module) )
34 import Lex              ( isLexConId )
35 import Outputable       ( Outputable(..), PprStyle(..) )
36 import PrelMods
37 import Pretty
38 import SrcLoc           ( mkGeneratedSrcLoc, noSrcLoc, SrcLoc )
39 import Util             ( nOfThem, pprError, panic )
40 \end{code}
41
42 %************************************************************************
43 %*                                                                      *
44 \subsection[ReadPrefix-help]{Help Functions}
45 %*                                                                      *
46 %************************************************************************
47
48 \begin{code}
49 wlkList :: (U_VOID_STAR -> UgnM a) -> U_list -> UgnM [a]
50
51 wlkList wlk_it U_lnil = returnUgn []
52
53 wlkList wlk_it (U_lcons hd tl)
54   = wlk_it  hd          `thenUgn` \ hd_it ->
55     wlkList wlk_it tl   `thenUgn` \ tl_it ->
56     returnUgn (hd_it : tl_it)
57 \end{code}
58
59 \begin{code}
60 wlkMaybe :: (U_VOID_STAR -> UgnM a) -> U_maybe -> UgnM (Maybe a)
61
62 wlkMaybe wlk_it U_nothing  = returnUgn Nothing
63 wlkMaybe wlk_it (U_just x)
64   = wlk_it  x           `thenUgn` \ it ->
65     returnUgn (Just it)
66 \end{code}
67
68 \begin{code}
69 wlkTvId   = wlkQid TvOcc
70 wlkTCId   = wlkQid TCOcc
71 wlkVarId  = wlkQid VarOcc
72 wlkDataId = wlkQid VarOcc
73 wlkEntId = wlkQid (\occ -> if isLexConId occ
74                            then TCOcc occ
75                            else VarOcc occ)
76
77 wlkQid  :: (FAST_STRING -> OccName) -> U_qid -> UgnM RdrName
78 wlkQid mk_occ_name (U_noqual name)
79   = returnUgn (Unqual (mk_occ_name name))
80 wlkQid mk_occ_name (U_aqual  mod name)
81   = returnUgn (Qual mod (mk_occ_name name) HiFile)
82
83         -- I don't understand this one!  It is what shows up when we meet (), [], or (,,,).
84 wlkQid mk_occ_name (U_gid n name)
85   = returnUgn (Unqual (mk_occ_name name))
86
87 rdTCId  pt = rdU_qid pt `thenUgn` \ qid -> wlkTCId qid
88 rdVarId pt = rdU_qid pt `thenUgn` \ qid -> wlkVarId qid
89
90 cvFlag :: U_long -> Bool
91 cvFlag 0 = False
92 cvFlag 1 = True
93 \end{code}
94
95 %************************************************************************
96 %*                                                                      *
97 \subsection[rdModule]{@rdModule@: reads in a Haskell module}
98 %*                                                                      *
99 %************************************************************************
100
101 \begin{code}
102 #if __GLASGOW_HASKELL__ == 201
103 # define PACK_STR packCString
104 #elif __GLASGOW_HASKELL__ >= 202
105 # define PACK_STR mkFastCharString
106 #else
107 # define PACK_STR mkFastCharString
108 #endif
109
110 rdModule :: IO (Module,             -- this module's name
111                 RdrNameHsModule)    -- the main goods
112
113 rdModule
114   = _ccall_ hspmain `CCALL_THEN` \ pt -> -- call the Yacc parser!
115     let
116         srcfile  = PACK_STR ``input_filename'' -- What A Great Hack! (TM)
117     in
118     initUgn               $
119     rdU_tree pt `thenUgn` \ (U_hmodule modname himplist hexplist hfixlist
120                                        hmodlist srciface_version srcline) ->
121
122     setSrcFileUgn srcfile $
123     setSrcModUgn  modname $
124     mkSrcLocUgn srcline   $                \ src_loc    ->
125
126     wlkMaybe rdEntities hexplist `thenUgn` \ exports    ->
127     wlkList  rdImport   himplist `thenUgn` \ imports    ->
128     wlkList  rdFixOp    hfixlist `thenUgn` \ fixities   ->
129     wlkBinding          hmodlist `thenUgn` \ binding    ->
130
131     let
132         val_decl    = ValD (cvBinds srcfile cvValSig binding)
133         other_decls = cvOtherDecls binding
134     in
135     returnUgn (modname,
136                HsModule modname
137                           (case srciface_version of { 0 -> Nothing; n -> Just n })
138                           exports
139                           imports
140                           fixities
141                           (val_decl: other_decls)
142                           src_loc
143                 )
144 \end{code}
145
146 %************************************************************************
147 %*                                                                      *
148 \subsection[wlkExprOrPat]{@wlkExpr@ and @wlkPat@}
149 %*                                                                      *
150 %************************************************************************
151
152 \begin{code}
153 rdExpr :: ParseTree -> UgnM RdrNameHsExpr
154 rdPat  :: ParseTree -> UgnM RdrNamePat
155
156 rdExpr pt = rdU_tree pt `thenUgn` \ tree -> wlkExpr tree
157 rdPat  pt = rdU_tree pt `thenUgn` \ tree -> wlkPat  tree
158
159 wlkExpr :: U_tree -> UgnM RdrNameHsExpr
160 wlkPat  :: U_tree -> UgnM RdrNamePat
161
162 wlkExpr expr
163   = case expr of
164       U_par pexpr -> -- parenthesised expr
165         wlkExpr pexpr   `thenUgn` \ expr ->
166         returnUgn (HsPar expr)
167
168       U_lsection lsexp lop -> -- left section
169         wlkExpr lsexp   `thenUgn` \ expr ->
170         wlkVarId  lop   `thenUgn` \ op   ->
171         returnUgn (SectionL expr (HsVar op))
172
173       U_rsection rop rsexp -> -- right section
174         wlkVarId  rop   `thenUgn` \ op   ->
175         wlkExpr rsexp   `thenUgn` \ expr ->
176         returnUgn (SectionR (HsVar op) expr)
177
178       U_ccall fun flavor ccargs -> -- ccall/casm
179         wlkList rdExpr ccargs   `thenUgn` \ args ->
180         let
181             tag = _HEAD_ flavor
182         in
183         returnUgn (CCall fun args
184                     (tag == 'p' || tag == 'P') -- may invoke GC
185                     (tag == 'N' || tag == 'P') -- really a "casm"
186                     (panic "CCall:result_ty"))
187
188       U_scc label sccexp -> -- scc (set-cost-centre) expression
189         wlkExpr   sccexp        `thenUgn` \ expr  ->
190         returnUgn (HsSCC label expr)
191
192       U_lambda lampats lamexpr srcline -> -- lambda expression
193         mkSrcLocUgn   srcline           $ \ src_loc ->
194         wlkList rdPat lampats   `thenUgn` \ pats ->
195         wlkExpr       lamexpr   `thenUgn` \ body ->
196         returnUgn (
197             HsLam (foldr PatMatch
198                          (GRHSMatch (GRHSsAndBindsIn
199                                       [OtherwiseGRHS body src_loc]
200                                       EmptyBinds))
201                          pats)
202         )
203
204       U_casee caseexpr casebody srcline ->      -- case expression
205         mkSrcLocUgn srcline              $ \ src_loc ->
206         wlkExpr         caseexpr `thenUgn` \ expr ->
207         wlkList rdMatch casebody `thenUgn` \ mats ->
208         getSrcFileUgn            `thenUgn` \ sf ->
209         let
210             matches = cvMatches sf True mats
211         in
212         returnUgn (HsCase expr matches src_loc)
213
214       U_ife ifpred ifthen ifelse srcline ->     -- if expression
215         mkSrcLocUgn srcline             $ \ src_loc ->
216         wlkExpr ifpred          `thenUgn` \ e1 ->
217         wlkExpr ifthen          `thenUgn` \ e2 ->
218         wlkExpr ifelse          `thenUgn` \ e3 ->
219         returnUgn (HsIf e1 e2 e3 src_loc)
220
221       U_let letvdefs letvexpr ->                -- let expression
222         wlkBinding letvdefs     `thenUgn` \ binding ->
223         wlkExpr    letvexpr     `thenUgn` \ expr    ->
224         getSrcFileUgn           `thenUgn` \ sf      ->
225         let
226             binds = cvBinds sf cvValSig binding
227         in
228         returnUgn (HsLet binds expr)
229
230       U_doe gdo srcline ->                      -- do expression
231         mkSrcLocUgn srcline             $ \ src_loc ->
232         wlkList rd_stmt gdo     `thenUgn` \ stmts ->
233         returnUgn (HsDo DoStmt stmts src_loc)
234         where
235         rd_stmt pt
236           = rdU_tree pt `thenUgn` \ bind ->
237             case bind of
238               U_doexp exp srcline ->
239                 mkSrcLocUgn srcline             $ \ src_loc ->
240                 wlkExpr exp             `thenUgn` \ expr ->
241                 returnUgn (ExprStmt expr src_loc)
242
243               U_dobind pat exp srcline ->
244                 mkSrcLocUgn srcline             $ \ src_loc ->
245                 wlkPat  pat             `thenUgn` \ patt ->
246                 wlkExpr exp             `thenUgn` \ expr ->
247                 returnUgn (BindStmt patt expr src_loc)
248
249               U_seqlet seqlet ->
250                 wlkBinding seqlet       `thenUgn` \ bs ->
251                 getSrcFileUgn           `thenUgn` \ sf ->
252                 let
253                     binds = cvBinds sf cvValSig bs
254                 in
255                 returnUgn (LetStmt binds)
256
257       U_comprh cexp cquals -> -- list comprehension
258         wlkExpr cexp            `thenUgn` \ expr  ->
259         wlkQuals cquals         `thenUgn` \ quals ->
260         getSrcLocUgn            `thenUgn` \ loc ->
261         returnUgn (HsDo ListComp (quals ++ [ReturnStmt expr]) loc)
262
263       U_eenum efrom estep eto -> -- arithmetic sequence
264         wlkExpr efrom           `thenUgn` \ e1  ->
265         wlkMaybe rdExpr estep   `thenUgn` \ es2 ->
266         wlkMaybe rdExpr eto     `thenUgn` \ es3 ->
267         returnUgn (cv_arith_seq e1 es2 es3)
268         where
269            cv_arith_seq e1 Nothing   Nothing   = ArithSeqIn (From       e1)
270            cv_arith_seq e1 Nothing   (Just e3) = ArithSeqIn (FromTo     e1 e3)
271            cv_arith_seq e1 (Just e2) Nothing   = ArithSeqIn (FromThen   e1 e2)
272            cv_arith_seq e1 (Just e2) (Just e3) = ArithSeqIn (FromThenTo e1 e2 e3)
273
274       U_restr restre restrt ->  -- expression with type signature
275         wlkExpr     restre      `thenUgn` \ expr ->
276         wlkHsType restrt        `thenUgn` \ ty   ->
277         returnUgn (ExprWithTySig expr ty)
278
279       --------------------------------------------------------------
280       -- now the prefix items that can either be an expression or
281       -- pattern, except we know they are *expressions* here
282       -- (this code could be commoned up with the pattern version;
283       -- but it probably isn't worth it)
284       --------------------------------------------------------------
285       U_lit lit ->
286         wlkLiteral lit  `thenUgn` \ lit ->
287         returnUgn (HsLit lit)
288
289       U_ident n ->                      -- simple identifier
290         wlkVarId n      `thenUgn` \ var ->
291         returnUgn (HsVar var)
292
293       U_ap fun arg ->                   -- application
294         wlkExpr fun     `thenUgn` \ expr1 ->
295         wlkExpr arg     `thenUgn` \ expr2 ->
296         returnUgn (HsApp expr1 expr2)
297
298       U_infixap fun arg1 arg2 ->        -- infix application
299         wlkVarId  fun   `thenUgn` \ op    ->
300         wlkExpr arg1    `thenUgn` \ expr1 ->
301         wlkExpr arg2    `thenUgn` \ expr2 ->
302         returnUgn (mkOpApp expr1 op expr2)
303
304       U_negate nexp ->                  -- prefix negation
305         wlkExpr nexp    `thenUgn` \ expr ->
306         returnUgn (NegApp expr (HsVar dummyRdrVarName))
307
308       U_llist llist -> -- explicit list
309         wlkList rdExpr llist `thenUgn` \ exprs ->
310         returnUgn (ExplicitList exprs)
311
312       U_tuple tuplelist -> -- explicit tuple
313         wlkList rdExpr tuplelist `thenUgn` \ exprs ->
314         returnUgn (ExplicitTuple exprs)
315
316       U_record con rbinds -> -- record construction
317         wlkDataId  con          `thenUgn` \ rcon     ->
318         wlkList rdRbind rbinds  `thenUgn` \ recbinds ->
319         returnUgn (RecordCon (HsVar rcon) recbinds)
320
321       U_rupdate updexp updbinds -> -- record update
322         wlkExpr updexp           `thenUgn` \ aexp ->
323         wlkList rdRbind updbinds `thenUgn` \ recbinds ->
324         returnUgn (RecordUpd aexp recbinds)
325
326 #ifdef DEBUG
327       U_hmodule _ _ _ _ _ _ _ -> error "U_hmodule"
328       U_as _ _                -> error "U_as"
329       U_lazyp _               -> error "U_lazyp"
330       U_wildp                 -> error "U_wildp"
331       U_qual _ _              -> error "U_qual"
332       U_guard _               -> error "U_guard"
333       U_seqlet _              -> error "U_seqlet"
334       U_dobind _ _ _          -> error "U_dobind"
335       U_doexp _ _             -> error "U_doexp"
336       U_rbind _ _             -> error "U_rbind"
337       U_fixop _ _ _           -> error "U_fixop"
338 #endif
339
340 rdRbind pt
341   = rdU_tree pt         `thenUgn` \ (U_rbind var exp) ->
342     wlkVarId   var      `thenUgn` \ rvar ->
343     wlkMaybe rdExpr exp `thenUgn` \ expr_maybe ->
344     returnUgn (
345       case expr_maybe of
346         Nothing -> (rvar, HsVar rvar, True{-pun-})
347         Just re -> (rvar, re,         False)
348     )
349
350 wlkQuals cquals
351   = wlkList rd_qual cquals
352   where
353           rd_qual pt
354             = rdU_tree pt       `thenUgn` \ qual ->
355               wlk_qual qual
356
357           wlk_qual qual
358             = case qual of
359                 U_guard exp ->
360                   wlkExpr exp   `thenUgn` \ expr ->
361                   getSrcLocUgn  `thenUgn` \ loc ->
362                   returnUgn (GuardStmt expr loc)
363
364                 U_qual qpat qexp ->
365                   wlkPat  qpat  `thenUgn` \ pat  ->
366                   wlkExpr qexp  `thenUgn` \ expr ->
367                   getSrcLocUgn  `thenUgn` \ loc ->
368                   returnUgn (BindStmt pat expr loc)
369
370                 U_seqlet seqlet ->
371                   wlkBinding seqlet     `thenUgn` \ bs ->
372                   getSrcFileUgn         `thenUgn` \ sf ->
373                   let
374                       binds = cvBinds sf cvValSig bs
375                   in
376                   returnUgn (LetStmt binds)
377 \end{code}
378
379 Patterns: just bear in mind that lists of patterns are represented as
380 a series of ``applications''.
381 \begin{code}
382 wlkPat pat
383   = case pat of
384       U_par ppat ->                     -- parenthesised pattern
385         wlkPat ppat     `thenUgn` \ pat ->
386         -- tidy things up a little:
387         returnUgn (
388         case pat of
389           VarPatIn _ -> pat
390           WildPatIn  -> pat
391           other      -> ParPatIn pat
392         )
393
394       U_as avar as_pat ->               -- "as" pattern
395         wlkVarId avar   `thenUgn` \ var ->
396         wlkPat as_pat   `thenUgn` \ pat ->
397         returnUgn (AsPatIn var pat)
398
399       U_lazyp lazyp ->                  -- irrefutable ("twiddle") pattern
400         wlkPat lazyp    `thenUgn` \ pat ->
401         returnUgn (LazyPatIn pat)
402
403       U_plusp avar lit ->
404         wlkVarId avar   `thenUgn` \ var ->
405         wlkLiteral lit  `thenUgn` \ lit ->
406         returnUgn (NPlusKPatIn var lit)
407
408       U_wildp -> returnUgn WildPatIn    -- wildcard pattern
409
410       U_lit lit ->                      -- literal pattern
411         wlkLiteral lit  `thenUgn` \ lit ->
412         returnUgn (LitPatIn lit)
413
414       U_ident nn ->                     -- simple identifier
415         wlkVarId nn     `thenUgn` \ n ->
416         returnUgn (
417           case rdrNameOcc n of
418                 VarOcc occ | isLexConId occ -> ConPatIn n []
419                 other                       -> VarPatIn n
420         )
421
422       U_ap l r ->       -- "application": there's a list of patterns lurking here!
423         wlkPat r                `thenUgn` \ rpat         ->
424         collect_pats l [rpat]   `thenUgn` \ (lpat,lpats) ->
425         (case lpat of
426             VarPatIn x          -> returnUgn (x,  lpats)
427             ConPatIn x []       -> returnUgn (x,  lpats)
428             ConOpPatIn x op _ y -> returnUgn (op, x:y:lpats)
429             _ -> getSrcLocUgn   `thenUgn` \ loc ->
430                  let
431                      err = addErrLoc loc "Illegal pattern `application'"
432                                      (\sty -> hsep (map (ppr sty) (lpat:lpats)))
433                      msg = show (err (PprForUser opt_PprUserLength))
434                  in
435 #if __GLASGOW_HASKELL__ == 201
436                  ioToUgnM  (GHCbase.ioToPrimIO (hPutStr stderr msg)) `thenUgn` \ _ ->
437                  ioToUgnM  (GHCbase.ioToPrimIO (ghcExit 1))          `thenUgn` \ _ ->
438 #elif __GLASGOW_HASKELL__ >= 202
439                  ioToUgnM  (IOBase.ioToPrimIO (hPutStr stderr msg)) `thenUgn` \ _ ->
440                  ioToUgnM  (IOBase.ioToPrimIO (ghcExit 1))           `thenUgn` \ _ ->
441 #else
442                  ioToUgnM  (hPutStr stderr msg) `thenUgn` \ _ ->
443                  ioToUgnM  (ghcExit 1)          `thenUgn` \ _ ->
444 #endif
445                  returnUgn (error "ReadPrefix")
446
447         )                       `thenUgn` \ (n, arg_pats) ->
448         returnUgn (ConPatIn n arg_pats)
449         where
450           collect_pats pat acc
451             = case pat of
452                 U_ap l r ->
453                   wlkPat r      `thenUgn` \ rpat  ->
454                   collect_pats l (rpat:acc)
455                 other ->
456                   wlkPat other  `thenUgn` \ pat ->
457                   returnUgn (pat,acc)
458
459       U_infixap fun arg1 arg2 ->        -- infix pattern
460         wlkVarId fun    `thenUgn` \ op   ->
461         wlkPat arg1     `thenUgn` \ pat1 ->
462         wlkPat arg2     `thenUgn` \ pat2 ->
463         returnUgn (ConOpPatIn pat1 op (error "ConOpPatIn:fixity") pat2)
464
465       U_negate npat ->                  -- negated pattern
466         wlkPat npat     `thenUgn` \ pat ->
467         returnUgn (NegPatIn pat)
468
469       U_llist llist ->                  -- explicit list
470         wlkList rdPat llist     `thenUgn` \ pats ->
471         returnUgn (ListPatIn pats)
472
473       U_tuple tuplelist ->              -- explicit tuple
474         wlkList rdPat tuplelist `thenUgn` \ pats ->
475         returnUgn (TuplePatIn pats)
476
477       U_record con rpats ->             -- record destruction
478         wlkDataId  con          `thenUgn` \ rcon     ->
479         wlkList rdRpat rpats    `thenUgn` \ recpats ->
480         returnUgn (RecPatIn rcon recpats)
481         where
482           rdRpat pt
483             = rdU_tree pt        `thenUgn` \ (U_rbind var pat) ->
484               wlkVarId   var     `thenUgn` \ rvar ->
485               wlkMaybe rdPat pat `thenUgn` \ pat_maybe ->
486               returnUgn (
487                 case pat_maybe of
488                   Nothing -> (rvar, VarPatIn rvar, True{-pun-})
489                   Just rp -> (rvar, rp,            False)
490               )
491 \end{code}
492
493 \begin{code}
494 wlkLiteral :: U_literal -> UgnM HsLit
495
496 wlkLiteral ulit
497   = returnUgn (
498     case ulit of
499       U_integer    s -> HsInt        (as_integer  s)
500       U_floatr     s -> HsFrac       (as_rational s)
501       U_intprim    s -> HsIntPrim    (as_integer  s)
502       U_doubleprim s -> HsDoublePrim (as_rational s)
503       U_floatprim  s -> HsFloatPrim  (as_rational s)
504       U_charr      s -> HsChar       (as_char     s)
505       U_charprim   s -> HsCharPrim   (as_char     s)
506       U_string     s -> HsString     (as_string   s)
507       U_stringprim s -> HsStringPrim (as_string   s)
508       U_clitlit    s -> HsLitLit     (as_string   s)
509     )
510   where
511     as_char s     = _HEAD_ s
512     as_integer s  = readInteger (_UNPK_ s)
513 #if __GLASGOW_HASKELL__ == 201
514     as_rational s = GHCbase.readRational__ (_UNPK_ s) -- non-std
515 #elif __GLASGOW_HASKELL__ >= 202
516     as_rational s = case readRational (_UNPK_ s) of { [(a,_)] -> a } -- ToDo, use non-std readRational__
517 #else
518     as_rational s = _readRational (_UNPK_ s) -- non-std
519 #endif
520     as_string s   = s
521 \end{code}
522
523 %************************************************************************
524 %*                                                                      *
525 \subsection{wlkBinding}
526 %*                                                                      *
527 %************************************************************************
528
529 \begin{code}
530 wlkBinding :: U_binding -> UgnM RdrBinding
531
532 wlkBinding binding
533   = case binding of
534         -- null binding
535       U_nullbind ->
536         returnUgn RdrNullBind
537
538         -- "and" binding (just glue, really)
539       U_abind a b ->
540         wlkBinding a    `thenUgn` \ binding1 ->
541         wlkBinding b    `thenUgn` \ binding2 ->
542         returnUgn (RdrAndBindings binding1 binding2)
543
544         -- "data" declaration
545       U_tbind tctxt ttype tcons tderivs srcline ->
546         mkSrcLocUgn        srcline          $ \ src_loc     ->
547         wlkContext         tctxt    `thenUgn` \ ctxt        ->
548         wlkTyConAndTyVars  ttype    `thenUgn` \ (tycon, tyvars) ->
549         wlkList rdConDecl  tcons    `thenUgn` \ cons        ->
550         wlkDerivings       tderivs  `thenUgn` \ derivings   ->
551         returnUgn (RdrTyDecl (TyData DataType ctxt tycon tyvars cons derivings noDataPragmas src_loc))
552
553         -- "newtype" declaration
554       U_ntbind ntctxt nttype ntcon ntderivs srcline ->
555         mkSrcLocUgn        srcline          $ \ src_loc     ->
556         wlkContext         ntctxt   `thenUgn` \ ctxt        ->
557         wlkTyConAndTyVars  nttype   `thenUgn` \ (tycon, tyvars) ->
558         wlkList rdConDecl  ntcon    `thenUgn` \ cons        ->
559         wlkDerivings       ntderivs `thenUgn` \ derivings   ->
560         returnUgn (RdrTyDecl (TyData NewType ctxt tycon tyvars cons derivings noDataPragmas src_loc))
561
562         -- "type" declaration
563       U_nbind nbindid nbindas srcline ->                
564         mkSrcLocUgn       srcline         $ \ src_loc       ->
565         wlkTyConAndTyVars nbindid `thenUgn` \ (tycon, tyvars) ->
566         wlkMonoType       nbindas `thenUgn` \ expansion     ->
567         returnUgn (RdrTyDecl (TySynonym tycon tyvars expansion src_loc))
568
569         -- function binding
570       U_fbind fbindl srcline ->
571         mkSrcLocUgn     srcline         $ \ src_loc ->
572         wlkList rdMatch fbindl  `thenUgn` \ matches ->
573         returnUgn (RdrFunctionBinding srcline matches)
574
575         -- pattern binding
576       U_pbind pbindl srcline ->
577         mkSrcLocUgn     srcline         $ \ src_loc ->
578         wlkList rdMatch pbindl  `thenUgn` \ matches ->
579         returnUgn (RdrPatternBinding srcline matches)
580
581         -- "class" declaration
582       U_cbind cbindc cbindid cbindw srcline ->
583         mkSrcLocUgn      srcline        $ \ src_loc       ->
584         wlkContext       cbindc  `thenUgn` \ ctxt         ->
585         wlkClassAssertTy cbindid `thenUgn` \ (clas, tyvar)->
586         wlkBinding       cbindw  `thenUgn` \ binding      ->
587         getSrcFileUgn            `thenUgn` \ sf           ->
588         let
589             (final_methods, final_sigs) = cvMonoBindsAndSigs sf cvClassOpSig binding
590         in
591         returnUgn (RdrClassDecl
592           (ClassDecl ctxt clas tyvar final_sigs final_methods noClassPragmas src_loc))
593
594         -- "instance" declaration
595       U_ibind ibindc iclas ibindi ibindw srcline ->
596         mkSrcLocUgn     srcline         $ \ src_loc ->
597         wlkContext      ibindc  `thenUgn` \ ctxt    ->
598         wlkTCId         iclas   `thenUgn` \ clas    ->
599         wlkMonoType     ibindi  `thenUgn` \ at_ty ->
600         wlkBinding      ibindw  `thenUgn` \ binding ->
601         getSrcModUgn            `thenUgn` \ modname ->
602         getSrcFileUgn           `thenUgn` \ sf      ->
603         let
604             (binds,uprags) = cvMonoBindsAndSigs sf cvInstDeclSig binding
605             inst_ty = HsPreForAllTy ctxt (MonoDictTy clas at_ty)
606         in
607         returnUgn (RdrInstDecl
608           (InstDecl inst_ty binds uprags Nothing {- No dfun id -} src_loc))
609
610         -- "default" declaration
611       U_dbind dbindts srcline ->
612         mkSrcLocUgn        srcline      $ \ src_loc ->
613         wlkList rdMonoType dbindts  `thenUgn` \ tys ->
614         returnUgn (RdrDefaultDecl (DefaultDecl tys src_loc))
615
616       a_sig_we_hope ->
617         -- signature(-like) things, including user pragmas
618         wlk_sig_thing a_sig_we_hope
619 \end{code}
620
621 \begin{code}
622 wlkDerivings :: U_maybe -> UgnM (Maybe [RdrName])
623
624 wlkDerivings (U_nothing) = returnUgn Nothing
625 wlkDerivings (U_just pt)
626   = rdU_list pt          `thenUgn` \ ds     ->
627     wlkList rdTCId ds    `thenUgn` \ derivs ->
628     returnUgn (Just derivs)
629 \end{code}
630
631 \begin{code}
632         -- type signature
633 wlk_sig_thing (U_sbind sbindids sbindid srcline)
634   = mkSrcLocUgn         srcline         $ \ src_loc ->
635     wlkList rdVarId     sbindids `thenUgn` \ vars    ->
636     wlkHsType           sbindid  `thenUgn` \ poly_ty ->
637     returnUgn (RdrTySig vars poly_ty src_loc)
638
639         -- value specialisation user-pragma
640 wlk_sig_thing (U_vspec_uprag uvar vspec_tys srcline)
641   = mkSrcLocUgn srcline                     $ \ src_loc ->
642     wlkVarId  uvar                  `thenUgn` \ var ->
643     wlkList rd_ty_and_id vspec_tys  `thenUgn` \ tys_and_ids ->
644     returnUgn (RdrSpecValSig [SpecSig var ty using_id src_loc
645                              | (ty, using_id) <- tys_and_ids ])
646   where
647     rd_ty_and_id :: ParseTree -> UgnM (RdrNameHsType, Maybe RdrName)
648     rd_ty_and_id pt
649       = rdU_binding pt          `thenUgn` \ (U_vspec_ty_and_id vspec_ty vspec_id) ->
650         wlkHsType vspec_ty      `thenUgn` \ ty       ->
651         wlkMaybe rdVarId vspec_id       `thenUgn` \ id_maybe ->
652         returnUgn(ty, id_maybe)
653
654         -- instance specialisation user-pragma
655 wlk_sig_thing (U_ispec_uprag iclas ispec_ty srcline)
656   = mkSrcLocUgn srcline                 $ \ src_loc ->
657     wlkTCId     iclas           `thenUgn` \ clas    ->
658     wlkMonoType ispec_ty        `thenUgn` \ ty      ->
659     returnUgn (RdrSpecInstSig (SpecInstSig clas ty src_loc))
660
661         -- data specialisation user-pragma
662 wlk_sig_thing (U_dspec_uprag itycon dspec_tys srcline)
663   = mkSrcLocUgn srcline                  $ \ src_loc ->
664     wlkTCId     itycon           `thenUgn` \ tycon   ->
665     wlkList rdMonoType dspec_tys `thenUgn` \ tys     ->
666     returnUgn (RdrSpecDataSig (SpecDataSig tycon (foldl MonoTyApp (MonoTyVar tycon) tys) src_loc))
667
668         -- value inlining user-pragma
669 wlk_sig_thing (U_inline_uprag ivar srcline)
670   = mkSrcLocUgn srcline                 $ \ src_loc ->
671     wlkVarId    ivar            `thenUgn` \ var     ->
672     returnUgn (RdrInlineValSig (InlineSig var src_loc))
673
674         -- "deforest me" user-pragma
675 wlk_sig_thing (U_deforest_uprag ivar srcline)
676   = mkSrcLocUgn srcline                 $ \ src_loc ->
677     wlkVarId    ivar            `thenUgn` \ var     ->
678     returnUgn (RdrDeforestSig (DeforestSig var src_loc))
679
680         -- "magic" unfolding user-pragma
681 wlk_sig_thing (U_magicuf_uprag ivar str srcline)
682   = mkSrcLocUgn srcline                 $ \ src_loc ->
683     wlkVarId    ivar            `thenUgn` \ var     ->
684     returnUgn (RdrMagicUnfoldingSig (MagicUnfoldingSig var str src_loc))
685 \end{code}
686
687 %************************************************************************
688 %*                                                                      *
689 \subsection[wlkTypes]{Reading in types in various forms (and data constructors)}
690 %*                                                                      *
691 %************************************************************************
692
693 \begin{code}
694 rdHsType :: ParseTree -> UgnM RdrNameHsType
695 rdMonoType :: ParseTree -> UgnM RdrNameHsType
696
697 rdHsType pt = rdU_ttype pt `thenUgn` \ ttype -> wlkHsType ttype
698 rdMonoType pt = rdU_ttype pt `thenUgn` \ ttype -> wlkMonoType ttype
699
700 wlkHsType :: U_ttype -> UgnM RdrNameHsType
701 wlkMonoType :: U_ttype -> UgnM RdrNameHsType
702
703 wlkHsType ttype
704   = case ttype of
705       U_context tcontextl tcontextt -> -- context
706         wlkContext  tcontextl   `thenUgn` \ ctxt ->
707         wlkMonoType tcontextt   `thenUgn` \ ty   ->
708         returnUgn (HsPreForAllTy ctxt ty)
709
710       other -> -- something else
711         wlkMonoType other   `thenUgn` \ ty ->
712         returnUgn (HsPreForAllTy [{-no context-}] ty)
713
714 wlkMonoType ttype
715   = case ttype of
716                 -- Glasgow extension: nested polymorhism
717       U_context tcontextl tcontextt -> -- context
718         wlkContext  tcontextl   `thenUgn` \ ctxt ->
719         wlkMonoType tcontextt   `thenUgn` \ ty   ->
720         returnUgn (HsPreForAllTy ctxt ty)
721
722       U_namedtvar tv -> -- type variable
723         wlkTvId tv      `thenUgn` \ tyvar ->
724         returnUgn (MonoTyVar tyvar)
725
726       U_tname tcon -> -- type constructor
727         wlkTCId tcon    `thenUgn` \ tycon ->
728         returnUgn (MonoTyVar tycon)
729
730       U_tapp t1 t2 ->
731         wlkMonoType t1          `thenUgn` \ ty1 ->
732         wlkMonoType t2          `thenUgn` \ ty2 ->
733         returnUgn (MonoTyApp ty1 ty2)
734               
735       U_tllist tlist -> -- list type
736         wlkMonoType tlist       `thenUgn` \ ty ->
737         returnUgn (MonoListTy dummyRdrTcName ty)
738
739       U_ttuple ttuple ->
740         wlkList rdMonoType ttuple `thenUgn` \ tys ->
741         returnUgn (MonoTupleTy dummyRdrTcName tys)
742
743       U_tfun tfun targ ->
744         wlkMonoType tfun        `thenUgn` \ ty1 ->
745         wlkMonoType targ        `thenUgn` \ ty2 ->
746         returnUgn (MonoFunTy ty1 ty2)
747
748 \end{code}
749
750 \begin{code}
751 wlkTyConAndTyVars :: U_ttype -> UgnM (RdrName, [HsTyVar RdrName])
752 wlkContext        :: U_list  -> UgnM RdrNameContext
753 wlkClassAssertTy  :: U_ttype -> UgnM (RdrName, HsTyVar RdrName)
754
755 wlkTyConAndTyVars ttype
756   = wlkMonoType ttype   `thenUgn` \ ty ->
757     let
758         split (MonoTyApp fun (MonoTyVar arg)) args = split fun (UserTyVar arg : args)
759         split (MonoTyVar tycon)               args = (tycon,args)
760     in
761     returnUgn (split ty [])
762
763 wlkContext list
764   = wlkList rdMonoType list `thenUgn` \ tys ->
765     returnUgn (map mk_class_assertion tys)
766
767 wlkClassAssertTy xs
768   = wlkMonoType xs   `thenUgn` \ mono_ty ->
769     returnUgn (case mk_class_assertion mono_ty of
770                   (clas, MonoTyVar tyvar) -> (clas, UserTyVar tyvar)
771     )
772
773 mk_class_assertion :: RdrNameHsType -> (RdrName, RdrNameHsType)
774
775 mk_class_assertion (MonoTyApp (MonoTyVar name) ty@(MonoTyVar tyname)) = (name, ty)
776 mk_class_assertion other
777   = pprError "ERROR: malformed type context: " (ppr (PprForUser opt_PprUserLength) other)
778     -- regrettably, the parser does let some junk past
779     -- e.g., f :: Num {-nothing-} => a -> ...
780 \end{code}
781
782 \begin{code}
783 rdConDecl :: ParseTree -> UgnM RdrNameConDecl
784 rdConDecl pt
785   = rdU_constr pt    `thenUgn` \ blah ->
786     wlkConDecl blah
787
788 wlkConDecl :: U_constr -> UgnM RdrNameConDecl
789
790 wlkConDecl (U_constrcxt ccxt ccdecl)
791   = wlkContext ccxt             `thenUgn` \ theta ->
792     wlkConDecl ccdecl           `thenUgn` \ (ConDecl con _ details loc) ->
793     returnUgn (ConDecl con theta details loc)
794
795 wlkConDecl (U_constrpre ccon ctys srcline)
796   = mkSrcLocUgn srcline                 $ \ src_loc ->
797     wlkDataId   ccon            `thenUgn` \ con     ->
798     wlkList     rdBangType ctys `thenUgn` \ tys     ->
799     returnUgn (ConDecl con [] (VanillaCon tys) src_loc)
800
801 wlkConDecl (U_constrinf cty1 cop cty2 srcline)
802   = mkSrcLocUgn srcline                 $ \ src_loc ->
803     wlkBangType cty1            `thenUgn` \ ty1     ->
804     wlkDataId   cop             `thenUgn` \ op      ->
805     wlkBangType cty2            `thenUgn` \ ty2     ->
806     returnUgn (ConDecl op [] (InfixCon ty1 ty2) src_loc)
807
808 wlkConDecl (U_constrnew ccon cty srcline)
809   = mkSrcLocUgn srcline                 $ \ src_loc ->
810     wlkDataId   ccon            `thenUgn` \ con     ->
811     wlkMonoType cty             `thenUgn` \ ty      ->
812     returnUgn (ConDecl con [] (NewCon ty) src_loc)
813
814 wlkConDecl (U_constrrec ccon cfields srcline)
815   = mkSrcLocUgn srcline                 $ \ src_loc      ->
816     wlkDataId   ccon            `thenUgn` \ con          ->
817     wlkList rd_field cfields    `thenUgn` \ fields_lists ->
818     returnUgn (ConDecl con [] (RecCon fields_lists) src_loc)
819   where
820     rd_field :: ParseTree -> UgnM ([RdrName], BangType RdrName)
821     rd_field pt
822       = rdU_constr pt           `thenUgn` \ (U_field fvars fty) ->
823         wlkList rdVarId fvars   `thenUgn` \ vars ->
824         wlkBangType fty         `thenUgn` \ ty ->
825         returnUgn (vars, ty)
826
827 -----------------
828 rdBangType pt = rdU_ttype pt `thenUgn` \ ty -> wlkBangType ty
829
830 wlkBangType :: U_ttype -> UgnM (BangType RdrName)
831
832 wlkBangType (U_tbang bty) = wlkMonoType bty `thenUgn` \ ty ->
833                             returnUgn (Banged   ty)
834 wlkBangType uty           = wlkMonoType uty `thenUgn` \ ty ->
835                             returnUgn (Unbanged ty)
836 \end{code}
837
838 %************************************************************************
839 %*                                                                      *
840 \subsection{Read a ``match''}
841 %*                                                                      *
842 %************************************************************************
843
844 \begin{code}
845 rdMatch :: ParseTree -> UgnM RdrMatch
846
847 rdMatch pt
848   = rdU_pbinding pt `thenUgn` \ (U_pgrhs gpat gdexprs gbind gsrcfun srcline) ->
849     mkSrcLocUgn srcline                 $ \ src_loc      ->
850     wlkPat      gpat            `thenUgn` \ pat     ->
851     wlkBinding  gbind           `thenUgn` \ binding ->
852     wlkVarId    gsrcfun         `thenUgn` \ srcfun  ->
853     let
854         wlk_guards (U_pnoguards exp)
855           = wlkExpr exp `thenUgn` \ expr ->
856             returnUgn (RdrMatch_NoGuard srcline srcfun pat expr binding)
857
858         wlk_guards (U_pguards gs)
859           = wlkList rd_gd_expr gs   `thenUgn` \ gd_exps ->
860             returnUgn (RdrMatch_Guards  srcline srcfun pat gd_exps binding)
861     in
862     wlk_guards gdexprs
863   where
864     rd_gd_expr pt
865       = rdU_pbinding pt `thenUgn` \ (U_pgdexp g e) ->
866         wlkQuals     g  `thenUgn` \ guard ->
867         wlkExpr      e  `thenUgn` \ expr  ->
868         returnUgn (guard, expr)
869 \end{code}
870
871 %************************************************************************
872 %*                                                                      *
873 \subsection[rdFixOp]{Read in a fixity declaration}
874 %*                                                                      *
875 %************************************************************************
876
877 \begin{code}
878 rdFixOp :: ParseTree -> UgnM RdrNameFixityDecl
879 rdFixOp pt 
880   = rdU_tree pt `thenUgn` \ fix ->
881     case fix of
882       U_fixop op dir_n prec -> wlkVarId op `thenUgn` \ op ->
883                                        returnUgn (FixityDecl op (Fixity prec dir) noSrcLoc)
884                                                 -- ToDo: add SrcLoc!
885                             where
886                               dir = case dir_n of
887                                         (-1) -> InfixL
888                                         0    -> InfixN
889                                         1    -> InfixR
890       _ -> error "ReadPrefix:rdFixOp"
891 \end{code}
892
893 %************************************************************************
894 %*                                                                      *
895 \subsection[rdImport]{Read an import decl}
896 %*                                                                      *
897 %************************************************************************
898
899 \begin{code}
900 rdImport :: ParseTree
901          -> UgnM RdrNameImportDecl
902
903 rdImport pt
904   = rdU_binding pt `thenUgn` \ (U_import imod iqual ias ispec isrc srcline) ->
905     mkSrcLocUgn srcline                         $ \ src_loc      ->
906     wlkMaybe rdU_stringId ias           `thenUgn` \ maybe_as    ->
907     wlkMaybe rd_spec ispec              `thenUgn` \ maybe_spec  ->
908     returnUgn (ImportDecl imod (cvFlag iqual) (cvIfaceFlavour isrc) maybe_as maybe_spec src_loc)
909   where
910     rd_spec pt = rdU_either pt          `thenUgn` \ spec ->
911       case spec of
912         U_left pt  -> rdEntities pt     `thenUgn` \ ents ->
913                       returnUgn (False, ents)
914         U_right pt -> rdEntities pt     `thenUgn` \ ents ->
915                       returnUgn (True, ents)
916
917 cvIfaceFlavour 0 = HiFile       -- No pragam
918 cvIfaceFlavour 1 = HiBootFile   -- {-# SOURCE #-}
919 \end{code}
920
921 \begin{code}
922 rdEntities pt
923   = rdU_list pt             `thenUgn` \ list ->
924     wlkList rdEntity list
925
926 rdEntity :: ParseTree -> UgnM (IE RdrName)
927
928 rdEntity pt
929   = rdU_entidt pt `thenUgn` \ entity ->
930     case entity of
931       U_entid evar ->           -- just a value
932         wlkEntId        evar            `thenUgn` \ var ->
933         returnUgn (IEVar var)
934
935       U_enttype x ->            -- abstract type constructor/class
936         wlkTCId x               `thenUgn` \ thing ->
937         returnUgn (IEThingAbs thing)
938
939       U_enttypeall x ->         -- non-abstract type constructor/class
940         wlkTCId x               `thenUgn` \ thing ->
941         returnUgn (IEThingAll thing)
942
943       U_enttypenamed x ns ->    -- non-abstract type constructor/class
944                                 -- with specified constrs/methods
945         wlkTCId x               `thenUgn` \ thing ->
946         wlkList rdVarId ns      `thenUgn` \ names -> 
947         returnUgn (IEThingWith thing names)
948
949       U_entmod mod ->           -- everything provided unqualified by a module
950         returnUgn (IEModuleContents mod)
951 \end{code}
952