2 % (c) The AQUA Project, Glasgow University, 1994-1996
4 \section{Read parse tree built by Yacc parser}
7 #include "HsVersions.h"
9 module ReadPrefix ( rdModule ) where
12 IMPORT_1_3(IO(hPutStr, stderr))
13 IMPORT_1_3(GHCio(stThen))
15 import UgenAll -- all Yacc parser gumpff...
16 import PrefixSyn -- and various syntaxen.
18 import HsPragmas ( noDataPragmas, noClassPragmas, noInstancePragmas )
22 import ErrUtils ( addErrLoc, ghcExit )
23 import FiniteMap ( elemFM, FiniteMap )
24 import Name ( RdrName(..), isRdrLexConOrSpecial, preludeQual )
25 import PprStyle ( PprStyle(..) )
26 import PrelMods ( pRELUDE )
28 import SrcLoc ( SrcLoc )
29 import Util ( nOfThem, pprError, panic )
32 %************************************************************************
34 \subsection[ReadPrefix-help]{Help Functions}
36 %************************************************************************
39 wlkList :: (U_VOID_STAR -> UgnM a) -> U_list -> UgnM [a]
41 wlkList wlk_it U_lnil = returnUgn []
43 wlkList wlk_it (U_lcons hd tl)
44 = wlk_it hd `thenUgn` \ hd_it ->
45 wlkList wlk_it tl `thenUgn` \ tl_it ->
46 returnUgn (hd_it : tl_it)
50 wlkMaybe :: (U_VOID_STAR -> UgnM a) -> U_maybe -> UgnM (Maybe a)
52 wlkMaybe wlk_it U_nothing = returnUgn Nothing
53 wlkMaybe wlk_it (U_just x)
54 = wlk_it x `thenUgn` \ it ->
59 rdQid :: ParseTree -> UgnM RdrName
60 rdQid pt = rdU_qid pt `thenUgn` \ qid -> wlkQid qid
62 wlkQid :: U_qid -> UgnM RdrName
63 wlkQid (U_noqual name)
64 = returnUgn (Unqual name)
65 wlkQid (U_aqual mod name)
66 = returnUgn (Qual mod name)
68 = returnUgn (preludeQual name)
70 cvFlag :: U_long -> Bool
75 %************************************************************************
77 \subsection[rdModule]{@rdModule@: reads in a Haskell module}
79 %************************************************************************
82 #if __GLASGOW_HASKELL__ >= 200
83 # define PACK_STR packCString
84 # define CCALL_THEN `stThen`
86 # define PACK_STR _packCString
87 # define CCALL_THEN `thenPrimIO`
90 rdModule :: IO (Module, -- this module's name
91 RdrNameHsModule) -- the main goods
94 = _ccall_ hspmain CCALL_THEN \ pt -> -- call the Yacc parser!
96 srcfile = PACK_STR ``input_filename'' -- What A Great Hack! (TM)
99 rdU_tree pt `thenUgn` \ (U_hmodule modname himplist hexplist hfixlist
100 hmodlist srciface_version srcline) ->
102 setSrcFileUgn srcfile $
103 setSrcModUgn modname $
104 mkSrcLocUgn srcline $ \ src_loc ->
106 wlkMaybe rdEntities hexplist `thenUgn` \ exports ->
107 wlkList rdImport himplist `thenUgn` \ imports ->
108 wlkList rdFixOp hfixlist `thenUgn` \ fixities ->
109 wlkBinding hmodlist `thenUgn` \ binding ->
111 case sepDeclsForTopBinds binding of
112 (tydecls, tysigs, classdecls, instdecls, instsigs, defaultdecls, binds) ->
116 (case srciface_version of { 0 -> Nothing; n -> Just n })
126 (cvSepdBinds srcfile cvValSig binds)
127 [{-no interface sigs yet-}]
132 %************************************************************************
134 \subsection[wlkExprOrPat]{@wlkExpr@ and @wlkPat@}
136 %************************************************************************
139 rdExpr :: ParseTree -> UgnM RdrNameHsExpr
140 rdPat :: ParseTree -> UgnM RdrNamePat
142 rdExpr pt = rdU_tree pt `thenUgn` \ tree -> wlkExpr tree
143 rdPat pt = rdU_tree pt `thenUgn` \ tree -> wlkPat tree
145 wlkExpr :: U_tree -> UgnM RdrNameHsExpr
146 wlkPat :: U_tree -> UgnM RdrNamePat
150 U_par pexpr -> -- parenthesised expr
151 wlkExpr pexpr `thenUgn` \ expr ->
152 returnUgn (HsPar expr)
154 U_lsection lsexp lop -> -- left section
155 wlkExpr lsexp `thenUgn` \ expr ->
156 wlkQid lop `thenUgn` \ op ->
157 returnUgn (SectionL expr (HsVar op))
159 U_rsection rop rsexp -> -- right section
160 wlkQid rop `thenUgn` \ op ->
161 wlkExpr rsexp `thenUgn` \ expr ->
162 returnUgn (SectionR (HsVar op) expr)
164 U_ccall fun flavor ccargs -> -- ccall/casm
165 wlkList rdExpr ccargs `thenUgn` \ args ->
169 returnUgn (CCall fun args
170 (tag == 'p' || tag == 'P') -- may invoke GC
171 (tag == 'N' || tag == 'P') -- really a "casm"
172 (panic "CCall:result_ty"))
174 U_scc label sccexp -> -- scc (set-cost-centre) expression
175 wlkExpr sccexp `thenUgn` \ expr ->
176 returnUgn (HsSCC label expr)
178 U_lambda lampats lamexpr srcline -> -- lambda expression
179 mkSrcLocUgn srcline $ \ src_loc ->
180 wlkList rdPat lampats `thenUgn` \ pats ->
181 wlkExpr lamexpr `thenUgn` \ body ->
183 HsLam (foldr PatMatch
184 (GRHSMatch (GRHSsAndBindsIn
185 [OtherwiseGRHS body src_loc]
190 U_casee caseexpr casebody srcline -> -- case expression
191 mkSrcLocUgn srcline $ \ src_loc ->
192 wlkExpr caseexpr `thenUgn` \ expr ->
193 wlkList rdMatch casebody `thenUgn` \ mats ->
194 getSrcFileUgn `thenUgn` \ sf ->
196 matches = cvMatches sf True mats
198 returnUgn (HsCase expr matches src_loc)
200 U_ife ifpred ifthen ifelse srcline -> -- if expression
201 mkSrcLocUgn srcline $ \ src_loc ->
202 wlkExpr ifpred `thenUgn` \ e1 ->
203 wlkExpr ifthen `thenUgn` \ e2 ->
204 wlkExpr ifelse `thenUgn` \ e3 ->
205 returnUgn (HsIf e1 e2 e3 src_loc)
207 U_let letvdefs letvexpr -> -- let expression
208 wlkBinding letvdefs `thenUgn` \ binding ->
209 wlkExpr letvexpr `thenUgn` \ expr ->
210 getSrcFileUgn `thenUgn` \ sf ->
212 binds = cvBinds sf cvValSig binding
214 returnUgn (HsLet binds expr)
216 U_doe gdo srcline -> -- do expression
217 mkSrcLocUgn srcline $ \ src_loc ->
218 wlkList rd_stmt gdo `thenUgn` \ stmts ->
219 returnUgn (HsDo stmts src_loc)
222 = rdU_tree pt `thenUgn` \ bind ->
224 U_doexp exp srcline ->
225 mkSrcLocUgn srcline $ \ src_loc ->
226 wlkExpr exp `thenUgn` \ expr ->
227 returnUgn (ExprStmt expr src_loc)
229 U_dobind pat exp srcline ->
230 mkSrcLocUgn srcline $ \ src_loc ->
231 wlkPat pat `thenUgn` \ patt ->
232 wlkExpr exp `thenUgn` \ expr ->
233 returnUgn (BindStmt patt expr src_loc)
236 wlkBinding seqlet `thenUgn` \ bs ->
237 getSrcFileUgn `thenUgn` \ sf ->
239 binds = cvBinds sf cvValSig bs
241 returnUgn (LetStmt binds)
243 U_comprh cexp cquals -> -- list comprehension
244 wlkExpr cexp `thenUgn` \ expr ->
245 wlkList rd_qual cquals `thenUgn` \ quals ->
246 returnUgn (ListComp expr quals)
249 = rdU_tree pt `thenUgn` \ qual ->
255 wlkExpr exp `thenUgn` \ expr ->
256 returnUgn (FilterQual expr)
259 wlkPat qpat `thenUgn` \ pat ->
260 wlkExpr qexp `thenUgn` \ expr ->
261 returnUgn (GeneratorQual pat expr)
264 wlkBinding seqlet `thenUgn` \ bs ->
265 getSrcFileUgn `thenUgn` \ sf ->
267 binds = cvBinds sf cvValSig bs
269 returnUgn (LetQual binds)
271 U_eenum efrom estep eto -> -- arithmetic sequence
272 wlkExpr efrom `thenUgn` \ e1 ->
273 wlkMaybe rdExpr estep `thenUgn` \ es2 ->
274 wlkMaybe rdExpr eto `thenUgn` \ es3 ->
275 returnUgn (cv_arith_seq e1 es2 es3)
277 cv_arith_seq e1 Nothing Nothing = ArithSeqIn (From e1)
278 cv_arith_seq e1 Nothing (Just e3) = ArithSeqIn (FromTo e1 e3)
279 cv_arith_seq e1 (Just e2) Nothing = ArithSeqIn (FromThen e1 e2)
280 cv_arith_seq e1 (Just e2) (Just e3) = ArithSeqIn (FromThenTo e1 e2 e3)
282 U_restr restre restrt -> -- expression with type signature
283 wlkExpr restre `thenUgn` \ expr ->
284 wlkPolyType restrt `thenUgn` \ ty ->
285 returnUgn (ExprWithTySig expr ty)
287 --------------------------------------------------------------
288 -- now the prefix items that can either be an expression or
289 -- pattern, except we know they are *expressions* here
290 -- (this code could be commoned up with the pattern version;
291 -- but it probably isn't worth it)
292 --------------------------------------------------------------
294 wlkLiteral lit `thenUgn` \ lit ->
295 returnUgn (HsLit lit)
297 U_ident n -> -- simple identifier
298 wlkQid n `thenUgn` \ var ->
299 returnUgn (HsVar var)
301 U_ap fun arg -> -- application
302 wlkExpr fun `thenUgn` \ expr1 ->
303 wlkExpr arg `thenUgn` \ expr2 ->
304 returnUgn (HsApp expr1 expr2)
306 U_infixap fun arg1 arg2 -> -- infix application
307 wlkQid fun `thenUgn` \ op ->
308 wlkExpr arg1 `thenUgn` \ expr1 ->
309 wlkExpr arg2 `thenUgn` \ expr2 ->
310 returnUgn (OpApp expr1 (HsVar op) expr2)
312 U_negate nexp -> -- prefix negation
313 wlkExpr nexp `thenUgn` \ expr ->
316 rdr = preludeQual SLIT("negate")
318 returnUgn (NegApp expr (HsVar rdr))
320 U_llist llist -> -- explicit list
321 wlkList rdExpr llist `thenUgn` \ exprs ->
322 returnUgn (ExplicitList exprs)
324 U_tuple tuplelist -> -- explicit tuple
325 wlkList rdExpr tuplelist `thenUgn` \ exprs ->
326 returnUgn (ExplicitTuple exprs)
328 U_record con rbinds -> -- record construction
329 wlkQid con `thenUgn` \ rcon ->
330 wlkList rdRbind rbinds `thenUgn` \ recbinds ->
331 returnUgn (RecordCon (HsVar rcon) recbinds)
333 U_rupdate updexp updbinds -> -- record update
334 wlkExpr updexp `thenUgn` \ aexp ->
335 wlkList rdRbind updbinds `thenUgn` \ recbinds ->
336 returnUgn (RecordUpd aexp recbinds)
339 U_hmodule _ _ _ _ _ _ _ -> error "U_hmodule"
340 U_as _ _ -> error "U_as"
341 U_lazyp _ -> error "U_lazyp"
342 U_wildp -> error "U_wildp"
343 U_qual _ _ -> error "U_qual"
344 U_guard _ -> error "U_guard"
345 U_seqlet _ -> error "U_seqlet"
346 U_dobind _ _ _ -> error "U_dobind"
347 U_doexp _ _ -> error "U_doexp"
348 U_rbind _ _ -> error "U_rbind"
349 U_fixop _ _ _ -> error "U_fixop"
353 = rdU_tree pt `thenUgn` \ (U_rbind var exp) ->
354 wlkQid var `thenUgn` \ rvar ->
355 wlkMaybe rdExpr exp `thenUgn` \ expr_maybe ->
358 Nothing -> (rvar, HsVar rvar, True{-pun-})
359 Just re -> (rvar, re, False)
363 Patterns: just bear in mind that lists of patterns are represented as
364 a series of ``applications''.
368 U_par ppat -> -- parenthesised pattern
369 wlkPat ppat `thenUgn` \ pat ->
370 -- tidy things up a little:
375 other -> ParPatIn pat
378 U_as avar as_pat -> -- "as" pattern
379 wlkQid avar `thenUgn` \ var ->
380 wlkPat as_pat `thenUgn` \ pat ->
381 returnUgn (AsPatIn var pat)
383 U_lazyp lazyp -> -- irrefutable ("twiddle") pattern
384 wlkPat lazyp `thenUgn` \ pat ->
385 returnUgn (LazyPatIn pat)
387 U_wildp -> returnUgn WildPatIn -- wildcard pattern
389 U_lit lit -> -- literal pattern
390 wlkLiteral lit `thenUgn` \ lit ->
391 returnUgn (LitPatIn lit)
393 U_ident nn -> -- simple identifier
394 wlkQid nn `thenUgn` \ n ->
396 if isRdrLexConOrSpecial n
401 U_ap l r -> -- "application": there's a list of patterns lurking here!
402 wlkPat r `thenUgn` \ rpat ->
403 collect_pats l [rpat] `thenUgn` \ (lpat,lpats) ->
405 VarPatIn x -> returnUgn (x, lpats)
406 ConPatIn x [] -> returnUgn (x, lpats)
407 ConOpPatIn x op y -> returnUgn (op, x:y:lpats)
408 _ -> getSrcLocUgn `thenUgn` \ loc ->
410 err = addErrLoc loc "Illegal pattern `application'"
411 (\sty -> ppInterleave ppSP (map (ppr sty) (lpat:lpats)))
412 msg = ppShow 100 (err PprForUser)
414 #if __GLASGOW_HASKELL__ >= 200
415 ioToUgnM (GHCbase.ioToPrimIO (hPutStr stderr msg)) `thenUgn` \ _ ->
416 ioToUgnM (GHCbase.ioToPrimIO (ghcExit 1)) `thenUgn` \ _ ->
418 ioToUgnM (hPutStr stderr msg) `thenUgn` \ _ ->
419 ioToUgnM (ghcExit 1) `thenUgn` \ _ ->
421 returnUgn (error "ReadPrefix")
423 ) `thenUgn` \ (n, arg_pats) ->
424 returnUgn (ConPatIn n arg_pats)
429 wlkPat r `thenUgn` \ rpat ->
430 collect_pats l (rpat:acc)
432 wlkPat other `thenUgn` \ pat ->
435 U_infixap fun arg1 arg2 -> -- infix pattern
436 wlkQid fun `thenUgn` \ op ->
437 wlkPat arg1 `thenUgn` \ pat1 ->
438 wlkPat arg2 `thenUgn` \ pat2 ->
439 returnUgn (ConOpPatIn pat1 op pat2)
441 U_negate npat -> -- negated pattern
442 wlkPat npat `thenUgn` \ pat ->
443 returnUgn (NegPatIn pat)
445 U_llist llist -> -- explicit list
446 wlkList rdPat llist `thenUgn` \ pats ->
447 returnUgn (ListPatIn pats)
449 U_tuple tuplelist -> -- explicit tuple
450 wlkList rdPat tuplelist `thenUgn` \ pats ->
451 returnUgn (TuplePatIn pats)
453 U_record con rpats -> -- record destruction
454 wlkQid con `thenUgn` \ rcon ->
455 wlkList rdRpat rpats `thenUgn` \ recpats ->
456 returnUgn (RecPatIn rcon recpats)
459 = rdU_tree pt `thenUgn` \ (U_rbind var pat) ->
460 wlkQid var `thenUgn` \ rvar ->
461 wlkMaybe rdPat pat `thenUgn` \ pat_maybe ->
464 Nothing -> (rvar, VarPatIn rvar, True{-pun-})
465 Just rp -> (rvar, rp, False)
470 wlkLiteral :: U_literal -> UgnM HsLit
475 U_integer s -> HsInt (as_integer s)
476 U_floatr s -> HsFrac (as_rational s)
477 U_intprim s -> HsIntPrim (as_integer s)
478 U_doubleprim s -> HsDoublePrim (as_rational s)
479 U_floatprim s -> HsFloatPrim (as_rational s)
480 U_charr s -> HsChar (as_char s)
481 U_charprim s -> HsCharPrim (as_char s)
482 U_string s -> HsString (as_string s)
483 U_stringprim s -> HsStringPrim (as_string s)
484 U_clitlit s -> HsLitLit (as_string s)
488 as_integer s = readInteger (_UNPK_ s)
489 #if __GLASGOW_HASKELL__ >= 200
490 as_rational s = GHCbase.readRational__ (_UNPK_ s) -- non-std
492 as_rational s = _readRational (_UNPK_ s) -- non-std
497 %************************************************************************
499 \subsection{wlkBinding}
501 %************************************************************************
504 wlkBinding :: U_binding -> UgnM RdrBinding
510 returnUgn RdrNullBind
512 -- "and" binding (just glue, really)
514 wlkBinding a `thenUgn` \ binding1 ->
515 wlkBinding b `thenUgn` \ binding2 ->
516 returnUgn (RdrAndBindings binding1 binding2)
518 -- "data" declaration
519 U_tbind tctxt ttype tcons tderivs srcline ->
520 mkSrcLocUgn srcline $ \ src_loc ->
521 wlkContext tctxt `thenUgn` \ ctxt ->
522 wlkTyConAndTyVars ttype `thenUgn` \ (tycon, tyvars) ->
523 wlkList rdConDecl tcons `thenUgn` \ cons ->
524 wlkDerivings tderivs `thenUgn` \ derivings ->
525 returnUgn (RdrTyDecl (TyData ctxt tycon tyvars cons derivings noDataPragmas src_loc))
527 -- "newtype" declaration
528 U_ntbind ntctxt nttype ntcon ntderivs srcline ->
529 mkSrcLocUgn srcline $ \ src_loc ->
530 wlkContext ntctxt `thenUgn` \ ctxt ->
531 wlkTyConAndTyVars nttype `thenUgn` \ (tycon, tyvars) ->
532 wlkList rdConDecl ntcon `thenUgn` \ con ->
533 wlkDerivings ntderivs `thenUgn` \ derivings ->
534 returnUgn (RdrTyDecl (TyNew ctxt tycon tyvars con derivings noDataPragmas src_loc))
536 -- "type" declaration
537 U_nbind nbindid nbindas srcline ->
538 mkSrcLocUgn srcline $ \ src_loc ->
539 wlkTyConAndTyVars nbindid `thenUgn` \ (tycon, tyvars) ->
540 wlkMonoType nbindas `thenUgn` \ expansion ->
541 returnUgn (RdrTyDecl (TySynonym tycon tyvars expansion src_loc))
544 U_fbind fbindl srcline ->
545 mkSrcLocUgn srcline $ \ src_loc ->
546 wlkList rdMatch fbindl `thenUgn` \ matches ->
547 returnUgn (RdrFunctionBinding srcline matches)
550 U_pbind pbindl srcline ->
551 mkSrcLocUgn srcline $ \ src_loc ->
552 wlkList rdMatch pbindl `thenUgn` \ matches ->
553 returnUgn (RdrPatternBinding srcline matches)
555 -- "class" declaration
556 U_cbind cbindc cbindid cbindw srcline ->
557 mkSrcLocUgn srcline $ \ src_loc ->
558 wlkContext cbindc `thenUgn` \ ctxt ->
559 wlkClassAssertTy cbindid `thenUgn` \ (clas, tyvar)->
560 wlkBinding cbindw `thenUgn` \ binding ->
561 getSrcFileUgn `thenUgn` \ sf ->
563 (class_sigs, class_methods) = sepDeclsIntoSigsAndBinds binding
565 final_sigs = concat (map cvClassOpSig class_sigs)
566 final_methods = cvMonoBinds sf class_methods
568 returnUgn (RdrClassDecl
569 (ClassDecl ctxt clas tyvar final_sigs final_methods noClassPragmas src_loc))
571 -- "instance" declaration
572 U_ibind ibindc iclas ibindi ibindw srcline ->
573 mkSrcLocUgn srcline $ \ src_loc ->
574 wlkContext ibindc `thenUgn` \ ctxt ->
575 wlkQid iclas `thenUgn` \ clas ->
576 wlkMonoType ibindi `thenUgn` \ inst_ty ->
577 wlkBinding ibindw `thenUgn` \ binding ->
578 getSrcModUgn `thenUgn` \ modname ->
579 getSrcFileUgn `thenUgn` \ sf ->
581 (ss, bs) = sepDeclsIntoSigsAndBinds binding
582 binds = cvMonoBinds sf bs
583 uprags = concat (map cvInstDeclSig ss)
584 ctxt_inst_ty = HsPreForAllTy ctxt inst_ty
586 returnUgn (RdrInstDecl
587 (InstDecl clas ctxt_inst_ty binds True{-from here-} modname uprags noInstancePragmas src_loc))
589 -- "default" declaration
590 U_dbind dbindts srcline ->
591 mkSrcLocUgn srcline $ \ src_loc ->
592 wlkList rdMonoType dbindts `thenUgn` \ tys ->
593 returnUgn (RdrDefaultDecl (DefaultDecl tys src_loc))
596 -- signature(-like) things, including user pragmas
597 wlk_sig_thing a_sig_we_hope
601 wlkDerivings :: U_maybe -> UgnM (Maybe [RdrName])
603 wlkDerivings (U_nothing) = returnUgn Nothing
604 wlkDerivings (U_just pt)
605 = rdU_list pt `thenUgn` \ ds ->
606 wlkList rdQid ds `thenUgn` \ derivs ->
607 returnUgn (Just derivs)
612 wlk_sig_thing (U_sbind sbindids sbindid srcline)
613 = mkSrcLocUgn srcline $ \ src_loc ->
614 wlkList rdQid sbindids `thenUgn` \ vars ->
615 wlkPolyType sbindid `thenUgn` \ poly_ty ->
616 returnUgn (RdrTySig vars poly_ty src_loc)
618 -- value specialisation user-pragma
619 wlk_sig_thing (U_vspec_uprag uvar vspec_tys srcline)
620 = mkSrcLocUgn srcline $ \ src_loc ->
621 wlkQid uvar `thenUgn` \ var ->
622 wlkList rd_ty_and_id vspec_tys `thenUgn` \ tys_and_ids ->
623 returnUgn (RdrSpecValSig [SpecSig var ty using_id src_loc
624 | (ty, using_id) <- tys_and_ids ])
626 rd_ty_and_id :: ParseTree -> UgnM (RdrNamePolyType, Maybe RdrName)
628 = rdU_binding pt `thenUgn` \ (U_vspec_ty_and_id vspec_ty vspec_id) ->
629 wlkPolyType vspec_ty `thenUgn` \ ty ->
630 wlkMaybe rdQid vspec_id `thenUgn` \ id_maybe ->
631 returnUgn(ty, id_maybe)
633 -- instance specialisation user-pragma
634 wlk_sig_thing (U_ispec_uprag iclas ispec_ty srcline)
635 = mkSrcLocUgn srcline $ \ src_loc ->
636 wlkQid iclas `thenUgn` \ clas ->
637 wlkMonoType ispec_ty `thenUgn` \ ty ->
638 returnUgn (RdrSpecInstSig (SpecInstSig clas ty src_loc))
640 -- data specialisation user-pragma
641 wlk_sig_thing (U_dspec_uprag itycon dspec_tys srcline)
642 = mkSrcLocUgn srcline $ \ src_loc ->
643 wlkQid itycon `thenUgn` \ tycon ->
644 wlkList rdMonoType dspec_tys `thenUgn` \ tys ->
645 returnUgn (RdrSpecDataSig (SpecDataSig tycon (MonoTyApp tycon tys) src_loc))
647 -- value inlining user-pragma
648 wlk_sig_thing (U_inline_uprag ivar srcline)
649 = mkSrcLocUgn srcline $ \ src_loc ->
650 wlkQid ivar `thenUgn` \ var ->
651 returnUgn (RdrInlineValSig (InlineSig var src_loc))
653 -- "deforest me" user-pragma
654 wlk_sig_thing (U_deforest_uprag ivar srcline)
655 = mkSrcLocUgn srcline $ \ src_loc ->
656 wlkQid ivar `thenUgn` \ var ->
657 returnUgn (RdrDeforestSig (DeforestSig var src_loc))
659 -- "magic" unfolding user-pragma
660 wlk_sig_thing (U_magicuf_uprag ivar str srcline)
661 = mkSrcLocUgn srcline $ \ src_loc ->
662 wlkQid ivar `thenUgn` \ var ->
663 returnUgn (RdrMagicUnfoldingSig (MagicUnfoldingSig var str src_loc))
666 %************************************************************************
668 \subsection[wlkTypes]{Reading in types in various forms (and data constructors)}
670 %************************************************************************
673 rdPolyType :: ParseTree -> UgnM RdrNamePolyType
674 rdMonoType :: ParseTree -> UgnM RdrNameMonoType
676 rdPolyType pt = rdU_ttype pt `thenUgn` \ ttype -> wlkPolyType ttype
677 rdMonoType pt = rdU_ttype pt `thenUgn` \ ttype -> wlkMonoType ttype
679 wlkPolyType :: U_ttype -> UgnM RdrNamePolyType
680 wlkMonoType :: U_ttype -> UgnM RdrNameMonoType
684 U_context tcontextl tcontextt -> -- context
685 wlkContext tcontextl `thenUgn` \ ctxt ->
686 wlkMonoType tcontextt `thenUgn` \ ty ->
687 returnUgn (HsPreForAllTy ctxt ty)
689 other -> -- something else
690 wlkMonoType other `thenUgn` \ ty ->
691 returnUgn (HsPreForAllTy [{-no context-}] ty)
695 U_namedtvar tv -> -- type variable
696 wlkQid tv `thenUgn` \ tyvar ->
697 returnUgn (MonoTyVar tyvar)
699 U_tname tcon -> -- type constructor
700 wlkQid tcon `thenUgn` \ tycon ->
701 returnUgn (MonoTyApp tycon [])
704 wlkMonoType t2 `thenUgn` \ ty2 ->
705 collect t1 [ty2] `thenUgn` \ (tycon, tys) ->
706 returnUgn (MonoTyApp tycon tys)
710 U_tapp t1 t2 -> wlkMonoType t2 `thenUgn` \ ty2 ->
712 U_tname tcon -> wlkQid tcon `thenUgn` \ tycon ->
713 returnUgn (tycon, acc)
714 U_namedtvar tv -> wlkQid tv `thenUgn` \ tyvar ->
715 returnUgn (tyvar, acc)
716 U_tllist _ -> panic "tlist"
717 U_ttuple _ -> panic "ttuple"
718 U_tfun _ _ -> panic "tfun"
719 U_tbang _ -> panic "tbang"
720 U_context _ _ -> panic "context"
721 _ -> panic "something else"
723 U_tllist tlist -> -- list type
724 wlkMonoType tlist `thenUgn` \ ty ->
725 returnUgn (MonoListTy ty)
728 wlkList rdMonoType ttuple `thenUgn` \ tys ->
729 returnUgn (MonoTupleTy tys)
732 wlkMonoType tfun `thenUgn` \ ty1 ->
733 wlkMonoType targ `thenUgn` \ ty2 ->
734 returnUgn (MonoFunTy ty1 ty2)
739 wlkTyConAndTyVars :: U_ttype -> UgnM (RdrName, [RdrName])
740 wlkContext :: U_list -> UgnM RdrNameContext
741 wlkClassAssertTy :: U_ttype -> UgnM (RdrName, RdrName)
743 wlkTyConAndTyVars ttype
744 = wlkMonoType ttype `thenUgn` \ (MonoTyApp tycon ty_args) ->
746 args = [ a | (MonoTyVar a) <- ty_args ]
748 returnUgn (tycon, args)
751 = wlkList rdMonoType list `thenUgn` \ tys ->
752 returnUgn (map mk_class_assertion tys)
755 = wlkMonoType xs `thenUgn` \ mono_ty ->
756 returnUgn (mk_class_assertion mono_ty)
758 mk_class_assertion :: RdrNameMonoType -> (RdrName, RdrName)
760 mk_class_assertion (MonoTyApp name [(MonoTyVar tyname)]) = (name, tyname)
761 mk_class_assertion other
762 = pprError "ERROR: malformed type context: " (ppr PprForUser other)
763 -- regrettably, the parser does let some junk past
764 -- e.g., f :: Num {-nothing-} => a -> ...
768 rdConDecl :: ParseTree -> UgnM RdrNameConDecl
770 = rdU_constr pt `thenUgn` \ blah ->
773 wlkConDecl :: U_constr -> UgnM RdrNameConDecl
775 wlkConDecl (U_constrpre ccon ctys srcline)
776 = mkSrcLocUgn srcline $ \ src_loc ->
777 wlkQid ccon `thenUgn` \ con ->
778 wlkList rdBangType ctys `thenUgn` \ tys ->
779 returnUgn (ConDecl con tys src_loc)
781 wlkConDecl (U_constrinf cty1 cop cty2 srcline)
782 = mkSrcLocUgn srcline $ \ src_loc ->
783 wlkBangType cty1 `thenUgn` \ ty1 ->
784 wlkQid cop `thenUgn` \ op ->
785 wlkBangType cty2 `thenUgn` \ ty2 ->
786 returnUgn (ConOpDecl ty1 op ty2 src_loc)
788 wlkConDecl (U_constrnew ccon cty srcline)
789 = mkSrcLocUgn srcline $ \ src_loc ->
790 wlkQid ccon `thenUgn` \ con ->
791 wlkMonoType cty `thenUgn` \ ty ->
792 returnUgn (NewConDecl con ty src_loc)
794 wlkConDecl (U_constrrec ccon cfields srcline)
795 = mkSrcLocUgn srcline $ \ src_loc ->
796 wlkQid ccon `thenUgn` \ con ->
797 wlkList rd_field cfields `thenUgn` \ fields_lists ->
798 returnUgn (RecConDecl con fields_lists src_loc)
800 rd_field :: ParseTree -> UgnM ([RdrName], BangType RdrName)
802 = rdU_constr pt `thenUgn` \ (U_field fvars fty) ->
803 wlkList rdQid fvars `thenUgn` \ vars ->
804 wlkBangType fty `thenUgn` \ ty ->
808 rdBangType pt = rdU_ttype pt `thenUgn` \ ty -> wlkBangType ty
810 wlkBangType :: U_ttype -> UgnM (BangType RdrName)
812 wlkBangType (U_tbang bty) = wlkMonoType bty `thenUgn` \ ty ->
813 returnUgn (Banged (HsPreForAllTy [] ty))
814 wlkBangType uty = wlkMonoType uty `thenUgn` \ ty ->
815 returnUgn (Unbanged (HsPreForAllTy [] ty))
818 %************************************************************************
820 \subsection{Read a ``match''}
822 %************************************************************************
825 rdMatch :: ParseTree -> UgnM RdrMatch
828 = rdU_pbinding pt `thenUgn` \ (U_pgrhs gpat gdexprs gbind gsrcfun srcline) ->
829 mkSrcLocUgn srcline $ \ src_loc ->
830 wlkPat gpat `thenUgn` \ pat ->
831 wlkBinding gbind `thenUgn` \ binding ->
832 wlkQid gsrcfun `thenUgn` \ srcfun ->
834 wlk_guards (U_pnoguards exp)
835 = wlkExpr exp `thenUgn` \ expr ->
836 returnUgn (RdrMatch_NoGuard srcline srcfun pat expr binding)
838 wlk_guards (U_pguards gs)
839 = wlkList rd_gd_expr gs `thenUgn` \ gd_exps ->
840 returnUgn (RdrMatch_Guards srcline srcfun pat gd_exps binding)
845 = rdU_pbinding pt `thenUgn` \ (U_pgdexp g e) ->
846 wlkExpr g `thenUgn` \ guard ->
847 wlkExpr e `thenUgn` \ expr ->
848 returnUgn (guard, expr)
851 %************************************************************************
853 \subsection[rdFixOp]{Read in a fixity declaration}
855 %************************************************************************
858 rdFixOp :: ParseTree -> UgnM RdrNameFixityDecl
860 = rdU_tree pt `thenUgn` \ fix ->
862 U_fixop op (-1) prec -> wlkQid op `thenUgn` \ op ->
863 returnUgn (InfixL op prec)
864 U_fixop op 0 prec -> wlkQid op `thenUgn` \ op ->
865 returnUgn (InfixN op prec)
866 U_fixop op 1 prec -> wlkQid op `thenUgn` \ op ->
867 returnUgn (InfixR op prec)
868 _ -> error "ReadPrefix:rdFixOp"
871 %************************************************************************
873 \subsection[rdImport]{Read an import decl}
875 %************************************************************************
878 rdImport :: ParseTree
879 -> UgnM RdrNameImportDecl
882 = rdU_binding pt `thenUgn` \ (U_import imod iqual ias ispec srcline) ->
883 mkSrcLocUgn srcline $ \ src_loc ->
884 wlkMaybe rdU_stringId ias `thenUgn` \ maybe_as ->
885 wlkMaybe rd_spec ispec `thenUgn` \ maybe_spec ->
886 returnUgn (ImportDecl imod (cvFlag iqual) maybe_as maybe_spec src_loc)
888 rd_spec pt = rdU_either pt `thenUgn` \ spec ->
890 U_left pt -> rdEntities pt `thenUgn` \ ents ->
891 returnUgn (False, ents)
892 U_right pt -> rdEntities pt `thenUgn` \ ents ->
893 returnUgn (True, ents)
898 = rdU_list pt `thenUgn` \ list ->
899 wlkList rdEntity list
901 rdEntity :: ParseTree -> UgnM (IE RdrName)
904 = rdU_entidt pt `thenUgn` \ entity ->
906 U_entid evar -> -- just a value
907 wlkQid evar `thenUgn` \ var ->
908 returnUgn (IEVar var)
910 U_enttype x -> -- abstract type constructor/class
911 wlkQid x `thenUgn` \ thing ->
912 returnUgn (IEThingAbs thing)
914 U_enttypeall x -> -- non-abstract type constructor/class
915 wlkQid x `thenUgn` \ thing ->
916 returnUgn (IEThingAll thing)
918 U_enttypenamed x ns -> -- non-abstract type constructor/class
919 -- with specified constrs/methods
920 wlkQid x `thenUgn` \ thing ->
921 wlkList rdQid ns `thenUgn` \ names ->
922 returnUgn (IEThingWith thing names)
924 U_entmod mod -> -- everything provided unqualified by a module
925 returnUgn (IEModuleContents mod)