[project @ 2000-10-24 08:40:09 by simonpj]
[ghc-hetmet.git] / ghc / compiler / rename / ParseIface.y
index cf0bf83..a51631f 100644 (file)
@@ -43,37 +43,31 @@ import BasicTypes   ( Fixity(..), FixityDirection(..),
                        )
 import CostCentre       ( CostCentre(..), IsCafCC(..), IsDupdCC(..) )
 import CallConv         ( cCallConv )
-import HsPragmas       ( noDataPragmas, noClassPragmas )
-import Type            ( Kind, mkArrowKind, boxedTypeKind, openTypeKind, UsageAnn(..) )
-import IdInfo           ( ArityInfo, exactArity, CprInfo(..), InlinePragInfo(..) )
+import Type            ( Kind, mkArrowKind, boxedTypeKind, openTypeKind )
+import IdInfo           ( exactArity, InlinePragInfo(..) )
 import PrimOp           ( CCall(..), CCallTarget(..) )
 import Lex             
 
-import RnMonad         ( ImportVersion, ParsedIface(..), WhatsImported(..),
-                         RdrNamePragma, ExportItem, RdrAvailInfo, GenAvailInfo(..), 
-                          WhetherHasOrphans, IsBootInterface
-                       ) 
-import Bag             ( emptyBag, unitBag, snocBag )
-import FiniteMap       ( emptyFM, unitFM, addToFM, plusFM, bagToFM, FiniteMap )
-import RdrName          ( RdrName, mkRdrUnqual, mkSysQual, mkSysUnqual, mkRdrNameWkr )
-import Name            ( OccName, Provenance )
+import RnMonad         ( ParsedIface(..), ExportItem, IfaceDeprecs ) 
+import HscTypes         ( WhetherHasOrphans, IsBootInterface, GenAvailInfo(..), 
+                          ImportVersion, WhatsImported(..),
+                          RdrAvailInfo )
+
+import RdrName          ( RdrName, mkRdrUnqual, mkSysQual, mkSysUnqual )
+import Name            ( OccName )
 import OccName          ( mkSysOccFS,
                          tcName, varName, ipName, dataName, clsName, tvName, uvName,
                          EncodedFS 
                        )
-import Module           ( ModuleName, PackageName, mkSysModuleFS, mkModule )                   
+import Module           ( ModuleName, PackageName, mkSysModuleNameFS, mkModule )
 import SrcLoc          ( SrcLoc )
 import CmdLineOpts     ( opt_InPackage )
-import Maybes
 import Outputable
 import List            ( insert )
+import Class            ( DefMeth (..) )
 
 import GlaExts
 import FastString      ( tailFS )
-
-#if __HASKELL1__ > 4
-import Ratio ( (%) )
-#endif
 }
 
 %name      parseIface
@@ -134,6 +128,7 @@ import Ratio ( (%) )
  '__word64'    { ITword64_lit }
  '__rational'  { ITrational_lit }
  '__addr'      { ITaddr_lit }
+ '__label'     { ITlabel_lit }
  '__litlit'    { ITlit_lit }
  '__string'    { ITstring_lit }
  '__ccall'     { ITccall $$ }
@@ -169,6 +164,8 @@ import Ratio ( (%) )
 
  '{'           { ITocurly }                    -- special symbols
  '}'           { ITccurly }
+ '{|'          { ITocurlybar }                         -- special symbols
+ '|}'          { ITccurlybar }                         -- special symbols
  '['           { ITobrack }
  ']'           { ITcbrack }
  '('           { IToparen }
@@ -209,9 +206,7 @@ iface_stuff :: { IfaceStuff }
 iface_stuff : iface            { PIface   $1 }
            | type              { PType    $1 }
            | id_info           { PIdInfo  $1 }
-           | '__R' rules       { PRules   $2 }
-           | '__D' deprecs     { PDeprecs $2 }
-
+           | rules_and_deprecs { PRulesAndDeprecs $1 }
 
 iface          :: { ParsedIface }
 iface          : '__interface' package mod_name 
