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 ErrUtils ( addErrLoc, ghcExit )
21 import FiniteMap ( elemFM, FiniteMap )
22 import Name ( RdrName(..), isRdrLexConOrSpecial, preludeQual )
23 import PprStyle ( PprStyle(..) )
24 import PrelMods ( pRELUDE )
26 import SrcLoc ( SrcLoc )
27 import Util ( nOfThem, pprError, panic )
30 %************************************************************************
32 \subsection[ReadPrefix-help]{Help Functions}
34 %************************************************************************
37 wlkList :: (U_VOID_STAR -> UgnM a) -> U_list -> UgnM [a]
39 wlkList wlk_it U_lnil = returnUgn []
41 wlkList wlk_it (U_lcons hd tl)
42 = wlk_it hd `thenUgn` \ hd_it ->
43 wlkList wlk_it tl `thenUgn` \ tl_it ->
44 returnUgn (hd_it : tl_it)
48 wlkMaybe :: (U_VOID_STAR -> UgnM a) -> U_maybe -> UgnM (Maybe a)
50 wlkMaybe wlk_it U_nothing = returnUgn Nothing
51 wlkMaybe wlk_it (U_just x)
52 = wlk_it x `thenUgn` \ it ->
57 rdQid :: ParseTree -> UgnM RdrName
58 rdQid pt = rdU_qid pt `thenUgn` \ qid -> wlkQid qid
60 wlkQid :: U_qid -> UgnM RdrName
61 wlkQid (U_noqual name)
62 = returnUgn (Unqual name)
63 wlkQid (U_aqual mod name)
64 = returnUgn (Qual mod name)
66 = returnUgn (preludeQual name)
68 cvFlag :: U_long -> Bool
73 %************************************************************************
75 \subsection[rdModule]{@rdModule@: reads in a Haskell module}
77 %************************************************************************
80 rdModule :: IO (Module, -- this module's name
81 RdrNameHsModule) -- the main goods
84 = _ccall_ hspmain `thenPrimIO` \ pt -> -- call the Yacc parser!
86 srcfile = _packCString ``input_filename'' -- What A Great Hack! (TM)
89 rdU_tree pt `thenUgn` \ (U_hmodule modname himplist hexplist hfixlist
90 hmodlist srciface_version srcline) ->
92 setSrcFileUgn srcfile $
93 setSrcModUgn modname $
94 mkSrcLocUgn srcline $ \ src_loc ->
96 wlkMaybe rdEntities hexplist `thenUgn` \ exports ->
97 wlkList rdImport himplist `thenUgn` \ imports ->
98 wlkList rdFixOp hfixlist `thenUgn` \ fixities ->
99 wlkBinding hmodlist `thenUgn` \ binding ->
101 case sepDeclsForTopBinds binding of
102 (tydecls, tysigs, classdecls, instdecls, instsigs, defaultdecls, binds) ->
106 (case srciface_version of { 0 -> Nothing; n -> Just n })
116 (cvSepdBinds srcfile cvValSig binds)
117 [{-no interface sigs yet-}]
122 %************************************************************************
124 \subsection[wlkExprOrPat]{@wlkExpr@ and @wlkPat@}
126 %************************************************************************
129 rdExpr :: ParseTree -> UgnM RdrNameHsExpr
130 rdPat :: ParseTree -> UgnM RdrNamePat
132 rdExpr pt = rdU_tree pt `thenUgn` \ tree -> wlkExpr tree
133 rdPat pt = rdU_tree pt `thenUgn` \ tree -> wlkPat tree
135 wlkExpr :: U_tree -> UgnM RdrNameHsExpr
136 wlkPat :: U_tree -> UgnM RdrNamePat
140 U_par pexpr -> -- parenthesised expr
141 wlkExpr pexpr `thenUgn` \ expr ->
142 returnUgn (HsPar expr)
144 U_lsection lsexp lop -> -- left section
145 wlkExpr lsexp `thenUgn` \ expr ->
146 wlkQid lop `thenUgn` \ op ->
147 returnUgn (SectionL expr (HsVar op))
149 U_rsection rop rsexp -> -- right section
150 wlkQid rop `thenUgn` \ op ->
151 wlkExpr rsexp `thenUgn` \ expr ->
152 returnUgn (SectionR (HsVar op) expr)
154 U_ccall fun flavor ccargs -> -- ccall/casm
155 wlkList rdExpr ccargs `thenUgn` \ args ->
159 returnUgn (CCall fun args
160 (tag == 'p' || tag == 'P') -- may invoke GC
161 (tag == 'N' || tag == 'P') -- really a "casm"
162 (panic "CCall:result_ty"))
164 U_scc label sccexp -> -- scc (set-cost-centre) expression
165 wlkExpr sccexp `thenUgn` \ expr ->
166 returnUgn (HsSCC label expr)
168 U_lambda lampats lamexpr srcline -> -- lambda expression
169 mkSrcLocUgn srcline $ \ src_loc ->
170 wlkList rdPat lampats `thenUgn` \ pats ->
171 wlkExpr lamexpr `thenUgn` \ body ->
173 HsLam (foldr PatMatch
174 (GRHSMatch (GRHSsAndBindsIn
175 [OtherwiseGRHS body src_loc]
180 U_casee caseexpr casebody srcline -> -- case expression
181 mkSrcLocUgn srcline $ \ src_loc ->
182 wlkExpr caseexpr `thenUgn` \ expr ->
183 wlkList rdMatch casebody `thenUgn` \ mats ->
184 getSrcFileUgn `thenUgn` \ sf ->
186 matches = cvMatches sf True mats
188 returnUgn (HsCase expr matches src_loc)
190 U_ife ifpred ifthen ifelse srcline -> -- if expression
191 mkSrcLocUgn srcline $ \ src_loc ->
192 wlkExpr ifpred `thenUgn` \ e1 ->
193 wlkExpr ifthen `thenUgn` \ e2 ->
194 wlkExpr ifelse `thenUgn` \ e3 ->
195 returnUgn (HsIf e1 e2 e3 src_loc)
197 U_let letvdefs letvexpr -> -- let expression
198 wlkBinding letvdefs `thenUgn` \ binding ->
199 wlkExpr letvexpr `thenUgn` \ expr ->
200 getSrcFileUgn `thenUgn` \ sf ->
202 binds = cvBinds sf cvValSig binding
204 returnUgn (HsLet binds expr)
206 U_doe gdo srcline -> -- do expression
207 mkSrcLocUgn srcline $ \ src_loc ->
208 wlkList rd_stmt gdo `thenUgn` \ stmts ->
209 returnUgn (HsDo stmts src_loc)
212 = rdU_tree pt `thenUgn` \ bind ->
214 U_doexp exp srcline ->
215 mkSrcLocUgn srcline $ \ src_loc ->
216 wlkExpr exp `thenUgn` \ expr ->
217 returnUgn (ExprStmt expr src_loc)
219 U_dobind pat exp srcline ->
220 mkSrcLocUgn srcline $ \ src_loc ->
221 wlkPat pat `thenUgn` \ patt ->
222 wlkExpr exp `thenUgn` \ expr ->
223 returnUgn (BindStmt patt expr src_loc)
226 wlkBinding seqlet `thenUgn` \ bs ->
227 getSrcFileUgn `thenUgn` \ sf ->
229 binds = cvBinds sf cvValSig bs
231 returnUgn (LetStmt binds)
233 U_comprh cexp cquals -> -- list comprehension
234 wlkExpr cexp `thenUgn` \ expr ->
235 wlkList rd_qual cquals `thenUgn` \ quals ->
236 returnUgn (ListComp expr quals)
239 = rdU_tree pt `thenUgn` \ qual ->
245 wlkExpr exp `thenUgn` \ expr ->
246 returnUgn (FilterQual expr)
249 wlkPat qpat `thenUgn` \ pat ->
250 wlkExpr qexp `thenUgn` \ expr ->
251 returnUgn (GeneratorQual pat expr)
254 wlkBinding seqlet `thenUgn` \ bs ->
255 getSrcFileUgn `thenUgn` \ sf ->
257 binds = cvBinds sf cvValSig bs
259 returnUgn (LetQual binds)
261 U_eenum efrom estep eto -> -- arithmetic sequence
262 wlkExpr efrom `thenUgn` \ e1 ->
263 wlkMaybe rdExpr estep `thenUgn` \ es2 ->
264 wlkMaybe rdExpr eto `thenUgn` \ es3 ->
265 returnUgn (cv_arith_seq e1 es2 es3)
267 cv_arith_seq e1 Nothing Nothing = ArithSeqIn (From e1)
268 cv_arith_seq e1 Nothing (Just e3) = ArithSeqIn (FromTo e1 e3)
269 cv_arith_seq e1 (Just e2) Nothing = ArithSeqIn (FromThen e1 e2)
270 cv_arith_seq e1 (Just e2) (Just e3) = ArithSeqIn (FromThenTo e1 e2 e3)
272 U_restr restre restrt -> -- expression with type signature
273 wlkExpr restre `thenUgn` \ expr ->
274 wlkPolyType restrt `thenUgn` \ ty ->
275 returnUgn (ExprWithTySig expr ty)
277 --------------------------------------------------------------
278 -- now the prefix items that can either be an expression or
279 -- pattern, except we know they are *expressions* here
280 -- (this code could be commoned up with the pattern version;
281 -- but it probably isn't worth it)
282 --------------------------------------------------------------
284 wlkLiteral lit `thenUgn` \ lit ->
285 returnUgn (HsLit lit)
287 U_ident n -> -- simple identifier
288 wlkQid n `thenUgn` \ var ->
289 returnUgn (HsVar var)
291 U_ap fun arg -> -- application
292 wlkExpr fun `thenUgn` \ expr1 ->
293 wlkExpr arg `thenUgn` \ expr2 ->
294 returnUgn (HsApp expr1 expr2)
296 U_infixap fun arg1 arg2 -> -- infix application
297 wlkQid fun `thenUgn` \ op ->
298 wlkExpr arg1 `thenUgn` \ expr1 ->
299 wlkExpr arg2 `thenUgn` \ expr2 ->
300 returnUgn (OpApp expr1 (HsVar op) expr2)
302 U_negate nexp -> -- prefix negation
303 wlkExpr nexp `thenUgn` \ expr ->
306 rdr = preludeQual SLIT("negate")
308 returnUgn (NegApp expr (HsVar rdr))
310 U_llist llist -> -- explicit list
311 wlkList rdExpr llist `thenUgn` \ exprs ->
312 returnUgn (ExplicitList exprs)
314 U_tuple tuplelist -> -- explicit tuple
315 wlkList rdExpr tuplelist `thenUgn` \ exprs ->
316 returnUgn (ExplicitTuple exprs)
318 U_record con rbinds -> -- record construction
319 wlkQid con `thenUgn` \ rcon ->
320 wlkList rdRbind rbinds `thenUgn` \ recbinds ->
321 returnUgn (RecordCon (HsVar rcon) recbinds)
323 U_rupdate updexp updbinds -> -- record update
324 wlkExpr updexp `thenUgn` \ aexp ->
325 wlkList rdRbind updbinds `thenUgn` \ recbinds ->
326 returnUgn (RecordUpd aexp recbinds)
329 U_hmodule _ _ _ _ _ _ _ -> error "U_hmodule"
330 U_as _ _ -> error "U_as"
331 U_lazyp _ -> error "U_lazyp"
332 U_wildp -> error "U_wildp"
333 U_qual _ _ -> error "U_qual"
334 U_guard _ -> error "U_guard"
335 U_seqlet _ -> error "U_seqlet"
336 U_dobind _ _ _ -> error "U_dobind"
337 U_doexp _ _ -> error "U_doexp"
338 U_rbind _ _ -> error "U_rbind"
339 U_fixop _ _ _ -> error "U_fixop"
343 = rdU_tree pt `thenUgn` \ (U_rbind var exp) ->
344 wlkQid var `thenUgn` \ rvar ->
345 wlkMaybe rdExpr exp `thenUgn` \ expr_maybe ->
348 Nothing -> (rvar, HsVar rvar, True{-pun-})
349 Just re -> (rvar, re, False)
353 Patterns: just bear in mind that lists of patterns are represented as
354 a series of ``applications''.
358 U_par ppat -> -- parenthesised pattern
359 wlkPat ppat `thenUgn` \ pat ->
360 -- tidy things up a little:
365 other -> ParPatIn pat
368 U_as avar as_pat -> -- "as" pattern
369 wlkQid avar `thenUgn` \ var ->
370 wlkPat as_pat `thenUgn` \ pat ->
371 returnUgn (AsPatIn var pat)
373 U_lazyp lazyp -> -- irrefutable ("twiddle") pattern
374 wlkPat lazyp `thenUgn` \ pat ->
375 returnUgn (LazyPatIn pat)
377 U_wildp -> returnUgn WildPatIn -- wildcard pattern
379 U_lit lit -> -- literal pattern
380 wlkLiteral lit `thenUgn` \ lit ->
381 returnUgn (LitPatIn lit)
383 U_ident nn -> -- simple identifier
384 wlkQid nn `thenUgn` \ n ->
386 if isRdrLexConOrSpecial n
391 U_ap l r -> -- "application": there's a list of patterns lurking here!
392 wlkPat r `thenUgn` \ rpat ->
393 collect_pats l [rpat] `thenUgn` \ (lpat,lpats) ->
395 VarPatIn x -> returnUgn (x, lpats)
396 ConPatIn x [] -> returnUgn (x, lpats)
397 ConOpPatIn x op y -> returnUgn (op, x:y:lpats)
398 _ -> getSrcLocUgn `thenUgn` \ loc ->
400 err = addErrLoc loc "Illegal pattern `application'"
401 (\sty -> ppInterleave ppSP (map (ppr sty) (lpat:lpats)))
402 msg = ppShow 100 (err PprForUser)
404 ioToUgnM (hPutStr stderr msg) `thenUgn` \ _ ->
405 ioToUgnM (ghcExit 1) `thenUgn` \ _ ->
406 returnUgn (error "ReadPrefix")
408 ) `thenUgn` \ (n, arg_pats) ->
409 returnUgn (ConPatIn n arg_pats)
414 wlkPat r `thenUgn` \ rpat ->
415 collect_pats l (rpat:acc)
417 wlkPat other `thenUgn` \ pat ->
420 U_infixap fun arg1 arg2 -> -- infix pattern
421 wlkQid fun `thenUgn` \ op ->
422 wlkPat arg1 `thenUgn` \ pat1 ->
423 wlkPat arg2 `thenUgn` \ pat2 ->
424 returnUgn (ConOpPatIn pat1 op pat2)
426 U_negate npat -> -- negated pattern
427 wlkPat npat `thenUgn` \ pat ->
428 returnUgn (NegPatIn pat)
430 U_llist llist -> -- explicit list
431 wlkList rdPat llist `thenUgn` \ pats ->
432 returnUgn (ListPatIn pats)
434 U_tuple tuplelist -> -- explicit tuple
435 wlkList rdPat tuplelist `thenUgn` \ pats ->
436 returnUgn (TuplePatIn pats)
438 U_record con rpats -> -- record destruction
439 wlkQid con `thenUgn` \ rcon ->
440 wlkList rdRpat rpats `thenUgn` \ recpats ->
441 returnUgn (RecPatIn rcon recpats)
444 = rdU_tree pt `thenUgn` \ (U_rbind var pat) ->
445 wlkQid var `thenUgn` \ rvar ->
446 wlkMaybe rdPat pat `thenUgn` \ pat_maybe ->
449 Nothing -> (rvar, VarPatIn rvar, True{-pun-})
450 Just rp -> (rvar, rp, False)
455 wlkLiteral :: U_literal -> UgnM HsLit
460 U_integer s -> HsInt (as_integer s)
461 U_floatr s -> HsFrac (as_rational s)
462 U_intprim s -> HsIntPrim (as_integer s)
463 U_doubleprim s -> HsDoublePrim (as_rational s)
464 U_floatprim s -> HsFloatPrim (as_rational s)
465 U_charr s -> HsChar (as_char s)
466 U_charprim s -> HsCharPrim (as_char s)
467 U_string s -> HsString (as_string s)
468 U_stringprim s -> HsStringPrim (as_string s)
469 U_clitlit s -> HsLitLit (as_string s)
473 as_integer s = readInteger (_UNPK_ s)
474 as_rational s = _readRational (_UNPK_ s) -- non-std
478 %************************************************************************
480 \subsection{wlkBinding}
482 %************************************************************************
485 wlkBinding :: U_binding -> UgnM RdrBinding
491 returnUgn RdrNullBind
493 -- "and" binding (just glue, really)
495 wlkBinding a `thenUgn` \ binding1 ->
496 wlkBinding b `thenUgn` \ binding2 ->
497 returnUgn (RdrAndBindings binding1 binding2)
499 -- "data" declaration
500 U_tbind tctxt ttype tcons tderivs srcline ->
501 mkSrcLocUgn srcline $ \ src_loc ->
502 wlkContext tctxt `thenUgn` \ ctxt ->
503 wlkTyConAndTyVars ttype `thenUgn` \ (tycon, tyvars) ->
504 wlkList rdConDecl tcons `thenUgn` \ cons ->
505 wlkDerivings tderivs `thenUgn` \ derivings ->
506 returnUgn (RdrTyDecl (TyData ctxt tycon tyvars cons derivings noDataPragmas src_loc))
508 -- "newtype" declaration
509 U_ntbind ntctxt nttype ntcon ntderivs srcline ->
510 mkSrcLocUgn srcline $ \ src_loc ->
511 wlkContext ntctxt `thenUgn` \ ctxt ->
512 wlkTyConAndTyVars nttype `thenUgn` \ (tycon, tyvars) ->
513 wlkList rdConDecl ntcon `thenUgn` \ con ->
514 wlkDerivings ntderivs `thenUgn` \ derivings ->
515 returnUgn (RdrTyDecl (TyNew ctxt tycon tyvars con derivings noDataPragmas src_loc))
517 -- "type" declaration
518 U_nbind nbindid nbindas srcline ->
519 mkSrcLocUgn srcline $ \ src_loc ->
520 wlkTyConAndTyVars nbindid `thenUgn` \ (tycon, tyvars) ->
521 wlkMonoType nbindas `thenUgn` \ expansion ->
522 returnUgn (RdrTyDecl (TySynonym tycon tyvars expansion src_loc))
525 U_fbind fbindl srcline ->
526 mkSrcLocUgn srcline $ \ src_loc ->
527 wlkList rdMatch fbindl `thenUgn` \ matches ->
528 returnUgn (RdrFunctionBinding srcline matches)
531 U_pbind pbindl srcline ->
532 mkSrcLocUgn srcline $ \ src_loc ->
533 wlkList rdMatch pbindl `thenUgn` \ matches ->
534 returnUgn (RdrPatternBinding srcline matches)
536 -- "class" declaration
537 U_cbind cbindc cbindid cbindw srcline ->
538 mkSrcLocUgn srcline $ \ src_loc ->
539 wlkContext cbindc `thenUgn` \ ctxt ->
540 wlkClassAssertTy cbindid `thenUgn` \ (clas, tyvar)->
541 wlkBinding cbindw `thenUgn` \ binding ->
542 getSrcFileUgn `thenUgn` \ sf ->
544 (class_sigs, class_methods) = sepDeclsIntoSigsAndBinds binding
546 final_sigs = concat (map cvClassOpSig class_sigs)
547 final_methods = cvMonoBinds sf class_methods
549 returnUgn (RdrClassDecl
550 (ClassDecl ctxt clas tyvar final_sigs final_methods noClassPragmas src_loc))
552 -- "instance" declaration
553 U_ibind ibindc iclas ibindi ibindw srcline ->
554 mkSrcLocUgn srcline $ \ src_loc ->
555 wlkContext ibindc `thenUgn` \ ctxt ->
556 wlkQid iclas `thenUgn` \ clas ->
557 wlkMonoType ibindi `thenUgn` \ inst_ty ->
558 wlkBinding ibindw `thenUgn` \ binding ->
559 getSrcModUgn `thenUgn` \ modname ->
560 getSrcFileUgn `thenUgn` \ sf ->
562 (ss, bs) = sepDeclsIntoSigsAndBinds binding
563 binds = cvMonoBinds sf bs
564 uprags = concat (map cvInstDeclSig ss)
565 ctxt_inst_ty = HsPreForAllTy ctxt inst_ty
567 returnUgn (RdrInstDecl
568 (InstDecl clas ctxt_inst_ty binds True modname uprags noInstancePragmas src_loc))
570 -- "default" declaration
571 U_dbind dbindts srcline ->
572 mkSrcLocUgn srcline $ \ src_loc ->
573 wlkList rdMonoType dbindts `thenUgn` \ tys ->
574 returnUgn (RdrDefaultDecl (DefaultDecl tys src_loc))
577 -- signature(-like) things, including user pragmas
578 wlk_sig_thing a_sig_we_hope
582 wlkDerivings :: U_maybe -> UgnM (Maybe [RdrName])
584 wlkDerivings (U_nothing) = returnUgn Nothing
585 wlkDerivings (U_just pt)
586 = rdU_list pt `thenUgn` \ ds ->
587 wlkList rdQid ds `thenUgn` \ derivs ->
588 returnUgn (Just derivs)
593 wlk_sig_thing (U_sbind sbindids sbindid srcline)
594 = mkSrcLocUgn srcline $ \ src_loc ->
595 wlkList rdQid sbindids `thenUgn` \ vars ->
596 wlkPolyType sbindid `thenUgn` \ poly_ty ->
597 returnUgn (RdrTySig vars poly_ty src_loc)
599 -- value specialisation user-pragma
600 wlk_sig_thing (U_vspec_uprag uvar vspec_tys srcline)
601 = mkSrcLocUgn srcline $ \ src_loc ->
602 wlkQid uvar `thenUgn` \ var ->
603 wlkList rd_ty_and_id vspec_tys `thenUgn` \ tys_and_ids ->
604 returnUgn (RdrSpecValSig [SpecSig var ty using_id src_loc
605 | (ty, using_id) <- tys_and_ids ])
607 rd_ty_and_id :: ParseTree -> UgnM (RdrNamePolyType, Maybe RdrName)
609 = rdU_binding pt `thenUgn` \ (U_vspec_ty_and_id vspec_ty vspec_id) ->
610 wlkPolyType vspec_ty `thenUgn` \ ty ->
611 wlkMaybe rdQid vspec_id `thenUgn` \ id_maybe ->
612 returnUgn(ty, id_maybe)
614 -- instance specialisation user-pragma
615 wlk_sig_thing (U_ispec_uprag iclas ispec_ty srcline)
616 = mkSrcLocUgn srcline $ \ src_loc ->
617 wlkQid iclas `thenUgn` \ clas ->
618 wlkMonoType ispec_ty `thenUgn` \ ty ->
619 returnUgn (RdrSpecInstSig (SpecInstSig clas ty src_loc))
621 -- data specialisation user-pragma
622 wlk_sig_thing (U_dspec_uprag itycon dspec_tys srcline)
623 = mkSrcLocUgn srcline $ \ src_loc ->
624 wlkQid itycon `thenUgn` \ tycon ->
625 wlkList rdMonoType dspec_tys `thenUgn` \ tys ->
626 returnUgn (RdrSpecDataSig (SpecDataSig tycon (MonoTyApp tycon tys) src_loc))
628 -- value inlining user-pragma
629 wlk_sig_thing (U_inline_uprag ivar srcline)
630 = mkSrcLocUgn srcline $ \ src_loc ->
631 wlkQid ivar `thenUgn` \ var ->
632 returnUgn (RdrInlineValSig (InlineSig var src_loc))
634 -- "deforest me" user-pragma
635 wlk_sig_thing (U_deforest_uprag ivar srcline)
636 = mkSrcLocUgn srcline $ \ src_loc ->
637 wlkQid ivar `thenUgn` \ var ->
638 returnUgn (RdrDeforestSig (DeforestSig var src_loc))
640 -- "magic" unfolding user-pragma
641 wlk_sig_thing (U_magicuf_uprag ivar str srcline)
642 = mkSrcLocUgn srcline $ \ src_loc ->
643 wlkQid ivar `thenUgn` \ var ->
644 returnUgn (RdrMagicUnfoldingSig (MagicUnfoldingSig var str src_loc))
647 %************************************************************************
649 \subsection[wlkTypes]{Reading in types in various forms (and data constructors)}
651 %************************************************************************
654 rdPolyType :: ParseTree -> UgnM RdrNamePolyType
655 rdMonoType :: ParseTree -> UgnM RdrNameMonoType
657 rdPolyType pt = rdU_ttype pt `thenUgn` \ ttype -> wlkPolyType ttype
658 rdMonoType pt = rdU_ttype pt `thenUgn` \ ttype -> wlkMonoType ttype
660 wlkPolyType :: U_ttype -> UgnM RdrNamePolyType
661 wlkMonoType :: U_ttype -> UgnM RdrNameMonoType
665 U_context tcontextl tcontextt -> -- context
666 wlkContext tcontextl `thenUgn` \ ctxt ->
667 wlkMonoType tcontextt `thenUgn` \ ty ->
668 returnUgn (HsPreForAllTy ctxt ty)
670 other -> -- something else
671 wlkMonoType other `thenUgn` \ ty ->
672 returnUgn (HsPreForAllTy [{-no context-}] ty)
676 U_namedtvar tv -> -- type variable
677 wlkQid tv `thenUgn` \ tyvar ->
678 returnUgn (MonoTyVar tyvar)
680 U_tname tcon -> -- type constructor
681 wlkQid tcon `thenUgn` \ tycon ->
682 returnUgn (MonoTyApp tycon [])
685 wlkMonoType t2 `thenUgn` \ ty2 ->
686 collect t1 [ty2] `thenUgn` \ (tycon, tys) ->
687 returnUgn (MonoTyApp tycon tys)
691 U_tapp t1 t2 -> wlkMonoType t2 `thenUgn` \ ty2 ->
693 U_tname tcon -> wlkQid tcon `thenUgn` \ tycon ->
694 returnUgn (tycon, acc)
695 U_namedtvar tv -> wlkQid tv `thenUgn` \ tyvar ->
696 returnUgn (tyvar, acc)
697 U_tllist _ -> panic "tlist"
698 U_ttuple _ -> panic "ttuple"
699 U_tfun _ _ -> panic "tfun"
700 U_tbang _ -> panic "tbang"
701 U_context _ _ -> panic "context"
702 _ -> panic "something else"
704 U_tllist tlist -> -- list type
705 wlkMonoType tlist `thenUgn` \ ty ->
706 returnUgn (MonoListTy ty)
709 wlkList rdMonoType ttuple `thenUgn` \ tys ->
710 returnUgn (MonoTupleTy tys)
713 wlkMonoType tfun `thenUgn` \ ty1 ->
714 wlkMonoType targ `thenUgn` \ ty2 ->
715 returnUgn (MonoFunTy ty1 ty2)
720 wlkTyConAndTyVars :: U_ttype -> UgnM (RdrName, [RdrName])
721 wlkContext :: U_list -> UgnM RdrNameContext
722 wlkClassAssertTy :: U_ttype -> UgnM (RdrName, RdrName)
724 wlkTyConAndTyVars ttype
725 = wlkMonoType ttype `thenUgn` \ (MonoTyApp tycon ty_args) ->
727 args = [ a | (MonoTyVar a) <- ty_args ]
729 returnUgn (tycon, args)
732 = wlkList rdMonoType list `thenUgn` \ tys ->
733 returnUgn (map mk_class_assertion tys)
736 = wlkMonoType xs `thenUgn` \ mono_ty ->
737 returnUgn (mk_class_assertion mono_ty)
739 mk_class_assertion :: RdrNameMonoType -> (RdrName, RdrName)
741 mk_class_assertion (MonoTyApp name [(MonoTyVar tyname)]) = (name, tyname)
742 mk_class_assertion other
743 = pprError "ERROR: malformed type context: " (ppr PprForUser other)
744 -- regrettably, the parser does let some junk past
745 -- e.g., f :: Num {-nothing-} => a -> ...
749 rdConDecl :: ParseTree -> UgnM RdrNameConDecl
751 = rdU_constr pt `thenUgn` \ blah ->
754 wlkConDecl :: U_constr -> UgnM RdrNameConDecl
756 wlkConDecl (U_constrpre ccon ctys srcline)
757 = mkSrcLocUgn srcline $ \ src_loc ->
758 wlkQid ccon `thenUgn` \ con ->
759 wlkList rdBangType ctys `thenUgn` \ tys ->
760 returnUgn (ConDecl con tys src_loc)
762 wlkConDecl (U_constrinf cty1 cop cty2 srcline)
763 = mkSrcLocUgn srcline $ \ src_loc ->
764 wlkBangType cty1 `thenUgn` \ ty1 ->
765 wlkQid cop `thenUgn` \ op ->
766 wlkBangType cty2 `thenUgn` \ ty2 ->
767 returnUgn (ConOpDecl ty1 op ty2 src_loc)
769 wlkConDecl (U_constrnew ccon cty srcline)
770 = mkSrcLocUgn srcline $ \ src_loc ->
771 wlkQid ccon `thenUgn` \ con ->
772 wlkMonoType cty `thenUgn` \ ty ->
773 returnUgn (NewConDecl con ty src_loc)
775 wlkConDecl (U_constrrec ccon cfields srcline)
776 = mkSrcLocUgn srcline $ \ src_loc ->
777 wlkQid ccon `thenUgn` \ con ->
778 wlkList rd_field cfields `thenUgn` \ fields_lists ->
779 returnUgn (RecConDecl con fields_lists src_loc)
781 rd_field :: ParseTree -> UgnM ([RdrName], BangType RdrName)
783 = rdU_constr pt `thenUgn` \ (U_field fvars fty) ->
784 wlkList rdQid fvars `thenUgn` \ vars ->
785 wlkBangType fty `thenUgn` \ ty ->
789 rdBangType pt = rdU_ttype pt `thenUgn` \ ty -> wlkBangType ty
791 wlkBangType :: U_ttype -> UgnM (BangType RdrName)
793 wlkBangType (U_tbang bty) = wlkMonoType bty `thenUgn` \ ty ->
794 returnUgn (Banged (HsPreForAllTy [] ty))
795 wlkBangType uty = wlkMonoType uty `thenUgn` \ ty ->
796 returnUgn (Unbanged (HsPreForAllTy [] ty))
799 %************************************************************************
801 \subsection{Read a ``match''}
803 %************************************************************************
806 rdMatch :: ParseTree -> UgnM RdrMatch
809 = rdU_pbinding pt `thenUgn` \ (U_pgrhs gpat gdexprs gbind gsrcfun srcline) ->
810 mkSrcLocUgn srcline $ \ src_loc ->
811 wlkPat gpat `thenUgn` \ pat ->
812 wlkBinding gbind `thenUgn` \ binding ->
813 wlkQid gsrcfun `thenUgn` \ srcfun ->
815 wlk_guards (U_pnoguards exp)
816 = wlkExpr exp `thenUgn` \ expr ->
817 returnUgn (RdrMatch_NoGuard srcline srcfun pat expr binding)
819 wlk_guards (U_pguards gs)
820 = wlkList rd_gd_expr gs `thenUgn` \ gd_exps ->
821 returnUgn (RdrMatch_Guards srcline srcfun pat gd_exps binding)
826 = rdU_pbinding pt `thenUgn` \ (U_pgdexp g e) ->
827 wlkExpr g `thenUgn` \ guard ->
828 wlkExpr e `thenUgn` \ expr ->
829 returnUgn (guard, expr)
832 %************************************************************************
834 \subsection[rdFixOp]{Read in a fixity declaration}
836 %************************************************************************
839 rdFixOp :: ParseTree -> UgnM RdrNameFixityDecl
841 = rdU_tree pt `thenUgn` \ fix ->
843 U_fixop op (-1) prec -> wlkQid op `thenUgn` \ op ->
844 returnUgn (InfixL op prec)
845 U_fixop op 0 prec -> wlkQid op `thenUgn` \ op ->
846 returnUgn (InfixN op prec)
847 U_fixop op 1 prec -> wlkQid op `thenUgn` \ op ->
848 returnUgn (InfixR op prec)
849 _ -> error "ReadPrefix:rdFixOp"
852 %************************************************************************
854 \subsection[rdImport]{Read an import decl}
856 %************************************************************************
859 rdImport :: ParseTree
860 -> UgnM RdrNameImportDecl
863 = rdU_binding pt `thenUgn` \ (U_import imod iqual ias ispec srcline) ->
864 mkSrcLocUgn srcline $ \ src_loc ->
865 wlkMaybe rdU_stringId ias `thenUgn` \ maybe_as ->
866 wlkMaybe rd_spec ispec `thenUgn` \ maybe_spec ->
867 returnUgn (ImportDecl imod (cvFlag iqual) maybe_as maybe_spec src_loc)
869 rd_spec pt = rdU_either pt `thenUgn` \ spec ->
871 U_left pt -> rdEntities pt `thenUgn` \ ents ->
872 returnUgn (False, ents)
873 U_right pt -> rdEntities pt `thenUgn` \ ents ->
874 returnUgn (True, ents)
879 = rdU_list pt `thenUgn` \ list ->
880 wlkList rdEntity list
882 rdEntity :: ParseTree -> UgnM (IE RdrName)
885 = rdU_entidt pt `thenUgn` \ entity ->
887 U_entid evar -> -- just a value
888 wlkQid evar `thenUgn` \ var ->
889 returnUgn (IEVar var)
891 U_enttype x -> -- abstract type constructor/class
892 wlkQid x `thenUgn` \ thing ->
893 returnUgn (IEThingAbs thing)
895 U_enttypeall x -> -- non-abstract type constructor/class
896 wlkQid x `thenUgn` \ thing ->
897 returnUgn (IEThingAll thing)
899 U_enttypenamed x ns -> -- non-abstract type constructor/class
900 -- with specified constrs/methods
901 wlkQid x `thenUgn` \ thing ->
902 wlkList rdQid ns `thenUgn` \ names ->
903 returnUgn (IEThingWith thing names)
905 U_entmod mod -> -- everything provided unqualified by a module
906 returnUgn (IEModuleContents mod)