import HsTypes ( mkHsForAllTy )
import HsCore
import Const ( Literal(..), mkMachInt_safe )
-import BasicTypes ( IfaceFlavour(..), Fixity(..), FixityDirection(..),
+import BasicTypes ( Fixity(..), FixityDirection(..),
NewOrData(..), Version
)
+import CostCentre ( CostCentre(..), IsDictCC(..), IsCafCC(..), IsDupdCC(..) )
import HsPragmas ( noDataPragmas, noClassPragmas )
import Type ( Kind, mkArrowKind, boxedTypeKind, openTypeKind )
import IdInfo ( ArityInfo, exactArity )
)
import Bag ( emptyBag, unitBag, snocBag )
import FiniteMap ( emptyFM, unitFM, addToFM, plusFM, bagToFM, FiniteMap )
-import Name ( OccName(..), isTCOcc, Provenance, Module,
- mkTupNameStr, mkUbxTupNameStr
+import RdrName ( RdrName, mkRdrUnqual, mkSysQual, mkSysUnqual )
+import Name ( OccName, Provenance )
+import OccName ( mkSysOccFS,
+ tcName, varName, dataName, clsName, tvName,
+ EncodedFS
)
+import Module ( Module, mkSysModuleFS, IfaceFlavour, hiFile, hiBootFile )
+import PrelMods ( mkTupNameStr, mkUbxTupNameStr )
+import PrelInfo ( mkTupConRdrName, mkUbxTupConRdrName )
import SrcLoc ( SrcLoc )
import Maybes
import Outputable
import GlaExts
+
+#if __HASKELL1__ > 4
+import Ratio ( (%) )
+#endif
}
%name parseIface
'__litlit' { ITlit_lit }
'__string' { ITstring_lit }
'__ccall' { ITccall $$ }
- '__scc' { ITscc $$ }
- '__a' { ITtypeapp }
+ '__scc' { ITscc }
+ '__sccC' { ITsccAllCafs }
+ '__sccD' { ITsccAllDicts }
'__A' { ITarity }
'__P' { ITspecialise }
-- (c) the IdInfo part of a signature (same reason)
iface_stuff :: { IfaceStuff }
-iface_stuff : iface { PIface $1 }
+iface_stuff : iface { let (nm, iff) = $1 in PIface nm iff }
| type { PType $1 }
| id_info { PIdInfo $1 }
-iface :: { ParsedIface }
-iface : '__interface' CONID INTEGER checkVersion 'where'
+iface :: { (EncodedFS, ParsedIface) }
+iface : '__interface' mod_fs INTEGER checkVersion 'where'
import_part
instance_import_part
exports_part
- fixities_part
instance_decl_part
decls_part
- { ParsedIface
- $2 -- Module name
+ { ( $2 -- Module name
+ , ParsedIface
(fromInteger $3) -- Module version
(reverse $6) -- Usages
(reverse $8) -- Exports
(reverse $7) -- Instance import modules
- (reverse $9) -- Fixities
- (reverse $11) -- Decls
- (reverse $10) -- Local instances
+ (reverse $10) -- Decls
+ (reverse $9) -- Local instances
+ )
}
--------------------------------------------------------------------------
| import_part import_decl { $2 : $1 }
import_decl :: { ImportVersion OccName }
-import_decl : 'import' mod_name opt_bang INTEGER '::' whats_imported ';'
- { ($2, $3, fromInteger $4, $6) }
+import_decl : 'import' mod_fs opt_bang INTEGER '::' whats_imported ';'
+ { (mkSysModuleFS $2 $3, fromInteger $4, $6) }
whats_imported :: { WhatsImported OccName }
whats_imported : { Everything }
| name_version_pair name_version_pairs { $1 : $2 }
name_version_pair :: { LocalVersion OccName }
-name_version_pair : entity_occ INTEGER { ($1, fromInteger $2) }
+name_version_pair : var_occ INTEGER { ($1, fromInteger $2) }
+ | tc_occ INTEGER { ($1, fromInteger $2) }
instance_import_part :: { [Module] }
instance_import_part : { [] }
exports_part :: { [ExportItem] }
exports_part : { [] }
- | exports_part '__export' opt_bang mod_name entities ';'
- { ($4,$3,$5) : $1 }
+ | exports_part '__export' opt_bang mod_fs entities ';'
+ { (mkSysModuleFS $4 $3,$5) : $1 }
opt_bang :: { IfaceFlavour }
-opt_bang : { HiFile }
- | '!' { HiBootFile }
+opt_bang : { hiFile }
+ | '!' { hiBootFile }
entities :: { [RdrAvailInfo] }
-entities : { [] }
- | entity entities { $1 : $2 }
+entities : { [] }
+ | entity entities { $1 : $2 }
entity :: { RdrAvailInfo }
-entity : entity_occ { if isTCOcc $1
- then AvailTC $1 [$1]
- else Avail $1 }
- | entity_occ stuff_inside { AvailTC $1 ($1:$2) }
- | entity_occ '|' stuff_inside { AvailTC $1 $3 }
+entity : tc_occ { AvailTC $1 [$1] }
+ | var_occ { Avail $1 }
+ | tc_occ stuff_inside { AvailTC $1 ($1:$2) }
+ | tc_occ '|' stuff_inside { AvailTC $1 $3 }
stuff_inside :: { [OccName] }
stuff_inside : '{' val_occs '}' { $2 }
---------------------------------------------------------------------------
+val_occ :: { OccName }
+ : var_occ { $1 }
+ | data_occ { $1 }
+
+val_occs :: { [OccName] }
+ : val_occ { [$1] }
+ | val_occ val_occs { $1 : $2 }
-fixities_part :: { [(OccName,Fixity)] }
-fixities_part : { [] }
- | fixities_part fixity_decl ';' { $2 : $1 }
-fixity_decl :: { (OccName,Fixity) }
-fixity_decl : 'infixl' mb_fix val_occ { ($3, Fixity $2 InfixL) }
- | 'infixr' mb_fix val_occ { ($3, Fixity $2 InfixR) }
- | 'infix' mb_fix val_occ { ($3, Fixity $2 InfixN) }
+--------------------------------------------------------------------------
+fixity :: { FixityDirection }
+fixity : 'infixl' { InfixL }
+ | 'infixr' { InfixR }
+ | 'infix' { InfixN }
+
mb_fix :: { Int }
mb_fix : {-nothing-} { 9 }
| INTEGER { (fromInteger $1) }
decl : src_loc var_name '::' type maybe_idinfo
{ SigD (IfaceSig $2 $4 ($5 $2) $1) }
| src_loc 'type' tc_name tv_bndrs '=' type
- { TyD (TySynonym $3 $4 $6 $1) }
- | src_loc 'data' decl_context data_fs tv_bndrs constrs
- { TyD (TyData DataType $3 (Unqual (TCOcc $4)) $5 $6 Nothing noDataPragmas $1) }
+ { TyClD (TySynonym $3 $4 $6 $1) }
+ | src_loc 'data' decl_context tc_name tv_bndrs constrs
+ { TyClD (TyData DataType $3 $4 $5 $6 Nothing noDataPragmas $1) }
| src_loc 'newtype' decl_context tc_name tv_bndrs newtype_constr
- { TyD (TyData NewType $3 $4 $5 $6 Nothing noDataPragmas $1) }
+ { TyClD (TyData NewType $3 $4 $5 $6 Nothing noDataPragmas $1) }
| src_loc 'class' decl_context tc_name tv_bndrs csigs
- { ClD (mkClassDecl $3 $4 $5 $6 EmptyMonoBinds
+ { TyClD (mkClassDecl $3 $4 $5 $6 EmptyMonoBinds
noClassPragmas $1) }
+ | src_loc fixity mb_fix var_or_data_name
+ { FixD (FixitySig $4 (Fixity $3 $2) $1) }
+
maybe_idinfo :: { RdrName -> [HsIdInfo RdrName] }
maybe_idinfo : {- empty -} { \_ -> [] }
| src_loc PRAGMA { \x ->
case parseIface $2 $1 of
Succeeded (PIdInfo id_info) -> id_info
- other -> pprPanic "IdInfo parse failed"
- (ppr x)
+ Failed err -> pprPanic "IdInfo parse failed"
+ (vcat [ppr x, err])
}
-----------------------------------------------------------------------------
| constr '|' constrs1 { $1 : $3 }
constr :: { RdrNameConDecl }
-constr : src_loc ex_stuff data_fs batypes { mkConDecl (Unqual (VarOcc $3)) $2 (VanillaCon $4) $1 }
- | src_loc ex_stuff data_fs '{' fields1 '}' { mkConDecl (Unqual (VarOcc $3)) $2 (RecCon $5) $1 }
+constr : src_loc ex_stuff data_name batypes { mkConDecl $3 $2 (VanillaCon $4) $1 }
+ | src_loc ex_stuff data_name '{' fields1 '}' { mkConDecl $3 $2 (RecCon $5) $1 }
-- We use "data_fs" so as to include ()
newtype_constr :: { [RdrNameConDecl] {- Empty if handwritten abstract -} }
newtype_constr : { [] }
- | src_loc '=' ex_stuff data_name atype { [mkConDecl $4 $3 (NewCon $5) $1] }
+ | src_loc '=' ex_stuff data_name atype { [mkConDecl $4 $3 (NewCon $5 Nothing) $1] }
+ | src_loc '=' ex_stuff data_name '{' var_name '::' atype '}'
+ { [mkConDecl $4 $3 (NewCon $8 (Just $6)) $1] }
ex_stuff :: { ([HsTyVar RdrName], RdrNameContext) }
ex_stuff : { ([],[]) }
| class ',' context_list1 { $1 : $3 }
class :: { (RdrName, [RdrNameHsType]) }
-class : qtc_name atypes { ($1, $2) }
+class : qcls_name atypes { ($1, $2) }
types2 :: { [RdrNameHsType] {- Two or more -} }
types2 : type ',' type { [$1,$3] }
atype :: { RdrNameHsType }
atype : qtc_name { MonoTyVar $1 }
| tv_name { MonoTyVar $1 }
- | '(' ')' { MonoTupleTy [] True }
| '(' types2 ')' { MonoTupleTy $2 True{-boxed-} }
| '(#' type '#)' { MonoTupleTy [$2] False{-unboxed-} }
| '(#' types2 '#)' { MonoTupleTy $2 False{-unboxed-} }
| '[' type ']' { MonoListTy $2 }
- | '{' qtc_name atypes '}' { MonoDictTy $2 $3 }
+ | '{' qcls_name atypes '}' { MonoDictTy $2 $3 }
| '(' type ')' { $2 }
+-- This one is dealt with via qtc_name
+-- | '(' ')' { MonoTupleTy [] True }
+
atypes :: { [RdrNameHsType] {- Zero or more -} }
atypes : { [] }
| atype atypes { $1 : $2 }
---------------------------------------------------------------------
+mod_fs :: { EncodedFS }
+ : CONID { $1 }
mod_name :: { Module }
- : CONID { $1 }
+ : mod_fs { mkSysModuleFS $1 hiFile }
+
-var_fs :: { FAST_STRING }
+---------------------------------------------------
+var_fs :: { EncodedFS }
: VARID { $1 }
| VARSYM { $1 }
| '-' { SLIT("-") }
| '!' { SLIT("!") }
-data_fs :: { FAST_STRING }
- : CONID { $1 }
- | CONSYM { $1 }
- | '->' { SLIT("->") }
- | '(' ')' { SLIT("()") }
- | '(' commas ')' { snd (mkTupNameStr $2) }
- | '[' ']' { SLIT("[]") }
-
-commas :: { Int }
- : ',' { 2 }
- | commas ',' { $1 + 1 }
-val_occ :: { OccName }
- : var_fs { VarOcc $1 }
- | data_fs { VarOcc $1 }
+qvar_fs :: { (EncodedFS, EncodedFS, IfaceFlavour) }
+ : QVARID { $1 }
+ | QVARSYM { $1 }
-val_occs :: { [OccName] }
- : val_occ { [$1] }
- | val_occ val_occs { $1 : $2 }
-
-entity_occ :: { OccName }
- : var_fs { VarOcc $1 }
- | data_fs { TCOcc $1 }
+var_occ :: { OccName }
+ : var_fs { mkSysOccFS varName $1 }
var_name :: { RdrName }
-var_name : var_fs { Unqual (VarOcc $1) }
+var_name : var_occ { mkRdrUnqual $1 }
qvar_name :: { RdrName }
qvar_name : var_name { $1 }
- | QVARID { lexVarQual $1 }
- | QVARSYM { lexVarQual $1 }
+ | qvar_fs { mkSysQual varName $1 }
var_names :: { [RdrName] }
var_names : { [] }
var_names1 :: { [RdrName] }
var_names1 : var_name var_names { $1 : $2 }
+---------------------------------------------------
+-- For some bizarre reason,
+-- (,,,) is dealt with by the parser
+-- Foo.(,,,) is dealt with by the lexer
+-- Sigh
+
+data_fs :: { EncodedFS }
+ : CONID { $1 }
+ | CONSYM { $1 }
+
+qdata_fs :: { (EncodedFS, EncodedFS, IfaceFlavour) }
+ : QCONID { $1 }
+ | QCONSYM { $1 }
+
+data_occ :: { OccName }
+ : data_fs { mkSysOccFS dataName $1 }
+
data_name :: { RdrName }
- : CONID { Unqual (VarOcc $1) }
- | CONSYM { Unqual (VarOcc $1) }
- | '(' commas ')' { Unqual (VarOcc (snd (mkTupNameStr $2))) }
- | '[' ']' { Unqual (VarOcc SLIT("[]")) }
+ : data_occ { mkRdrUnqual $1 }
qdata_name :: { RdrName }
qdata_name : data_name { $1 }
- | QCONID { lexVarQual $1 }
- | QCONSYM { lexVarQual $1 }
+ | qdata_fs { mkSysQual dataName $1 }
qdata_names :: { [RdrName] }
qdata_names : { [] }
| qdata_name qdata_names { $1 : $2 }
+var_or_data_name :: { RdrName }
+ : var_name { $1 }
+ | data_name { $1 }
+
+---------------------------------------------------
+tc_fs :: { EncodedFS }
+ : data_fs { $1 }
+
+tc_occ :: { OccName }
+ : tc_fs { mkSysOccFS tcName $1 }
+
tc_name :: { RdrName }
-tc_name : CONID { Unqual (TCOcc $1) }
- | CONSYM { Unqual (TCOcc $1) }
- | '(' '->' ')' { Unqual (TCOcc SLIT("->")) }
- | '(' commas ')' { Unqual (TCOcc (snd (mkTupNameStr $2))) }
- | '[' ']' { Unqual (TCOcc SLIT("[]")) }
+ : tc_occ { mkRdrUnqual $1 }
qtc_name :: { RdrName }
-qtc_name : tc_name { $1 }
- | QCONID { lexTcQual $1 }
- | QCONSYM { lexTcQual $1 }
+ : tc_name { $1 }
+ | qdata_fs { mkSysQual tcName $1 }
+---------------------------------------------------
+cls_name :: { RdrName }
+ : data_fs { mkSysUnqual clsName $1 }
+
+qcls_name :: { RdrName }
+ : cls_name { $1 }
+ | qdata_fs { mkSysQual clsName $1 }
+
+---------------------------------------------------
tv_name :: { RdrName }
-tv_name : VARID { Unqual (TvOcc $1) }
- | VARSYM { Unqual (TvOcc $1) {- Allow t2 as a tyvar -} }
+ : VARID { mkSysUnqual tvName $1 }
+ | VARSYM { mkSysUnqual tvName $1 {- Allow t2 as a tyvar -} }
tv_bndr :: { HsTyVar RdrName }
-tv_bndr : tv_name '::' akind { IfaceTyVar $1 $3 }
- | tv_name { UserTyVar $1 }
+ : tv_name '::' akind { IfaceTyVar $1 $3 }
+ | tv_name { IfaceTyVar $1 boxedTypeKind }
tv_bndrs :: { [HsTyVar RdrName] }
: { [] }
| tv_bndr tv_bndrs { $1 : $2 }
+---------------------------------------------------
kind :: { Kind }
: akind { $1 }
| akind '->' kind { mkArrowKind $1 $3 }
akind :: { Kind }
: VARSYM { if $1 == SLIT("*") then
boxedTypeKind
- else if $1 == SLIT("**") then
+ else if $1 == SLIT("?") then
openTypeKind
else panic "ParseInterface: akind"
}
id_info_item :: { HsIdInfo RdrName }
id_info_item : '__A' arity_info { HsArity $2 }
| strict_info { HsStrictness $1 }
- | '__bot' { HsStrictness HsBottom }
| '__U' core_expr { HsUnfold $1 (Just $2) }
| '__U' { HsUnfold $1 Nothing }
| '__P' spec_tvs
| con_or_primop '{' core_args '}' { UfCon $1 $3 }
| '__litlit' STRING atype { UfCon (UfLitLitCon $2 $3) [] }
- | '__inline' core_expr { UfNote UfInlineCall $2 }
- | '__coerce' atype core_expr { UfNote (UfCoerce $2) $3 }
- | '__scc' core_expr { UfNote (UfSCC $1) $2 }
- | fexpr { $1 }
+ | '__inline' core_expr { UfNote UfInlineCall $2 }
+ | '__coerce' atype core_expr { UfNote (UfCoerce $2) $3 }
+ | scc core_expr { UfNote (UfSCC $1) $2 }
+ | fexpr { $1 }
fexpr :: { UfExpr RdrName }
fexpr : fexpr core_arg { UfApp $1 $2 }
| core_aexpr { $1 }
core_arg :: { UfExpr RdrName }
- : '__a' atype { UfType $2 }
+ : '@' atype { UfType $2 }
| core_aexpr { $1 }
core_args :: { [UfExpr RdrName] }
| core_lit { UfCon (UfLitCon $1) [] }
| '(' core_expr ')' { $2 }
- | '(' ')' { UfTuple (mkTupConRdrName 0) [] }
| '(' comma_exprs2 ')' { UfTuple (mkTupConRdrName (length $2)) $2 }
| '(#' core_expr '#)' { UfTuple (mkUbxTupConRdrName 1) [$2] }
| '(#' comma_exprs2 '#)' { UfTuple (mkUbxTupConRdrName (length $2)) $2 }
+-- This one is dealt with by qdata_name: see above comments
+-- | '(' ')' { UfTuple (mkTupConRdrName 0) [] }
+
comma_exprs2 :: { [UfExpr RdrName] } -- Two or more
comma_exprs2 : core_expr ',' core_expr { [$1,$3] }
| core_expr ',' comma_exprs2 { $1 : $3 }
con_or_primop : qdata_name { UfDataCon $1 }
| qvar_name { UfPrimOp $1 }
| '__ccall' ccall_string { let
- (is_casm, may_gc) = $1
+ (is_dyn, is_casm, may_gc) = $1
in
- UfCCallOp $2 is_casm may_gc
+ UfCCallOp $2 is_dyn is_casm may_gc
}
rec_binds :: { [(UfBinder RdrName, UfExpr RdrName)] }
core_pat : core_lit { (UfLitCon $1, []) }
| '__litlit' STRING atype { (UfLitLitCon $2 $3, []) }
| qdata_name var_names { (UfDataCon $1, $2) }
- | '(' comma_var_names ')' { (UfDataCon (mkTupConRdrName (length $2)), $2) }
+ | '(' comma_var_names1 ')' { (UfDataCon (mkTupConRdrName (length $2)), $2) }
| '(#' comma_var_names1 '#)' { (UfDataCon (mkUbxTupConRdrName (length $2)), $2) }
| '__DEFAULT' { (UfDefault, []) }
| '(' core_pat ')' { $2 }
-comma_var_names :: { [RdrName] } -- Zero, or two or more
-comma_var_names : { [] }
- | var_name ',' comma_var_names1 { $1 : $3 }
-
comma_var_names1 :: { [RdrName] } -- One or more
comma_var_names1 : var_name { [$1] }
| var_name ',' comma_var_names1 { $1 : $3 }
core_val_bndr : var_name '::' atype { UfValBinder $1 $3 }
core_tv_bndr :: { UfBinder RdrName }
-core_tv_bndr : '__a' tv_name '::' akind { UfTyBinder $2 $4 }
- | '__a' tv_name { UfTyBinder $2 boxedTypeKind }
+core_tv_bndr : '@' tv_name '::' akind { UfTyBinder $2 $4 }
+ | '@' tv_name { UfTyBinder $2 boxedTypeKind }
ccall_string :: { FAST_STRING }
: STRING { $1 }
| VARID { $1 }
| CONID { $1 }
+------------------------------------------------------------------------
+scc :: { CostCentre }
+ : '__sccC' '{' mod_name STRING '}' { AllCafsCC $3 $4 }
+ | '__sccD' '{' mod_name STRING cc_dup '}' { AllDictsCC $3 $4 $5 }
+ | '__scc' '(' cc_name mod_name STRING cc_dict cc_dup cc_caf '}'
+ { NormalCC { cc_name = $3, cc_mod = $4, cc_grp = $5,
+ cc_is_dict = $6, cc_is_dupd = $7, cc_is_caf = $8 } }
+
+cc_name :: { EncodedFS }
+ : CONID { $1 }
+ | VARID { $1 }
+
+cc_dup :: { IsDupdCC }
+cc_dup : { OriginalCC }
+ | '!' { DupdCC }
+
+cc_caf :: { IsCafCC }
+ : { NotCafCC }
+ | '__C' { CafCC }
+
+cc_dict :: { IsDictCC }
+ : { VanillaCC }
+ | '__A' { DictCC }
+
+
-------------------------------------------------------------------
src_loc :: { SrcLoc }
-- Haskell code
{
-data IfaceStuff = PIface ParsedIface
+data IfaceStuff = PIface EncodedFS{-.hi module name-} ParsedIface
| PIdInfo [HsIdInfo RdrName]
| PType RdrNameHsType