@@ -222,21 +217,21 @@ iface             : '__interface' package mod_name
                  fix_decl_part
                  instance_decl_part
                  decls_part
-                 rules_and_deprecs
+                 rules_and_deprecs_part
                  { ParsedIface {
                        pi_mod  = mkModule $3 $2,       -- Module itself
                        pi_vers = $4,                   -- Module version
                        pi_orphan  = $6,
-                       pi_exports = $9,                -- Exports
+                       pi_exports = (fst $5, $9),      -- Exports
                        pi_usages  = $10,               -- Usages
-                       pi_fixity  = (fst $5,$11),      -- Fixies
+                       pi_fixity  = $11,               -- Fixies
                        pi_insts   = $12,               -- Local instances
                        pi_decls   = $13,               -- Decls
                        pi_rules   = (snd $5,fst $14),  -- Rules 
                        pi_deprecs = snd $14            -- Deprecations 
                   } }
 
--- Versions for fixities and rules (optional)
+-- Versions for exports and rules (optional)
 sub_versions :: { (Version,Version) }
        : '[' version version ']'               { ($2,$3) }
        | {- empty -}                           { (initialVersion, initialVersion) }
@@ -249,7 +244,7 @@ import_part :                                                 { [] }
            
 import_decl :: { ImportVersion OccName }
 import_decl : 'import' mod_name orphans is_boot whats_imported ';'
-                       { (mkSysModuleFS $2, $3, $4, $5) }
+                       { ({-mkSysModuleNameFS-} $2, $3, $4, $5) }
 
 orphans                    :: { WhetherHasOrphans }
 orphans                    :                                           { False }
@@ -262,7 +257,7 @@ is_boot                 :                                           { False }
 whats_imported      :: { WhatsImported OccName }
 whats_imported      :                                                  { NothingAtAll }
                    | '::' version                                      { Everything $2 }
-                    | '::' version version version name_version_pairs   { Specifically $2 $3 $4 $5 }
+                    | '::' version version name_version_pairs version  { Specifically $2 (Just $3) $4 $5 }
 
 name_version_pairs  :: { [(OccName, Version)] }
 name_version_pairs  :                                                  { [] }
@@ -278,7 +273,7 @@ name_version_pair   :  var_occ version                              { ($1, $2) }
 exports_part   :: { [ExportItem] }
 exports_part   :                                       { [] }
                | '__export' mod_name entities ';'
-                       exports_part                    { (mkSysModuleFS $2, $3) : $5 }
+                       exports_part                    { ({-mkSysModuleNameFS-} $2, $3) : $5 }
 
 entities       :: { [RdrAvailInfo] }
 entities       :                                       { [] }
@@ -338,8 +333,10 @@ csigs1             :                               { [] }
                | csig ';' csigs1               { $1 : $3 }
 
 csig           :: { RdrNameSig }
-csig           :  src_loc var_name '::' type           { mkClassOpSig False $2 $4 $1 }
-               |  src_loc var_name '=' '::' type       { mkClassOpSig True  $2 $5 $1 }
+csig           :  src_loc var_name '::' type           { mkClassOpSig NoDefMeth $2 $4 $1 }
+               |  src_loc var_name '=' '::' type       { mkClassOpSig (DefMeth (error "DefMeth") )
+                                                               $2 $5 $1 }
+               |  src_loc var_name ';' '::' type       { mkClassOpSig GenDefMeth  $2 $5 $1 }           
 
 --------------------------------------------------------------------------
 
@@ -352,7 +349,7 @@ inst_decl   :  src_loc 'instance' type '=' var_name ';'
                        { InstDecl $3
                                   EmptyMonoBinds       {- No bindings -}
                                   []                   {- No user pragmas -}
-                                  $5                   {- Dfun id -}
+                                  (Just $5)            {- Dfun id -}
                                   $1
                        }
 
