2 #include "HsVersions.h"
3 module ParseType ( parseType ) where
7 import HsSyn -- quite a bit of stuff
8 import RdrHsSyn -- oodles of synonyms
9 import HsDecls ( HsIdInfo(..) )
10 import HsTypes ( mkHsForAllTy )
13 import HsPragmas ( noGenPragmas, noDataPragmas, noClassPragmas, noClassOpPragmas, noInstancePragmas )
14 import IdInfo ( exactArity, mkStrictnessInfo, mkBottomStrictnessInfo,
15 ArgUsageInfo, FBTypeInfo
17 import Kind ( Kind, mkArrowKind, mkTypeKind )
20 import RnMonad ( SYN_IE(ImportVersion), SYN_IE(LocalVersion), ParsedIface(..),
21 SYN_IE(RdrNamePragma), SYN_IE(ExportItem)
23 import Bag ( emptyBag, unitBag, snocBag )
24 import FiniteMap ( emptyFM, unitFM, addToFM, plusFM, bagToFM, FiniteMap )
25 import Name ( OccName(..), isTCOcc, Provenance )
26 import SrcLoc ( mkIfaceSrcLoc )
27 import Util ( panic{-, pprPanic ToDo:rm-} )
29 import PprStyle -- PprDebug for panic
30 import Maybes ( MaybeErr(..) )
32 ------------------------------------------------------------------
34 parseType :: [IfaceToken] -> MaybeErr RdrNameHsType (PprStyle -> Doc)
40 Failed err -> panic (show (err PprDebug))
47 %tokentype { IfaceToken }
48 %monad { IfM }{ thenIf }{ returnIf }
65 VARSYM { ITvarsym $$ }
66 CONSYM { ITconsym $$ }
67 QCONID { ITqconid $$ }
69 UNKNOWN { ITunknown $$ }
72 type :: { RdrNameHsType }
73 type : FORALL forall context DARROW type { mkHsForAllTy $2 $3 $5 }
74 | btype RARROW type { MonoFunTy $1 $3 }
77 forall : OBRACK tv_bndrs CBRACK { $2 }
79 context :: { RdrNameContext }
81 | OCURLY context_list1 CCURLY { $2 }
83 context_list1 :: { RdrNameContext }
84 context_list1 : class { [$1] }
85 | class COMMA context_list1 { $1 : $3 }
87 class :: { (RdrName, RdrNameHsType) }
88 class : tc_name atype { ($1, $2) }
91 types2 :: { [RdrNameHsType] {- Two or more -} }
92 types2 : type COMMA type { [$1,$3] }
93 | type COMMA types2 { $1 : $3 }
95 btype :: { RdrNameHsType }
97 | btype atype { MonoTyApp $1 $2 }
99 atype :: { RdrNameHsType }
100 atype : tc_name { MonoTyVar $1 }
101 | tv_name { MonoTyVar $1 }
102 | OPAREN types2 CPAREN { MonoTupleTy dummyRdrTcName $2 }
103 | OBRACK type CBRACK { MonoListTy dummyRdrTcName $2 }
104 | OCURLY tc_name atype CCURLY { MonoDictTy $2 $3 }
105 | OPAREN type CPAREN { $2 }
107 atypes :: { [RdrNameHsType] {- Zero or more -} }
109 | atype atypes { $1 : $2
110 ---------------------------------------------------------------------
113 tv_bndr :: { HsTyVar RdrName }
114 tv_bndr : tv_name DCOLON akind { IfaceTyVar $1 $3 }
115 | tv_name { UserTyVar $1 }
117 tv_bndrs :: { [HsTyVar RdrName] }
119 | tv_bndr tv_bndrs { $1 : $2 }
123 | akind RARROW kind { mkArrowKind $1 $3 }
126 : VARSYM { mkTypeKind {- ToDo: check that it's "*" -} }
127 | OPAREN kind CPAREN { $2 }
129 tv_name :: { RdrName }
130 tv_name : VARID { Unqual (TvOcc $1) }
132 tv_names :: { [RdrName] }
134 | tv_name tv_names { $1 : $2 }
136 tc_name :: { RdrName }
137 tc_name : QCONID { tcQual $1 }
138 | CONID { Unqual (TCOcc $1) }
139 | CONSYM { Unqual (TCOcc $1) }
140 | OPAREN RARROW CPAREN { Unqual (TCOcc SLIT("->")) }