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
13 import UgenAll -- all Yacc parser gumpff...
14 import PrefixSyn -- and various syntaxen.
16 import HsPragmas ( noDataPragmas, noClassPragmas, noInstancePragmas )
20 import CmdLineOpts ( opt_CompilingPrelude )
21 import ErrUtils ( addErrLoc, ghcExit )
22 import FiniteMap ( elemFM, FiniteMap )
23 import Name ( RdrName(..), isRdrLexConOrSpecial )
24 import PprStyle ( PprStyle(..) )
25 import PrelMods ( fromPrelude, 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)
66 = returnUgn (Unqual name)
68 = returnUgn (Qual mod name)
70 = returnUgn (Unqual name)
72 cvFlag :: U_long -> Bool
77 %************************************************************************
79 \subsection[rdModule]{@rdModule@: reads in a Haskell module}
81 %************************************************************************
84 rdModule :: IO (Module, -- this module's name
85 RdrNameHsModule) -- the main goods
88 = _ccall_ hspmain `thenPrimIO` \ pt -> -- call the Yacc parser!
90 srcfile = _packCString ``input_filename'' -- What A Great Hack! (TM)
93 rdU_tree pt `thenUgn` \ (U_hmodule modname himplist hexplist hfixlist
94 hmodlist srciface_version srcline) ->
96 setSrcFileUgn srcfile $
97 setSrcModUgn modname $
98 mkSrcLocUgn srcline $ \ src_loc ->
100 wlkMaybe rdEntities hexplist `thenUgn` \ exports ->
101 wlkList rdImport himplist `thenUgn` \ imports ->
102 wlkList rdFixOp hfixlist `thenUgn` \ fixities ->
103 wlkBinding hmodlist `thenUgn` \ binding ->
105 case sepDeclsForTopBinds binding of
106 (tydecls, tysigs, classdecls, instdecls, instsigs, defaultdecls, binds) ->
110 (case srciface_version of { 0 -> Nothing; n -> Just n })
120 (cvSepdBinds srcfile cvValSig binds)
121 [{-no interface sigs yet-}]
126 %************************************************************************
128 \subsection[wlkExprOrPat]{@wlkExpr@ and @wlkPat@}
130 %************************************************************************
133 rdExpr :: ParseTree -> UgnM RdrNameHsExpr
134 rdPat :: ParseTree -> UgnM RdrNamePat
136 rdExpr pt = rdU_tree pt `thenUgn` \ tree -> wlkExpr tree
137 rdPat pt = rdU_tree pt `thenUgn` \ tree -> wlkPat tree
139 wlkExpr :: U_tree -> UgnM RdrNameHsExpr
140 wlkPat :: U_tree -> UgnM RdrNamePat
144 U_par pexpr -> -- parenthesised expr
145 wlkExpr pexpr `thenUgn` \ expr ->
146 returnUgn (HsPar expr)
148 U_lsection lsexp lop -> -- left section
149 wlkExpr lsexp `thenUgn` \ expr ->
150 wlkQid lop `thenUgn` \ op ->
151 returnUgn (SectionL expr (HsVar op))
153 U_rsection rop rsexp -> -- right section
154 wlkQid rop `thenUgn` \ op ->
155 wlkExpr rsexp `thenUgn` \ expr ->
156 returnUgn (SectionR (HsVar op) expr)
158 U_ccall fun flavor ccargs -> -- ccall/casm
159 wlkList rdExpr ccargs `thenUgn` \ args ->
163 returnUgn (CCall fun args
164 (tag == 'p' || tag == 'P') -- may invoke GC
165 (tag == 'N' || tag == 'P') -- really a "casm"
166 (panic "CCall:result_ty"))
168 U_scc label sccexp -> -- scc (set-cost-centre) expression
169 wlkExpr sccexp `thenUgn` \ expr ->
170 returnUgn (HsSCC label expr)
172 U_lambda lampats lamexpr srcline -> -- lambda expression
173 mkSrcLocUgn srcline $ \ src_loc ->
174 wlkList rdPat lampats `thenUgn` \ pats ->
175 wlkExpr lamexpr `thenUgn` \ body ->
177 HsLam (foldr PatMatch
178 (GRHSMatch (GRHSsAndBindsIn
179 [OtherwiseGRHS body src_loc]
184 U_casee caseexpr casebody srcline -> -- case expression
185 mkSrcLocUgn srcline $ \ src_loc ->
186 wlkExpr caseexpr `thenUgn` \ expr ->
187 wlkList rdMatch casebody `thenUgn` \ mats ->
188 getSrcFileUgn `thenUgn` \ sf ->
190 matches = cvMatches sf True mats
192 returnUgn (HsCase expr matches src_loc)
194 U_ife ifpred ifthen ifelse srcline -> -- if expression
195 mkSrcLocUgn srcline $ \ src_loc ->
196 wlkExpr ifpred `thenUgn` \ e1 ->
197 wlkExpr ifthen `thenUgn` \ e2 ->
198 wlkExpr ifelse `thenUgn` \ e3 ->
199 returnUgn (HsIf e1 e2 e3 src_loc)
201 U_let letvdefs letvexpr -> -- let expression
202 wlkBinding letvdefs `thenUgn` \ binding ->
203 wlkExpr letvexpr `thenUgn` \ expr ->
204 getSrcFileUgn `thenUgn` \ sf ->
206 binds = cvBinds sf cvValSig binding
208 returnUgn (HsLet binds expr)
210 U_doe gdo srcline -> -- do expression
211 mkSrcLocUgn srcline $ \ src_loc ->
212 wlkList rd_stmt gdo `thenUgn` \ stmts ->
213 returnUgn (HsDo stmts src_loc)
216 = rdU_tree pt `thenUgn` \ bind ->
218 U_doexp exp srcline ->
219 mkSrcLocUgn srcline $ \ src_loc ->
220 wlkExpr exp `thenUgn` \ expr ->
221 returnUgn (ExprStmt expr src_loc)
223 U_dobind pat exp srcline ->
224 mkSrcLocUgn srcline $ \ src_loc ->
225 wlkPat pat `thenUgn` \ patt ->
226 wlkExpr exp `thenUgn` \ expr ->
227 returnUgn (BindStmt patt expr src_loc)
230 wlkBinding seqlet `thenUgn` \ bs ->
231 getSrcFileUgn `thenUgn` \ sf ->
233 binds = cvBinds sf cvValSig bs
235 returnUgn (LetStmt binds)
237 U_comprh cexp cquals -> -- list comprehension
238 wlkExpr cexp `thenUgn` \ expr ->
239 wlkList rd_qual cquals `thenUgn` \ quals ->
240 returnUgn (ListComp expr quals)
243 = rdU_tree pt `thenUgn` \ qual ->
249 wlkExpr exp `thenUgn` \ expr ->
250 returnUgn (FilterQual expr)
253 wlkPat qpat `thenUgn` \ pat ->
254 wlkExpr qexp `thenUgn` \ expr ->
255 returnUgn (GeneratorQual pat expr)
258 wlkBinding seqlet `thenUgn` \ bs ->
259 getSrcFileUgn `thenUgn` \ sf ->
261 binds = cvBinds sf cvValSig bs
263 returnUgn (LetQual binds)
265 U_eenum efrom estep eto -> -- arithmetic sequence
266 wlkExpr efrom `thenUgn` \ e1 ->
267 wlkMaybe rdExpr estep `thenUgn` \ es2 ->
268 wlkMaybe rdExpr eto `thenUgn` \ es3 ->
269 returnUgn (cv_arith_seq e1 es2 es3)
271 cv_arith_seq e1 Nothing Nothing = ArithSeqIn (From e1)
272 cv_arith_seq e1 Nothing (Just e3) = ArithSeqIn (FromTo e1 e3)
273 cv_arith_seq e1 (Just e2) Nothing = ArithSeqIn (FromThen e1 e2)
274 cv_arith_seq e1 (Just e2) (Just e3) = ArithSeqIn (FromThenTo e1 e2 e3)
276 U_restr restre restrt -> -- expression with type signature
277 wlkExpr restre `thenUgn` \ expr ->
278 wlkPolyType restrt `thenUgn` \ ty ->
279 returnUgn (ExprWithTySig expr ty)
281 --------------------------------------------------------------
282 -- now the prefix items that can either be an expression or
283 -- pattern, except we know they are *expressions* here
284 -- (this code could be commoned up with the pattern version;
285 -- but it probably isn't worth it)
286 --------------------------------------------------------------
288 wlkLiteral lit `thenUgn` \ lit ->
289 returnUgn (HsLit lit)
291 U_ident n -> -- simple identifier
292 wlkQid n `thenUgn` \ var ->
293 returnUgn (HsVar var)
295 U_ap fun arg -> -- application
296 wlkExpr fun `thenUgn` \ expr1 ->
297 wlkExpr arg `thenUgn` \ expr2 ->
298 returnUgn (HsApp expr1 expr2)
300 U_infixap fun arg1 arg2 -> -- infix application
301 wlkQid fun `thenUgn` \ op ->
302 wlkExpr arg1 `thenUgn` \ expr1 ->
303 wlkExpr arg2 `thenUgn` \ expr2 ->
304 returnUgn (OpApp expr1 (HsVar op) expr2)
306 U_negate nexp -> -- prefix negation
307 wlkExpr nexp `thenUgn` \ expr ->
311 rdr = if opt_CompilingPrelude
313 else Qual pRELUDE neg
315 returnUgn (NegApp expr (HsVar rdr))
317 U_llist llist -> -- explicit list
318 wlkList rdExpr llist `thenUgn` \ exprs ->
319 returnUgn (ExplicitList exprs)
321 U_tuple tuplelist -> -- explicit tuple
322 wlkList rdExpr tuplelist `thenUgn` \ exprs ->
323 returnUgn (ExplicitTuple exprs)
325 U_record con rbinds -> -- record construction
326 wlkQid con `thenUgn` \ rcon ->
327 wlkList rdRbind rbinds `thenUgn` \ recbinds ->
328 returnUgn (RecordCon (HsVar rcon) recbinds)
330 U_rupdate updexp updbinds -> -- record update
331 wlkExpr updexp `thenUgn` \ aexp ->
332 wlkList rdRbind updbinds `thenUgn` \ recbinds ->
333 returnUgn (RecordUpd aexp recbinds)
336 U_hmodule _ _ _ _ _ _ _ -> error "U_hmodule"
337 U_as _ _ -> error "U_as"
338 U_lazyp _ -> error "U_lazyp"
339 U_wildp -> error "U_wildp"
340 U_qual _ _ -> error "U_qual"
341 U_guard _ -> error "U_guard"
342 U_seqlet _ -> error "U_seqlet"
343 U_dobind _ _ _ -> error "U_dobind"
344 U_doexp _ _ -> error "U_doexp"
345 U_rbind _ _ -> error "U_rbind"
346 U_fixop _ _ _ -> error "U_fixop"
350 = rdU_tree pt `thenUgn` \ (U_rbind var exp) ->
351 wlkQid var `thenUgn` \ rvar ->
352 wlkMaybe rdExpr exp `thenUgn` \ expr_maybe ->
355 Nothing -> (rvar, HsVar rvar, True{-pun-})
356 Just re -> (rvar, re, False)
360 Patterns: just bear in mind that lists of patterns are represented as
361 a series of ``applications''.
365 U_par ppat -> -- parenthesised pattern
366 wlkPat ppat `thenUgn` \ pat ->
367 -- tidy things up a little:
372 other -> ParPatIn pat
375 U_as avar as_pat -> -- "as" pattern
376 wlkQid avar `thenUgn` \ var ->
377 wlkPat as_pat `thenUgn` \ pat ->
378 returnUgn (AsPatIn var pat)
380 U_lazyp lazyp -> -- irrefutable ("twiddle") pattern
381 wlkPat lazyp `thenUgn` \ pat ->
382 returnUgn (LazyPatIn pat)
384 U_wildp -> returnUgn WildPatIn -- wildcard pattern
386 U_lit lit -> -- literal pattern
387 wlkLiteral lit `thenUgn` \ lit ->
388 returnUgn (LitPatIn lit)
390 U_ident nn -> -- simple identifier
391 wlkQid nn `thenUgn` \ n ->
393 if isRdrLexConOrSpecial n
398 U_ap l r -> -- "application": there's a list of patterns lurking here!
399 wlkPat r `thenUgn` \ rpat ->
400 collect_pats l [rpat] `thenUgn` \ (lpat,lpats) ->
402 VarPatIn x -> returnUgn (x, lpats)
403 ConPatIn x [] -> returnUgn (x, lpats)
404 ConOpPatIn x op y -> returnUgn (op, x:y:lpats)
405 _ -> getSrcLocUgn `thenUgn` \ loc ->
407 err = addErrLoc loc "Illegal pattern `application'"
408 (\sty -> ppInterleave ppSP (map (ppr sty) (lpat:lpats)))
409 msg = ppShow 100 (err PprForUser)
411 ioToUgnM (hPutStr stderr msg) `thenUgn` \ _ ->
412 ioToUgnM (ghcExit 1) `thenUgn` \ _ ->
413 returnUgn (error "ReadPrefix")
415 ) `thenUgn` \ (n, arg_pats) ->
416 returnUgn (ConPatIn n arg_pats)
421 wlkPat r `thenUgn` \ rpat ->
422 collect_pats l (rpat:acc)
424 wlkPat other `thenUgn` \ pat ->
427 U_infixap fun arg1 arg2 -> -- infix pattern
428 wlkQid fun `thenUgn` \ op ->
429 wlkPat arg1 `thenUgn` \ pat1 ->
430 wlkPat arg2 `thenUgn` \ pat2 ->
431 returnUgn (ConOpPatIn pat1 op pat2)
433 U_negate npat -> -- negated pattern
434 wlkPat npat `thenUgn` \ pat ->
435 returnUgn (NegPatIn pat)
437 U_llist llist -> -- explicit list
438 wlkList rdPat llist `thenUgn` \ pats ->
439 returnUgn (ListPatIn pats)
441 U_tuple tuplelist -> -- explicit tuple
442 wlkList rdPat tuplelist `thenUgn` \ pats ->
443 returnUgn (TuplePatIn pats)
445 U_record con rpats -> -- record destruction
446 wlkQid con `thenUgn` \ rcon ->
447 wlkList rdRpat rpats `thenUgn` \ recpats ->
448 returnUgn (RecPatIn rcon recpats)
451 = rdU_tree pt `thenUgn` \ (U_rbind var pat) ->
452 wlkQid var `thenUgn` \ rvar ->
453 wlkMaybe rdPat pat `thenUgn` \ pat_maybe ->
456 Nothing -> (rvar, VarPatIn rvar, True{-pun-})
457 Just rp -> (rvar, rp, False)
462 wlkLiteral :: U_literal -> UgnM HsLit
467 U_integer s -> HsInt (as_integer s)
468 U_floatr s -> HsFrac (as_rational s)
469 U_intprim s -> HsIntPrim (as_integer s)
470 U_doubleprim s -> HsDoublePrim (as_rational s)
471 U_floatprim s -> HsFloatPrim (as_rational s)
472 U_charr s -> HsChar (as_char s)
473 U_charprim s -> HsCharPrim (as_char s)
474 U_string s -> HsString (as_string s)
475 U_stringprim s -> HsStringPrim (as_string s)
476 U_clitlit s -> HsLitLit (as_string s)
480 as_integer s = readInteger (_UNPK_ s)
481 as_rational s = _readRational (_UNPK_ s) -- non-std
485 %************************************************************************
487 \subsection{wlkBinding}
489 %************************************************************************
492 wlkBinding :: U_binding -> UgnM RdrBinding
498 returnUgn RdrNullBind
500 -- "and" binding (just glue, really)
502 wlkBinding a `thenUgn` \ binding1 ->
503 wlkBinding b `thenUgn` \ binding2 ->
504 returnUgn (RdrAndBindings binding1 binding2)
506 -- "data" declaration
507 U_tbind tctxt ttype tcons tderivs srcline ->
508 mkSrcLocUgn srcline $ \ src_loc ->
509 wlkContext tctxt `thenUgn` \ ctxt ->
510 wlkTyConAndTyVars ttype `thenUgn` \ (tycon, tyvars) ->
511 wlkList rdConDecl tcons `thenUgn` \ cons ->
512 wlkDerivings tderivs `thenUgn` \ derivings ->
513 returnUgn (RdrTyDecl (TyData ctxt tycon tyvars cons derivings noDataPragmas src_loc))
515 -- "newtype" declaration
516 U_ntbind ntctxt nttype ntcon ntderivs srcline ->
517 mkSrcLocUgn srcline $ \ src_loc ->
518 wlkContext ntctxt `thenUgn` \ ctxt ->
519 wlkTyConAndTyVars nttype `thenUgn` \ (tycon, tyvars) ->
520 wlkList rdConDecl ntcon `thenUgn` \ con ->
521 wlkDerivings ntderivs `thenUgn` \ derivings ->
522 returnUgn (RdrTyDecl (TyNew ctxt tycon tyvars con derivings noDataPragmas src_loc))
524 -- "type" declaration
525 U_nbind nbindid nbindas srcline ->
526 mkSrcLocUgn srcline $ \ src_loc ->
527 wlkTyConAndTyVars nbindid `thenUgn` \ (tycon, tyvars) ->
528 wlkMonoType nbindas `thenUgn` \ expansion ->
529 returnUgn (RdrTyDecl (TySynonym tycon tyvars expansion src_loc))
532 U_fbind fbindl srcline ->
533 mkSrcLocUgn srcline $ \ src_loc ->
534 wlkList rdMatch fbindl `thenUgn` \ matches ->
535 returnUgn (RdrFunctionBinding srcline matches)
538 U_pbind pbindl srcline ->
539 mkSrcLocUgn srcline $ \ src_loc ->
540 wlkList rdMatch pbindl `thenUgn` \ matches ->
541 returnUgn (RdrPatternBinding srcline matches)
543 -- "class" declaration
544 U_cbind cbindc cbindid cbindw srcline ->
545 mkSrcLocUgn srcline $ \ src_loc ->
546 wlkContext cbindc `thenUgn` \ ctxt ->
547 wlkClassAssertTy cbindid `thenUgn` \ (clas, tyvar)->
548 wlkBinding cbindw `thenUgn` \ binding ->
549 getSrcFileUgn `thenUgn` \ sf ->
551 (class_sigs, class_methods) = sepDeclsIntoSigsAndBinds binding
553 final_sigs = concat (map cvClassOpSig class_sigs)
554 final_methods = cvMonoBinds sf class_methods
556 returnUgn (RdrClassDecl
557 (ClassDecl ctxt clas tyvar final_sigs final_methods noClassPragmas src_loc))
559 -- "instance" declaration
560 U_ibind ibindc iclas ibindi ibindw srcline ->
561 mkSrcLocUgn srcline $ \ src_loc ->
562 wlkContext ibindc `thenUgn` \ ctxt ->
563 wlkQid iclas `thenUgn` \ clas ->
564 wlkMonoType ibindi `thenUgn` \ inst_ty ->
565 wlkBinding ibindw `thenUgn` \ binding ->
566 getSrcModUgn `thenUgn` \ modname ->
567 getSrcFileUgn `thenUgn` \ sf ->
569 (ss, bs) = sepDeclsIntoSigsAndBinds binding
570 binds = cvMonoBinds sf bs
571 uprags = concat (map cvInstDeclSig ss)
572 ctxt_inst_ty = HsPreForAllTy ctxt inst_ty
573 maybe_mod = if opt_CompilingPrelude
577 returnUgn (RdrInstDecl
578 (InstDecl clas ctxt_inst_ty binds True maybe_mod uprags noInstancePragmas src_loc))
580 -- "default" declaration
581 U_dbind dbindts srcline ->
582 mkSrcLocUgn srcline $ \ src_loc ->
583 wlkList rdMonoType dbindts `thenUgn` \ tys ->
584 returnUgn (RdrDefaultDecl (DefaultDecl tys src_loc))
587 -- signature(-like) things, including user pragmas
588 wlk_sig_thing a_sig_we_hope
592 wlkDerivings :: U_maybe -> UgnM (Maybe [RdrName])
594 wlkDerivings (U_nothing) = returnUgn Nothing
595 wlkDerivings (U_just pt)
596 = rdU_list pt `thenUgn` \ ds ->
597 wlkList rdQid ds `thenUgn` \ derivs ->
598 returnUgn (Just derivs)
603 wlk_sig_thing (U_sbind sbindids sbindid srcline)
604 = mkSrcLocUgn srcline $ \ src_loc ->
605 wlkList rdQid sbindids `thenUgn` \ vars ->
606 wlkPolyType sbindid `thenUgn` \ poly_ty ->
607 returnUgn (RdrTySig vars poly_ty src_loc)
609 -- value specialisation user-pragma
610 wlk_sig_thing (U_vspec_uprag uvar vspec_tys srcline)
611 = mkSrcLocUgn srcline $ \ src_loc ->
612 wlkQid uvar `thenUgn` \ var ->
613 wlkList rd_ty_and_id vspec_tys `thenUgn` \ tys_and_ids ->
614 returnUgn (RdrSpecValSig [SpecSig var ty using_id src_loc
615 | (ty, using_id) <- tys_and_ids ])
617 rd_ty_and_id :: ParseTree -> UgnM (RdrNamePolyType, Maybe RdrName)
619 = rdU_binding pt `thenUgn` \ (U_vspec_ty_and_id vspec_ty vspec_id) ->
620 wlkPolyType vspec_ty `thenUgn` \ ty ->
621 wlkMaybe rdQid vspec_id `thenUgn` \ id_maybe ->
622 returnUgn(ty, id_maybe)
624 -- instance specialisation user-pragma
625 wlk_sig_thing (U_ispec_uprag iclas ispec_ty srcline)
626 = mkSrcLocUgn srcline $ \ src_loc ->
627 wlkQid iclas `thenUgn` \ clas ->
628 wlkMonoType ispec_ty `thenUgn` \ ty ->
629 returnUgn (RdrSpecInstSig (SpecInstSig clas ty src_loc))
631 -- data specialisation user-pragma
632 wlk_sig_thing (U_dspec_uprag itycon dspec_tys srcline)
633 = mkSrcLocUgn srcline $ \ src_loc ->
634 wlkQid itycon `thenUgn` \ tycon ->
635 wlkList rdMonoType dspec_tys `thenUgn` \ tys ->
636 returnUgn (RdrSpecDataSig (SpecDataSig tycon (MonoTyApp tycon tys) src_loc))
638 -- value inlining user-pragma
639 wlk_sig_thing (U_inline_uprag ivar srcline)
640 = mkSrcLocUgn srcline $ \ src_loc ->
641 wlkQid ivar `thenUgn` \ var ->
642 returnUgn (RdrInlineValSig (InlineSig var src_loc))
644 -- "deforest me" user-pragma
645 wlk_sig_thing (U_deforest_uprag ivar srcline)
646 = mkSrcLocUgn srcline $ \ src_loc ->
647 wlkQid ivar `thenUgn` \ var ->
648 returnUgn (RdrDeforestSig (DeforestSig var src_loc))
650 -- "magic" unfolding user-pragma
651 wlk_sig_thing (U_magicuf_uprag ivar str srcline)
652 = mkSrcLocUgn srcline $ \ src_loc ->
653 wlkQid ivar `thenUgn` \ var ->
654 returnUgn (RdrMagicUnfoldingSig (MagicUnfoldingSig var str src_loc))
657 %************************************************************************
659 \subsection[wlkTypes]{Reading in types in various forms (and data constructors)}
661 %************************************************************************
664 rdPolyType :: ParseTree -> UgnM RdrNamePolyType
665 rdMonoType :: ParseTree -> UgnM RdrNameMonoType
667 rdPolyType pt = rdU_ttype pt `thenUgn` \ ttype -> wlkPolyType ttype
668 rdMonoType pt = rdU_ttype pt `thenUgn` \ ttype -> wlkMonoType ttype
670 wlkPolyType :: U_ttype -> UgnM RdrNamePolyType
671 wlkMonoType :: U_ttype -> UgnM RdrNameMonoType
675 U_context tcontextl tcontextt -> -- context
676 wlkContext tcontextl `thenUgn` \ ctxt ->
677 wlkMonoType tcontextt `thenUgn` \ ty ->
678 returnUgn (HsPreForAllTy ctxt ty)
680 other -> -- something else
681 wlkMonoType other `thenUgn` \ ty ->
682 returnUgn (HsPreForAllTy [{-no context-}] ty)
686 U_namedtvar tv -> -- type variable
687 wlkQid tv `thenUgn` \ tyvar ->
688 returnUgn (MonoTyVar tyvar)
690 U_tname tcon -> -- type constructor
691 wlkQid tcon `thenUgn` \ tycon ->
692 returnUgn (MonoTyApp tycon [])
695 wlkMonoType t2 `thenUgn` \ ty2 ->
696 collect t1 [ty2] `thenUgn` \ (tycon, tys) ->
697 returnUgn (MonoTyApp tycon tys)
701 U_tapp t1 t2 -> wlkMonoType t2 `thenUgn` \ ty2 ->
703 U_tname tcon -> wlkQid tcon `thenUgn` \ tycon ->
704 returnUgn (tycon, acc)
705 U_namedtvar tv -> wlkQid tv `thenUgn` \ tyvar ->
706 returnUgn (tyvar, acc)
707 U_tllist _ -> panic "tlist"
708 U_ttuple _ -> panic "ttuple"
709 U_tfun _ _ -> panic "tfun"
710 U_tbang _ -> panic "tbang"
711 U_context _ _ -> panic "context"
712 _ -> panic "something else"
714 U_tllist tlist -> -- list type
715 wlkMonoType tlist `thenUgn` \ ty ->
716 returnUgn (MonoListTy ty)
719 wlkList rdMonoType ttuple `thenUgn` \ tys ->
720 returnUgn (MonoTupleTy tys)
723 wlkMonoType tfun `thenUgn` \ ty1 ->
724 wlkMonoType targ `thenUgn` \ ty2 ->
725 returnUgn (MonoFunTy ty1 ty2)
730 wlkTyConAndTyVars :: U_ttype -> UgnM (RdrName, [RdrName])
731 wlkContext :: U_list -> UgnM RdrNameContext
732 wlkClassAssertTy :: U_ttype -> UgnM (RdrName, RdrName)
734 wlkTyConAndTyVars ttype
735 = wlkMonoType ttype `thenUgn` \ (MonoTyApp tycon ty_args) ->
737 args = [ a | (MonoTyVar a) <- ty_args ]
739 returnUgn (tycon, args)
742 = wlkList rdMonoType list `thenUgn` \ tys ->
743 returnUgn (map mk_class_assertion tys)
746 = wlkMonoType xs `thenUgn` \ mono_ty ->
747 returnUgn (mk_class_assertion mono_ty)
749 mk_class_assertion :: RdrNameMonoType -> (RdrName, RdrName)
751 mk_class_assertion (MonoTyApp name [(MonoTyVar tyname)]) = (name, tyname)
752 mk_class_assertion other
753 = pprError "ERROR: malformed type context: " (ppr PprForUser other)
754 -- regrettably, the parser does let some junk past
755 -- e.g., f :: Num {-nothing-} => a -> ...
759 rdConDecl :: ParseTree -> UgnM RdrNameConDecl
761 = rdU_constr pt `thenUgn` \ blah ->
764 wlkConDecl :: U_constr -> UgnM RdrNameConDecl
766 wlkConDecl (U_constrpre ccon ctys srcline)
767 = mkSrcLocUgn srcline $ \ src_loc ->
768 wlkQid ccon `thenUgn` \ con ->
769 wlkList rdBangType ctys `thenUgn` \ tys ->
770 returnUgn (ConDecl con tys src_loc)
772 wlkConDecl (U_constrinf cty1 cop cty2 srcline)
773 = mkSrcLocUgn srcline $ \ src_loc ->
774 wlkBangType cty1 `thenUgn` \ ty1 ->
775 wlkQid cop `thenUgn` \ op ->
776 wlkBangType cty2 `thenUgn` \ ty2 ->
777 returnUgn (ConOpDecl ty1 op ty2 src_loc)
779 wlkConDecl (U_constrnew ccon cty srcline)
780 = mkSrcLocUgn srcline $ \ src_loc ->
781 wlkQid ccon `thenUgn` \ con ->
782 wlkMonoType cty `thenUgn` \ ty ->
783 returnUgn (NewConDecl con ty src_loc)
785 wlkConDecl (U_constrrec ccon cfields srcline)
786 = mkSrcLocUgn srcline $ \ src_loc ->
787 wlkQid ccon `thenUgn` \ con ->
788 wlkList rd_field cfields `thenUgn` \ fields_lists ->
789 returnUgn (RecConDecl con fields_lists src_loc)
791 rd_field :: ParseTree -> UgnM ([RdrName], BangType RdrName)
793 = rdU_constr pt `thenUgn` \ (U_field fvars fty) ->
794 wlkList rdQid fvars `thenUgn` \ vars ->
795 wlkBangType fty `thenUgn` \ ty ->
799 rdBangType pt = rdU_ttype pt `thenUgn` \ ty -> wlkBangType ty
801 wlkBangType :: U_ttype -> UgnM (BangType RdrName)
803 wlkBangType (U_tbang bty) = wlkMonoType bty `thenUgn` \ ty ->
804 returnUgn (Banged (HsPreForAllTy [] ty))
805 wlkBangType uty = wlkMonoType uty `thenUgn` \ ty ->
806 returnUgn (Unbanged (HsPreForAllTy [] ty))
809 %************************************************************************
811 \subsection{Read a ``match''}
813 %************************************************************************
816 rdMatch :: ParseTree -> UgnM RdrMatch
819 = rdU_pbinding pt `thenUgn` \ (U_pgrhs gpat gdexprs gbind gsrcfun srcline) ->
820 mkSrcLocUgn srcline $ \ src_loc ->
821 wlkPat gpat `thenUgn` \ pat ->
822 wlkBinding gbind `thenUgn` \ binding ->
823 wlkQid gsrcfun `thenUgn` \ srcfun ->
825 wlk_guards (U_pnoguards exp)
826 = wlkExpr exp `thenUgn` \ expr ->
827 returnUgn (RdrMatch_NoGuard srcline srcfun pat expr binding)
829 wlk_guards (U_pguards gs)
830 = wlkList rd_gd_expr gs `thenUgn` \ gd_exps ->
831 returnUgn (RdrMatch_Guards srcline srcfun pat gd_exps binding)
836 = rdU_pbinding pt `thenUgn` \ (U_pgdexp g e) ->
837 wlkExpr g `thenUgn` \ guard ->
838 wlkExpr e `thenUgn` \ expr ->
839 returnUgn (guard, expr)
842 %************************************************************************
844 \subsection[rdFixOp]{Read in a fixity declaration}
846 %************************************************************************
849 rdFixOp :: ParseTree -> UgnM RdrNameFixityDecl
851 = rdU_tree pt `thenUgn` \ fix ->
853 U_fixop op (-1) prec -> wlkQid op `thenUgn` \ op ->
854 returnUgn (InfixL op prec)
855 U_fixop op 0 prec -> wlkQid op `thenUgn` \ op ->
856 returnUgn (InfixN op prec)
857 U_fixop op 1 prec -> wlkQid op `thenUgn` \ op ->
858 returnUgn (InfixR op prec)
859 _ -> error "ReadPrefix:rdFixOp"
862 %************************************************************************
864 \subsection[rdImport]{Read an import decl}
866 %************************************************************************
869 rdImport :: ParseTree
870 -> UgnM RdrNameImportDecl
873 = rdU_binding pt `thenUgn` \ (U_import imod iqual ias ispec srcline) ->
874 mkSrcLocUgn srcline $ \ src_loc ->
875 wlkMaybe rdU_stringId ias `thenUgn` \ maybe_as ->
876 wlkMaybe rd_spec ispec `thenUgn` \ maybe_spec ->
877 returnUgn (ImportDecl imod (cvFlag iqual) maybe_as maybe_spec src_loc)
879 rd_spec pt = rdU_either pt `thenUgn` \ spec ->
881 U_left pt -> rdEntities pt `thenUgn` \ ents ->
882 returnUgn (False, ents)
883 U_right pt -> rdEntities pt `thenUgn` \ ents ->
884 returnUgn (True, ents)
889 = rdU_list pt `thenUgn` \ list ->
890 wlkList rdEntity list
892 rdEntity :: ParseTree -> UgnM (IE RdrName)
895 = rdU_entidt pt `thenUgn` \ entity ->
897 U_entid evar -> -- just a value
898 wlkQid evar `thenUgn` \ var ->
899 returnUgn (IEVar var)
901 U_enttype x -> -- abstract type constructor/class
902 wlkQid x `thenUgn` \ thing ->
903 returnUgn (IEThingAbs thing)
905 U_enttypeall x -> -- non-abstract type constructor/class
906 wlkQid x `thenUgn` \ thing ->
907 returnUgn (IEThingAll thing)
909 U_enttypenamed x ns -> -- non-abstract type constructor/class
910 -- with specified constrs/methods
911 wlkQid x `thenUgn` \ thing ->
912 wlkList rdQid ns `thenUgn` \ names ->
913 returnUgn (IEThingWith thing names)
915 U_entmod mod -> -- everything provided unqualified by a module
916 returnUgn (IEModuleContents mod)