@@ -369,12 +366,11 @@ decl    : src_loc var_name '::' type maybe_idinfo
        | src_loc 'type' tc_name tv_bndrs '=' type                     
                        { TyClD (TySynonym $3 $4 $6 $1) }
        | src_loc 'data' opt_decl_context tc_name tv_bndrs constrs             
-                       { TyClD (TyData DataType $3 $4 $5 $6 (length $6) Nothing noDataPragmas $1) }
+                       { TyClD (mkTyData DataType $3 $4 $5 $6 (length $6) Nothing $1) }
        | src_loc 'newtype' opt_decl_context tc_name tv_bndrs newtype_constr
-                       { TyClD (TyData NewType $3 $4 $5 $6 1 Nothing noDataPragmas $1) }
+                       { TyClD (mkTyData NewType $3 $4 $5 $6 1 Nothing $1) }
        | src_loc 'class' opt_decl_context tc_name tv_bndrs fds csigs
-                       { TyClD (mkClassDecl $3 $4 $5 $6 $7 EmptyMonoBinds 
-                                       noClassPragmas $1) }
+                       { TyClD (mkClassDecl $3 $4 $5 $6 $7 EmptyMonoBinds $1) }
 
 maybe_idinfo  :: { RdrName -> [HsIdInfo RdrName] }
 maybe_idinfo  : {- empty -}    { \_ -> [] }
