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))
14 import UgenAll -- all Yacc parser gumpff...
15 import PrefixSyn -- and various syntaxen.
17 import HsPragmas ( noDataPragmas, noClassPragmas, noInstancePragmas )
21 import ErrUtils ( addErrLoc, ghcExit )
22 import FiniteMap ( elemFM, FiniteMap )
23 import Name ( RdrName(..), isRdrLexConOrSpecial, preludeQual )
24 import PprStyle ( PprStyle(..) )
25 import PrelMods ( pRELUDE )
27 import SrcLoc ( SrcLoc )
28 import Util ( nOfThem, pprError, panic )
31 %************************************************************************
33 \subsection[ReadPrefix-help]{Help Functions}
35 %************************************************************************
38 wlkList :: (U_VOID_STAR -> UgnM a) -> U_list -> UgnM [a]
40 wlkList wlk_it U_lnil = returnUgn []
42 wlkList wlk_it (U_lcons hd tl)
43 = wlk_it hd `thenUgn` \ hd_it ->
44 wlkList wlk_it tl `thenUgn` \ tl_it ->
45 returnUgn (hd_it : tl_it)
49 wlkMaybe :: (U_VOID_STAR -> UgnM a) -> U_maybe -> UgnM (Maybe a)
51 wlkMaybe wlk_it U_nothing = returnUgn Nothing
52 wlkMaybe wlk_it (U_just x)
53 = wlk_it x `thenUgn` \ it ->
58 rdQid :: ParseTree -> UgnM RdrName
59 rdQid pt = rdU_qid pt `thenUgn` \ qid -> wlkQid qid
61 wlkQid :: U_qid -> UgnM RdrName
62 wlkQid (U_noqual name)
63 = returnUgn (Unqual name)
64 wlkQid (U_aqual mod name)
65 = returnUgn (Qual mod name)
67 = returnUgn (preludeQual name)
69 cvFlag :: U_long -> Bool
74 %************************************************************************
76 \subsection[rdModule]{@rdModule@: reads in a Haskell module}
78 %************************************************************************
81 #if __GLASGOW_HASKELL__ >= 200
82 # define PACK_STR packCString
83 # define CCALL_THEN `GHCbase.ccallThen`
85 # define PACK_STR _packCString
86 # define CCALL_THEN `thenPrimIO`
89 rdModule :: IO (Module, -- this module's name
90 RdrNameHsModule) -- the main goods
93 = _ccall_ hspmain CCALL_THEN \ pt -> -- call the Yacc parser!
95 srcfile = PACK_STR ``input_filename'' -- What A Great Hack! (TM)
98 rdU_tree pt `thenUgn` \ (U_hmodule modname himplist hexplist hfixlist
99 hmodlist srciface_version srcline) ->
101 setSrcFileUgn srcfile $
102 setSrcModUgn modname $
103 mkSrcLocUgn srcline $ \ src_loc ->
105 wlkMaybe rdEntities hexplist `thenUgn` \ exports ->
106 wlkList rdImport himplist `thenUgn` \ imports ->
107 wlkList rdFixOp hfixlist `thenUgn` \ fixities ->
108 wlkBinding hmodlist `thenUgn` \ binding ->
110 case sepDeclsForTopBinds binding of
111 (tydecls, tysigs, classdecls, instdecls, instsigs, defaultdecls, binds) ->
115 (case srciface_version of { 0 -> Nothing; n -> Just n })
125 (cvSepdBinds srcfile cvValSig binds)
126 [{-no interface sigs yet-}]
131 %************************************************************************
133 \subsection[wlkExprOrPat]{@wlkExpr@ and @wlkPat@}
135 %************************************************************************
138 rdExpr :: ParseTree -> UgnM RdrNameHsExpr
139 rdPat :: ParseTree -> UgnM RdrNamePat
141 rdExpr pt = rdU_tree pt `thenUgn` \ tree -> wlkExpr tree
142 rdPat pt = rdU_tree pt `thenUgn` \ tree -> wlkPat tree
144 wlkExpr :: U_tree -> UgnM RdrNameHsExpr
145 wlkPat :: U_tree -> UgnM RdrNamePat
149 U_par pexpr -> -- parenthesised expr
150 wlkExpr pexpr `thenUgn` \ expr ->
151 returnUgn (HsPar expr)
153 U_lsection lsexp lop -> -- left section
154 wlkExpr lsexp `thenUgn` \ expr ->
155 wlkQid lop `thenUgn` \ op ->
156 returnUgn (SectionL expr (HsVar op))
158 U_rsection rop rsexp -> -- right section
159 wlkQid rop `thenUgn` \ op ->
160 wlkExpr rsexp `thenUgn` \ expr ->
161 returnUgn (SectionR (HsVar op) expr)
163 U_ccall fun flavor ccargs -> -- ccall/casm
164 wlkList rdExpr ccargs `thenUgn` \ args ->
168 returnUgn (CCall fun args
169 (tag == 'p' || tag == 'P') -- may invoke GC
170 (tag == 'N' || tag == 'P') -- really a "casm"
171 (panic "CCall:result_ty"))
173 U_scc label sccexp -> -- scc (set-cost-centre) expression
174 wlkExpr sccexp `thenUgn` \ expr ->
175 returnUgn (HsSCC label expr)
177 U_lambda lampats lamexpr srcline -> -- lambda expression
178 mkSrcLocUgn srcline $ \ src_loc ->
179 wlkList rdPat lampats `thenUgn` \ pats ->
180 wlkExpr lamexpr `thenUgn` \ body ->
182 HsLam (foldr PatMatch
183 (GRHSMatch (GRHSsAndBindsIn
184 [OtherwiseGRHS body src_loc]
189 U_casee caseexpr casebody srcline -> -- case expression
190 mkSrcLocUgn srcline $ \ src_loc ->
191 wlkExpr caseexpr `thenUgn` \ expr ->
192 wlkList rdMatch casebody `thenUgn` \ mats ->
193 getSrcFileUgn `thenUgn` \ sf ->
195 matches = cvMatches sf True mats
197 returnUgn (HsCase expr matches src_loc)
199 U_ife ifpred ifthen ifelse srcline -> -- if expression
200 mkSrcLocUgn srcline $ \ src_loc ->
201 wlkExpr ifpred `thenUgn` \ e1 ->
202 wlkExpr ifthen `thenUgn` \ e2 ->
203 wlkExpr ifelse `thenUgn` \ e3 ->
204 returnUgn (HsIf e1 e2 e3 src_loc)
206 U_let letvdefs letvexpr -> -- let expression
207 wlkBinding letvdefs `thenUgn` \ binding ->
208 wlkExpr letvexpr `thenUgn` \ expr ->
209 getSrcFileUgn `thenUgn` \ sf ->
211 binds = cvBinds sf cvValSig binding
213 returnUgn (HsLet binds expr)
215 U_doe gdo srcline -> -- do expression
216 mkSrcLocUgn srcline $ \ src_loc ->
217 wlkList rd_stmt gdo `thenUgn` \ stmts ->
218 returnUgn (HsDo stmts src_loc)
221 = rdU_tree pt `thenUgn` \ bind ->
223 U_doexp exp srcline ->
224 mkSrcLocUgn srcline $ \ src_loc ->
225 wlkExpr exp `thenUgn` \ expr ->
226 returnUgn (ExprStmt expr src_loc)
228 U_dobind pat exp srcline ->
229 mkSrcLocUgn srcline $ \ src_loc ->
230 wlkPat pat `thenUgn` \ patt ->
231 wlkExpr exp `thenUgn` \ expr ->
232 returnUgn (BindStmt patt expr src_loc)
235 wlkBinding seqlet `thenUgn` \ bs ->
236 getSrcFileUgn `thenUgn` \ sf ->
238 binds = cvBinds sf cvValSig bs
240 returnUgn (LetStmt binds)
242 U_comprh cexp cquals -> -- list comprehension
243 wlkExpr cexp `thenUgn` \ expr ->
244 wlkList rd_qual cquals `thenUgn` \ quals ->
245 returnUgn (ListComp expr quals)
248 = rdU_tree pt `thenUgn` \ qual ->
254 wlkExpr exp `thenUgn` \ expr ->
255 returnUgn (FilterQual expr)
258 wlkPat qpat `thenUgn` \ pat ->
259 wlkExpr qexp `thenUgn` \ expr ->
260 returnUgn (GeneratorQual pat expr)
263 wlkBinding seqlet `thenUgn` \ bs ->
264 getSrcFileUgn `thenUgn` \ sf ->
266 binds = cvBinds sf cvValSig bs
268 returnUgn (LetQual binds)
270 U_eenum efrom estep eto -> -- arithmetic sequence
271 wlkExpr efrom `thenUgn` \ e1 ->
272 wlkMaybe rdExpr estep `thenUgn` \ es2 ->
273 wlkMaybe rdExpr eto `thenUgn` \ es3 ->
274 returnUgn (cv_arith_seq e1 es2 es3)
276 cv_arith_seq e1 Nothing Nothing = ArithSeqIn (From e1)
277 cv_arith_seq e1 Nothing (Just e3) = ArithSeqIn (FromTo e1 e3)
278 cv_arith_seq e1 (Just e2) Nothing = ArithSeqIn (FromThen e1 e2)
279 cv_arith_seq e1 (Just e2) (Just e3) = ArithSeqIn (FromThenTo e1 e2 e3)
281 U_restr restre restrt -> -- expression with type signature
282 wlkExpr restre `thenUgn` \ expr ->
283 wlkPolyType restrt `thenUgn` \ ty ->
284 returnUgn (ExprWithTySig expr ty)
286 --------------------------------------------------------------
287 -- now the prefix items that can either be an expression or
288 -- pattern, except we know they are *expressions* here
289 -- (this code could be commoned up with the pattern version;
290 -- but it probably isn't worth it)
291 --------------------------------------------------------------
293 wlkLiteral lit `thenUgn` \ lit ->
294 returnUgn (HsLit lit)
296 U_ident n -> -- simple identifier
297 wlkQid n `thenUgn` \ var ->
298 returnUgn (HsVar var)
300 U_ap fun arg -> -- application
301 wlkExpr fun `thenUgn` \ expr1 ->
302 wlkExpr arg `thenUgn` \ expr2 ->
303 returnUgn (HsApp expr1 expr2)
305 U_infixap fun arg1 arg2 -> -- infix application
306 wlkQid fun `thenUgn` \ op ->
307 wlkExpr arg1 `thenUgn` \ expr1 ->
308 wlkExpr arg2 `thenUgn` \ expr2 ->
309 returnUgn (OpApp expr1 (HsVar op) expr2)
311 U_negate nexp -> -- prefix negation
312 wlkExpr nexp `thenUgn` \ expr ->
315 rdr = preludeQual SLIT("negate")
317 returnUgn (NegApp expr (HsVar rdr))
319 U_llist llist -> -- explicit list
320 wlkList rdExpr llist `thenUgn` \ exprs ->
321 returnUgn (ExplicitList exprs)
323 U_tuple tuplelist -> -- explicit tuple
324 wlkList rdExpr tuplelist `thenUgn` \ exprs ->
325 returnUgn (ExplicitTuple exprs)
327 U_record con rbinds -> -- record construction
328 wlkQid con `thenUgn` \ rcon ->
329 wlkList rdRbind rbinds `thenUgn` \ recbinds ->
330 returnUgn (RecordCon (HsVar rcon) recbinds)
332 U_rupdate updexp updbinds -> -- record update
333 wlkExpr updexp `thenUgn` \ aexp ->
334 wlkList rdRbind updbinds `thenUgn` \ recbinds ->
335 returnUgn (RecordUpd aexp recbinds)
338 U_hmodule _ _ _ _ _ _ _ -> error "U_hmodule"
339 U_as _ _ -> error "U_as"
340 U_lazyp _ -> error "U_lazyp"
341 U_wildp -> error "U_wildp"
342 U_qual _ _ -> error "U_qual"
343 U_guard _ -> error "U_guard"
344 U_seqlet _ -> error "U_seqlet"
345 U_dobind _ _ _ -> error "U_dobind"
346 U_doexp _ _ -> error "U_doexp"
347 U_rbind _ _ -> error "U_rbind"
348 U_fixop _ _ _ -> error "U_fixop"
352 = rdU_tree pt `thenUgn` \ (U_rbind var exp) ->
353 wlkQid var `thenUgn` \ rvar ->
354 wlkMaybe rdExpr exp `thenUgn` \ expr_maybe ->
357 Nothing -> (rvar, HsVar rvar, True{-pun-})
358 Just re -> (rvar, re, False)
362 Patterns: just bear in mind that lists of patterns are represented as
363 a series of ``applications''.
367 U_par ppat -> -- parenthesised pattern
368 wlkPat ppat `thenUgn` \ pat ->
369 -- tidy things up a little:
374 other -> ParPatIn pat
377 U_as avar as_pat -> -- "as" pattern
378 wlkQid avar `thenUgn` \ var ->
379 wlkPat as_pat `thenUgn` \ pat ->
380 returnUgn (AsPatIn var pat)
382 U_lazyp lazyp -> -- irrefutable ("twiddle") pattern
383 wlkPat lazyp `thenUgn` \ pat ->
384 returnUgn (LazyPatIn pat)
386 U_wildp -> returnUgn WildPatIn -- wildcard pattern
388 U_lit lit -> -- literal pattern
389 wlkLiteral lit `thenUgn` \ lit ->
390 returnUgn (LitPatIn lit)
392 U_ident nn -> -- simple identifier
393 wlkQid nn `thenUgn` \ n ->
395 if isRdrLexConOrSpecial n
400 U_ap l r -> -- "application": there's a list of patterns lurking here!
401 wlkPat r `thenUgn` \ rpat ->
402 collect_pats l [rpat] `thenUgn` \ (lpat,lpats) ->
404 VarPatIn x -> returnUgn (x, lpats)
405 ConPatIn x [] -> returnUgn (x, lpats)
406 ConOpPatIn x op y -> returnUgn (op, x:y:lpats)
407 _ -> getSrcLocUgn `thenUgn` \ loc ->
409 err = addErrLoc loc "Illegal pattern `application'"
410 (\sty -> ppInterleave ppSP (map (ppr sty) (lpat:lpats)))
411 msg = ppShow 100 (err PprForUser)
413 ioToUgnM (hPutStr stderr msg) `thenUgn` \ _ ->
414 ioToUgnM (ghcExit 1) `thenUgn` \ _ ->
415 returnUgn (error "ReadPrefix")
417 ) `thenUgn` \ (n, arg_pats) ->
418 returnUgn (ConPatIn n arg_pats)
423 wlkPat r `thenUgn` \ rpat ->
424 collect_pats l (rpat:acc)
426 wlkPat other `thenUgn` \ pat ->
429 U_infixap fun arg1 arg2 -> -- infix pattern
430 wlkQid fun `thenUgn` \ op ->
431 wlkPat arg1 `thenUgn` \ pat1 ->
432 wlkPat arg2 `thenUgn` \ pat2 ->
433 returnUgn (ConOpPatIn pat1 op pat2)
435 U_negate npat -> -- negated pattern
436 wlkPat npat `thenUgn` \ pat ->
437 returnUgn (NegPatIn pat)
439 U_llist llist -> -- explicit list
440 wlkList rdPat llist `thenUgn` \ pats ->
441 returnUgn (ListPatIn pats)
443 U_tuple tuplelist -> -- explicit tuple
444 wlkList rdPat tuplelist `thenUgn` \ pats ->
445 returnUgn (TuplePatIn pats)
447 U_record con rpats -> -- record destruction
448 wlkQid con `thenUgn` \ rcon ->
449 wlkList rdRpat rpats `thenUgn` \ recpats ->
450 returnUgn (RecPatIn rcon recpats)
453 = rdU_tree pt `thenUgn` \ (U_rbind var pat) ->
454 wlkQid var `thenUgn` \ rvar ->
455 wlkMaybe rdPat pat `thenUgn` \ pat_maybe ->
458 Nothing -> (rvar, VarPatIn rvar, True{-pun-})
459 Just rp -> (rvar, rp, False)
464 wlkLiteral :: U_literal -> UgnM HsLit
469 U_integer s -> HsInt (as_integer s)
470 U_floatr s -> HsFrac (as_rational s)
471 U_intprim s -> HsIntPrim (as_integer s)
472 U_doubleprim s -> HsDoublePrim (as_rational s)
473 U_floatprim s -> HsFloatPrim (as_rational s)
474 U_charr s -> HsChar (as_char s)
475 U_charprim s -> HsCharPrim (as_char s)
476 U_string s -> HsString (as_string s)
477 U_stringprim s -> HsStringPrim (as_string s)
478 U_clitlit s -> HsLitLit (as_string s)
482 as_integer s = readInteger (_UNPK_ s)
483 #if __GLASGOW_HASKELL__ >= 200
484 as_rational s = GHCbase.readRational__ (_UNPK_ s) -- non-std
486 as_rational s = _readRational (_UNPK_ s) -- non-std
491 %************************************************************************
493 \subsection{wlkBinding}
495 %************************************************************************
498 wlkBinding :: U_binding -> UgnM RdrBinding
504 returnUgn RdrNullBind
506 -- "and" binding (just glue, really)
508 wlkBinding a `thenUgn` \ binding1 ->
509 wlkBinding b `thenUgn` \ binding2 ->
510 returnUgn (RdrAndBindings binding1 binding2)
512 -- "data" declaration
513 U_tbind tctxt ttype tcons tderivs srcline ->
514 mkSrcLocUgn srcline $ \ src_loc ->
515 wlkContext tctxt `thenUgn` \ ctxt ->
516 wlkTyConAndTyVars ttype `thenUgn` \ (tycon, tyvars) ->
517 wlkList rdConDecl tcons `thenUgn` \ cons ->
518 wlkDerivings tderivs `thenUgn` \ derivings ->
519 returnUgn (RdrTyDecl (TyData ctxt tycon tyvars cons derivings noDataPragmas src_loc))
521 -- "newtype" declaration
522 U_ntbind ntctxt nttype ntcon ntderivs srcline ->
523 mkSrcLocUgn srcline $ \ src_loc ->
524 wlkContext ntctxt `thenUgn` \ ctxt ->
525 wlkTyConAndTyVars nttype `thenUgn` \ (tycon, tyvars) ->
526 wlkList rdConDecl ntcon `thenUgn` \ con ->
527 wlkDerivings ntderivs `thenUgn` \ derivings ->
528 returnUgn (RdrTyDecl (TyNew ctxt tycon tyvars con derivings noDataPragmas src_loc))
530 -- "type" declaration
531 U_nbind nbindid nbindas srcline ->
532 mkSrcLocUgn srcline $ \ src_loc ->
533 wlkTyConAndTyVars nbindid `thenUgn` \ (tycon, tyvars) ->
534 wlkMonoType nbindas `thenUgn` \ expansion ->
535 returnUgn (RdrTyDecl (TySynonym tycon tyvars expansion src_loc))
538 U_fbind fbindl srcline ->
539 mkSrcLocUgn srcline $ \ src_loc ->
540 wlkList rdMatch fbindl `thenUgn` \ matches ->
541 returnUgn (RdrFunctionBinding srcline matches)
544 U_pbind pbindl srcline ->
545 mkSrcLocUgn srcline $ \ src_loc ->
546 wlkList rdMatch pbindl `thenUgn` \ matches ->
547 returnUgn (RdrPatternBinding srcline matches)
549 -- "class" declaration
550 U_cbind cbindc cbindid cbindw srcline ->
551 mkSrcLocUgn srcline $ \ src_loc ->
552 wlkContext cbindc `thenUgn` \ ctxt ->
553 wlkClassAssertTy cbindid `thenUgn` \ (clas, tyvar)->
554 wlkBinding cbindw `thenUgn` \ binding ->
555 getSrcFileUgn `thenUgn` \ sf ->
557 (class_sigs, class_methods) = sepDeclsIntoSigsAndBinds binding
559 final_sigs = concat (map cvClassOpSig class_sigs)
560 final_methods = cvMonoBinds sf class_methods
562 returnUgn (RdrClassDecl
563 (ClassDecl ctxt clas tyvar final_sigs final_methods noClassPragmas src_loc))
565 -- "instance" declaration
566 U_ibind ibindc iclas ibindi ibindw srcline ->
567 mkSrcLocUgn srcline $ \ src_loc ->
568 wlkContext ibindc `thenUgn` \ ctxt ->
569 wlkQid iclas `thenUgn` \ clas ->
570 wlkMonoType ibindi `thenUgn` \ inst_ty ->
571 wlkBinding ibindw `thenUgn` \ binding ->
572 getSrcModUgn `thenUgn` \ modname ->
573 getSrcFileUgn `thenUgn` \ sf ->
575 (ss, bs) = sepDeclsIntoSigsAndBinds binding
576 binds = cvMonoBinds sf bs
577 uprags = concat (map cvInstDeclSig ss)
578 ctxt_inst_ty = HsPreForAllTy ctxt inst_ty
580 returnUgn (RdrInstDecl
581 (InstDecl clas ctxt_inst_ty binds True{-from here-} modname uprags noInstancePragmas src_loc))
583 -- "default" declaration
584 U_dbind dbindts srcline ->
585 mkSrcLocUgn srcline $ \ src_loc ->
586 wlkList rdMonoType dbindts `thenUgn` \ tys ->
587 returnUgn (RdrDefaultDecl (DefaultDecl tys src_loc))
590 -- signature(-like) things, including user pragmas
591 wlk_sig_thing a_sig_we_hope
595 wlkDerivings :: U_maybe -> UgnM (Maybe [RdrName])
597 wlkDerivings (U_nothing) = returnUgn Nothing
598 wlkDerivings (U_just pt)
599 = rdU_list pt `thenUgn` \ ds ->
600 wlkList rdQid ds `thenUgn` \ derivs ->
601 returnUgn (Just derivs)
606 wlk_sig_thing (U_sbind sbindids sbindid srcline)
607 = mkSrcLocUgn srcline $ \ src_loc ->
608 wlkList rdQid sbindids `thenUgn` \ vars ->
609 wlkPolyType sbindid `thenUgn` \ poly_ty ->
610 returnUgn (RdrTySig vars poly_ty src_loc)
612 -- value specialisation user-pragma
613 wlk_sig_thing (U_vspec_uprag uvar vspec_tys srcline)
614 = mkSrcLocUgn srcline $ \ src_loc ->
615 wlkQid uvar `thenUgn` \ var ->
616 wlkList rd_ty_and_id vspec_tys `thenUgn` \ tys_and_ids ->
617 returnUgn (RdrSpecValSig [SpecSig var ty using_id src_loc
618 | (ty, using_id) <- tys_and_ids ])
620 rd_ty_and_id :: ParseTree -> UgnM (RdrNamePolyType, Maybe RdrName)
622 = rdU_binding pt `thenUgn` \ (U_vspec_ty_and_id vspec_ty vspec_id) ->
623 wlkPolyType vspec_ty `thenUgn` \ ty ->
624 wlkMaybe rdQid vspec_id `thenUgn` \ id_maybe ->
625 returnUgn(ty, id_maybe)
627 -- instance specialisation user-pragma
628 wlk_sig_thing (U_ispec_uprag iclas ispec_ty srcline)
629 = mkSrcLocUgn srcline $ \ src_loc ->
630 wlkQid iclas `thenUgn` \ clas ->
631 wlkMonoType ispec_ty `thenUgn` \ ty ->
632 returnUgn (RdrSpecInstSig (SpecInstSig clas ty src_loc))
634 -- data specialisation user-pragma
635 wlk_sig_thing (U_dspec_uprag itycon dspec_tys srcline)
636 = mkSrcLocUgn srcline $ \ src_loc ->
637 wlkQid itycon `thenUgn` \ tycon ->
638 wlkList rdMonoType dspec_tys `thenUgn` \ tys ->
639 returnUgn (RdrSpecDataSig (SpecDataSig tycon (MonoTyApp tycon tys) src_loc))
641 -- value inlining user-pragma
642 wlk_sig_thing (U_inline_uprag ivar srcline)
643 = mkSrcLocUgn srcline $ \ src_loc ->
644 wlkQid ivar `thenUgn` \ var ->
645 returnUgn (RdrInlineValSig (InlineSig var src_loc))
647 -- "deforest me" user-pragma
648 wlk_sig_thing (U_deforest_uprag ivar srcline)
649 = mkSrcLocUgn srcline $ \ src_loc ->
650 wlkQid ivar `thenUgn` \ var ->
651 returnUgn (RdrDeforestSig (DeforestSig var src_loc))
653 -- "magic" unfolding user-pragma
654 wlk_sig_thing (U_magicuf_uprag ivar str srcline)
655 = mkSrcLocUgn srcline $ \ src_loc ->
656 wlkQid ivar `thenUgn` \ var ->
657 returnUgn (RdrMagicUnfoldingSig (MagicUnfoldingSig var str src_loc))
660 %************************************************************************
662 \subsection[wlkTypes]{Reading in types in various forms (and data constructors)}
664 %************************************************************************
667 rdPolyType :: ParseTree -> UgnM RdrNamePolyType
668 rdMonoType :: ParseTree -> UgnM RdrNameMonoType
670 rdPolyType pt = rdU_ttype pt `thenUgn` \ ttype -> wlkPolyType ttype
671 rdMonoType pt = rdU_ttype pt `thenUgn` \ ttype -> wlkMonoType ttype
673 wlkPolyType :: U_ttype -> UgnM RdrNamePolyType
674 wlkMonoType :: U_ttype -> UgnM RdrNameMonoType
678 U_context tcontextl tcontextt -> -- context
679 wlkContext tcontextl `thenUgn` \ ctxt ->
680 wlkMonoType tcontextt `thenUgn` \ ty ->
681 returnUgn (HsPreForAllTy ctxt ty)
683 other -> -- something else
684 wlkMonoType other `thenUgn` \ ty ->
685 returnUgn (HsPreForAllTy [{-no context-}] ty)
689 U_namedtvar tv -> -- type variable
690 wlkQid tv `thenUgn` \ tyvar ->
691 returnUgn (MonoTyVar tyvar)
693 U_tname tcon -> -- type constructor
694 wlkQid tcon `thenUgn` \ tycon ->
695 returnUgn (MonoTyApp tycon [])
698 wlkMonoType t2 `thenUgn` \ ty2 ->
699 collect t1 [ty2] `thenUgn` \ (tycon, tys) ->
700 returnUgn (MonoTyApp tycon tys)
704 U_tapp t1 t2 -> wlkMonoType t2 `thenUgn` \ ty2 ->
706 U_tname tcon -> wlkQid tcon `thenUgn` \ tycon ->
707 returnUgn (tycon, acc)
708 U_namedtvar tv -> wlkQid tv `thenUgn` \ tyvar ->
709 returnUgn (tyvar, acc)
710 U_tllist _ -> panic "tlist"
711 U_ttuple _ -> panic "ttuple"
712 U_tfun _ _ -> panic "tfun"
713 U_tbang _ -> panic "tbang"
714 U_context _ _ -> panic "context"
715 _ -> panic "something else"
717 U_tllist tlist -> -- list type
718 wlkMonoType tlist `thenUgn` \ ty ->
719 returnUgn (MonoListTy ty)
722 wlkList rdMonoType ttuple `thenUgn` \ tys ->
723 returnUgn (MonoTupleTy tys)
726 wlkMonoType tfun `thenUgn` \ ty1 ->
727 wlkMonoType targ `thenUgn` \ ty2 ->
728 returnUgn (MonoFunTy ty1 ty2)
733 wlkTyConAndTyVars :: U_ttype -> UgnM (RdrName, [RdrName])
734 wlkContext :: U_list -> UgnM RdrNameContext
735 wlkClassAssertTy :: U_ttype -> UgnM (RdrName, RdrName)
737 wlkTyConAndTyVars ttype
738 = wlkMonoType ttype `thenUgn` \ (MonoTyApp tycon ty_args) ->
740 args = [ a | (MonoTyVar a) <- ty_args ]
742 returnUgn (tycon, args)
745 = wlkList rdMonoType list `thenUgn` \ tys ->
746 returnUgn (map mk_class_assertion tys)
749 = wlkMonoType xs `thenUgn` \ mono_ty ->
750 returnUgn (mk_class_assertion mono_ty)
752 mk_class_assertion :: RdrNameMonoType -> (RdrName, RdrName)
754 mk_class_assertion (MonoTyApp name [(MonoTyVar tyname)]) = (name, tyname)
755 mk_class_assertion other
756 = pprError "ERROR: malformed type context: " (ppr PprForUser other)
757 -- regrettably, the parser does let some junk past
758 -- e.g., f :: Num {-nothing-} => a -> ...
762 rdConDecl :: ParseTree -> UgnM RdrNameConDecl
764 = rdU_constr pt `thenUgn` \ blah ->
767 wlkConDecl :: U_constr -> UgnM RdrNameConDecl
769 wlkConDecl (U_constrpre ccon ctys srcline)
770 = mkSrcLocUgn srcline $ \ src_loc ->
771 wlkQid ccon `thenUgn` \ con ->
772 wlkList rdBangType ctys `thenUgn` \ tys ->
773 returnUgn (ConDecl con tys src_loc)
775 wlkConDecl (U_constrinf cty1 cop cty2 srcline)
776 = mkSrcLocUgn srcline $ \ src_loc ->
777 wlkBangType cty1 `thenUgn` \ ty1 ->
778 wlkQid cop `thenUgn` \ op ->
779 wlkBangType cty2 `thenUgn` \ ty2 ->
780 returnUgn (ConOpDecl ty1 op ty2 src_loc)
782 wlkConDecl (U_constrnew ccon cty srcline)
783 = mkSrcLocUgn srcline $ \ src_loc ->
784 wlkQid ccon `thenUgn` \ con ->
785 wlkMonoType cty `thenUgn` \ ty ->
786 returnUgn (NewConDecl con ty src_loc)
788 wlkConDecl (U_constrrec ccon cfields srcline)
789 = mkSrcLocUgn srcline $ \ src_loc ->
790 wlkQid ccon `thenUgn` \ con ->
791 wlkList rd_field cfields `thenUgn` \ fields_lists ->
792 returnUgn (RecConDecl con fields_lists src_loc)
794 rd_field :: ParseTree -> UgnM ([RdrName], BangType RdrName)
796 = rdU_constr pt `thenUgn` \ (U_field fvars fty) ->
797 wlkList rdQid fvars `thenUgn` \ vars ->
798 wlkBangType fty `thenUgn` \ ty ->
802 rdBangType pt = rdU_ttype pt `thenUgn` \ ty -> wlkBangType ty
804 wlkBangType :: U_ttype -> UgnM (BangType RdrName)
806 wlkBangType (U_tbang bty) = wlkMonoType bty `thenUgn` \ ty ->
807 returnUgn (Banged (HsPreForAllTy [] ty))
808 wlkBangType uty = wlkMonoType uty `thenUgn` \ ty ->
809 returnUgn (Unbanged (HsPreForAllTy [] ty))
812 %************************************************************************
814 \subsection{Read a ``match''}
816 %************************************************************************
819 rdMatch :: ParseTree -> UgnM RdrMatch
822 = rdU_pbinding pt `thenUgn` \ (U_pgrhs gpat gdexprs gbind gsrcfun srcline) ->
823 mkSrcLocUgn srcline $ \ src_loc ->
824 wlkPat gpat `thenUgn` \ pat ->
825 wlkBinding gbind `thenUgn` \ binding ->
826 wlkQid gsrcfun `thenUgn` \ srcfun ->
828 wlk_guards (U_pnoguards exp)
829 = wlkExpr exp `thenUgn` \ expr ->
830 returnUgn (RdrMatch_NoGuard srcline srcfun pat expr binding)
832 wlk_guards (U_pguards gs)
833 = wlkList rd_gd_expr gs `thenUgn` \ gd_exps ->
834 returnUgn (RdrMatch_Guards srcline srcfun pat gd_exps binding)
839 = rdU_pbinding pt `thenUgn` \ (U_pgdexp g e) ->
840 wlkExpr g `thenUgn` \ guard ->
841 wlkExpr e `thenUgn` \ expr ->
842 returnUgn (guard, expr)
845 %************************************************************************
847 \subsection[rdFixOp]{Read in a fixity declaration}
849 %************************************************************************
852 rdFixOp :: ParseTree -> UgnM RdrNameFixityDecl
854 = rdU_tree pt `thenUgn` \ fix ->
856 U_fixop op (-1) prec -> wlkQid op `thenUgn` \ op ->
857 returnUgn (InfixL op prec)
858 U_fixop op 0 prec -> wlkQid op `thenUgn` \ op ->
859 returnUgn (InfixN op prec)
860 U_fixop op 1 prec -> wlkQid op `thenUgn` \ op ->
861 returnUgn (InfixR op prec)
862 _ -> error "ReadPrefix:rdFixOp"
865 %************************************************************************
867 \subsection[rdImport]{Read an import decl}
869 %************************************************************************
872 rdImport :: ParseTree
873 -> UgnM RdrNameImportDecl
876 = rdU_binding pt `thenUgn` \ (U_import imod iqual ias ispec srcline) ->
877 mkSrcLocUgn srcline $ \ src_loc ->
878 wlkMaybe rdU_stringId ias `thenUgn` \ maybe_as ->
879 wlkMaybe rd_spec ispec `thenUgn` \ maybe_spec ->
880 returnUgn (ImportDecl imod (cvFlag iqual) maybe_as maybe_spec src_loc)
882 rd_spec pt = rdU_either pt `thenUgn` \ spec ->
884 U_left pt -> rdEntities pt `thenUgn` \ ents ->
885 returnUgn (False, ents)
886 U_right pt -> rdEntities pt `thenUgn` \ ents ->
887 returnUgn (True, ents)
892 = rdU_list pt `thenUgn` \ list ->
893 wlkList rdEntity list
895 rdEntity :: ParseTree -> UgnM (IE RdrName)
898 = rdU_entidt pt `thenUgn` \ entity ->
900 U_entid evar -> -- just a value
901 wlkQid evar `thenUgn` \ var ->
902 returnUgn (IEVar var)
904 U_enttype x -> -- abstract type constructor/class
905 wlkQid x `thenUgn` \ thing ->
906 returnUgn (IEThingAbs thing)
908 U_enttypeall x -> -- non-abstract type constructor/class
909 wlkQid x `thenUgn` \ thing ->
910 returnUgn (IEThingAll thing)
912 U_enttypenamed x ns -> -- non-abstract type constructor/class
913 -- with specified constrs/methods
914 wlkQid x `thenUgn` \ thing ->
915 wlkList rdQid ns `thenUgn` \ names ->
916 returnUgn (IEThingWith thing names)
918 U_entmod mod -> -- everything provided unqualified by a module
919 returnUgn (IEModuleContents mod)