@@ -394,26 +390,23 @@ pragma    : src_loc PRAGMA        { parseIface $2 PState{ bol = 0#, atbol = 1#,
 
 -----------------------------------------------------------------------------
 
-rules_and_deprecs :: { ([RdrNameRuleDecl], [RdrNameDeprecation]) }
-rules_and_deprecs : {- empty -}        { ([], []) }
-                 | rules_and_deprecs rule_or_deprec
-                               { let
-                                    append2 (xs1,ys1) (xs2,ys2) =
-                                       (xs1 `app` xs2, ys1 `app` ys2)
-                                    xs `app` [] = xs -- performance paranoia
-                                    xs `app` ys = xs ++ ys
-                                 in append2 $1 $2
-                               }
+rules_and_deprecs_part :: { ([RdrNameRuleDecl], IfaceDeprecs) }
+rules_and_deprecs_part : {- empty -}   { ([], Nothing) }
+                      | pragma         { case $1 of
+                                            POk _ (PRulesAndDeprecs rds) -> rds
+                                            PFailed err -> pprPanic "Rules/Deprecations parse failed" err
+                                       }
 
-rule_or_deprec :: { ([RdrNameRuleDecl], [RdrNameDeprecation]) }
-rule_or_deprec : pragma        { case $1 of
-                            POk _ (PRules   rules)   -> (rules,[])
-                            POk _ (PDeprecs deprecs) -> ([],deprecs)
-                            PFailed err -> pprPanic "Rules/Deprecations parse failed" err
-                       }
+rules_and_deprecs :: { ([RdrNameRuleDecl], IfaceDeprecs) }
+rules_and_deprecs : rule_prag deprec_prag      { ($1, $2) }
 
 -----------------------------------------------------------------------------
 
+rule_prag :: { [RdrNameRuleDecl] }
+rule_prag : {- empty -}                        { [] }
+         | '__R' rules                 { $2 }
+
 rules     :: { [RdrNameRuleDecl] }
           : {- empty -}        { [] }
           | rule ';' rules     { $1:$3 }
@@ -427,18 +420,24 @@ rule_forall       : '__forall' '{' core_bndrs '}' { $3 }
                  
 -----------------------------------------------------------------------------
 
-deprecs        :: { [RdrNameDeprecation] }
-deprecs                : {- empty -}           { [] }
-               | deprec ';' deprecs    { $1 : $3 }
+deprec_prag    :: { IfaceDeprecs }
+deprec_prag    : {- empty -}           { Nothing }
+               | '__D' deprecs         { Just $2 } 
+
+deprecs        :: { Either DeprecTxt [(RdrName,DeprecTxt)] }
+deprecs                : STRING                { Left $1 }
+               | deprec_list           { Right $1 }
 
-deprec         :: { RdrNameDeprecation }
-deprec         : src_loc STRING                { Deprecation (IEModuleContents undefined) $2 $1 }
-               | src_loc deprec_name STRING    { Deprecation $2 $3 $1 }
+deprec_list    :: { [(RdrName,DeprecTxt)] }
+deprec_list    : deprec                        { [$1] }
+               | deprec ';' deprec_list        { $1 : $3 }
 
--- SUP: TEMPORARY HACK
-deprec_name    :: { RdrNameIE }
-               : var_name              { IEVar      $1 }
-               | data_name             { IEThingAbs $1 }
+deprec         :: { (RdrName,DeprecTxt) }
+deprec         : deprec_name STRING    { ($1, $2) }
+
+deprec_name    :: { RdrName }
+               : var_name              { $1 }
+               | tc_name               { $1 }
 
 -----------------------------------------------------------------------------
 
@@ -468,11 +467,10 @@ constr            :  src_loc ex_stuff data_name batypes           { mk_con_decl $3 $2 (VanillaCon $
                |  src_loc ex_stuff data_name '{' fields1 '}'   { mk_con_decl $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  { [mk_con_decl $4 $3 (NewCon $5 Nothing) $1] }
+newtype_constr :: { [RdrNameConDecl] {- Not allowed to be empty -} }
+newtype_constr : src_loc '=' ex_stuff data_name atype  { [mk_con_decl $4 $3 (VanillaCon [Unbanged $5]) $1] }
                | src_loc '=' ex_stuff data_name '{' var_name '::' atype '}'
-                                                       { [mk_con_decl $4 $3 (NewCon $8 (Just $6)) $1] }
+                                                       { [mk_con_decl $4 $3 (RecCon [([$6], Unbanged $8)]) $1] }
 
 ex_stuff :: { ([HsTyVarBndr RdrName], RdrNameContext) }
 ex_stuff       :                                       { ([],[]) }
@@ -564,7 +562,7 @@ package             :: { PackageName }
                                                                -- Module loops are always within a package
 
 mod_name       :: { ModuleName }
-               :  CONID                { mkSysModuleFS $1 }
+               :  CONID                { mkSysModuleNameFS $1 }
 
 
 ---------------------------------------------------
@@ -632,10 +630,6 @@ qdata_name :: { RdrName }
 qdata_name     :  data_name            { $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 }
@@ -723,7 +717,7 @@ akind               :: { Kind }
 --------------------------------------------------------------------------
 
 id_info                :: { [HsIdInfo RdrName] }
-               :                               { [] }
+               : id_info_item                  { [$1] }
                | id_info_item id_info          { $1 : $2 }
 
 id_info_item   :: { HsIdInfo RdrName }
@@ -857,6 +851,7 @@ core_lit    : integer                       { mkMachInt $1 }
                | '__int64' integer             { mkMachInt64 $2 }
                | '__float' rational            { MachFloat $2 }
                | '__addr' integer              { MachAddr $2 }
+               | '__label' STRING              { MachLabel $2 }
 
 integer                :: { Integer }
                : INTEGER                       { $1 }
@@ -925,11 +920,10 @@ checkVersion :: { () }
 happyError :: P a
 happyError buf PState{ loc = loc } = PFailed (ifaceParseErr buf loc)
 
-data IfaceStuff = PIface       ParsedIface
-               | PIdInfo       [HsIdInfo RdrName]
-               | PType         RdrNameHsType
-               | PRules        [RdrNameRuleDecl]
-               | PDeprecs      [RdrNameDeprecation]
+data IfaceStuff = PIface          ParsedIface
+               | PIdInfo          [HsIdInfo RdrName]
+               | PType            RdrNameHsType
+               | PRulesAndDeprecs ([RdrNameRuleDecl], IfaceDeprecs)
 
 mk_con_decl name (ex_tvs, ex_ctxt) details loc = mkConDecl name ex_tvs ex_ctxt details loc
 }