X-Git-Url: http://git.megacz.com/?p=ghc-hetmet.git;a=blobdiff_plain;f=compiler%2FhsSyn%2FHsDecls.lhs;h=6d49bd84332f501064385789d1d18b8903dbf524;hp=f2bf9d3904e6388716397e2ba555b9bb597ff038;hb=84923cc7de2a93c22a2f72daf9ac863959efae13;hpb=72264dbcb05c7045dff28aa88b55634fa6c1ddf0 diff --git a/compiler/hsSyn/HsDecls.lhs b/compiler/hsSyn/HsDecls.lhs index f2bf9d3..6d49bd8 100644 --- a/compiler/hsSyn/HsDecls.lhs +++ b/compiler/hsSyn/HsDecls.lhs @@ -1,7 +1,9 @@ % +% (c) The University of Glasgow 2006 % (c) The GRASP/AQUA Project, Glasgow University, 1992-1998 % -\section[HsDecls]{Abstract syntax: global declarations} + +HsDecls: Abstract syntax: global declarations Definitions for: @TyDecl@ and @oCnDecl@, @ClassDecl@, @InstDecl@, @DefaultDecl@ and @ForeignDecl@. @@ -9,16 +11,18 @@ Definitions for: @TyDecl@ and @oCnDecl@, @ClassDecl@, \begin{code} module HsDecls ( HsDecl(..), LHsDecl, TyClDecl(..), LTyClDecl, - InstDecl(..), LInstDecl, NewOrData(..), + InstDecl(..), LInstDecl, DerivDecl(..), LDerivDecl, NewOrData(..), RuleDecl(..), LRuleDecl, RuleBndr(..), DefaultDecl(..), LDefaultDecl, SpliceDecl(..), ForeignDecl(..), LForeignDecl, ForeignImport(..), ForeignExport(..), CImportSpec(..), FoType(..), ConDecl(..), ResType(..), LConDecl, + DocDecl(..), LDocDecl, docDeclDoc, DocEntity(..), DeprecDecl(..), LDeprecDecl, HsGroup(..), emptyRdrGroup, emptyRnGroup, appendGroups, tcdName, tyClDeclNames, tyClDeclTyVars, - isClassDecl, isTFunDecl, isSynDecl, isTEqnDecl, isDataDecl, + isClassDecl, isTFunDecl, isSynDecl, isDataDecl, isKindSigDecl, + isIdxTyDecl, countTyClDecls, conDetailsTys, instDeclATs, @@ -31,29 +35,26 @@ module HsDecls ( import {-# SOURCE #-} HsExpr( HsExpr, pprExpr ) -- Because Expr imports Decls via HsBracket -import HsBinds ( HsValBinds(..), HsBind, LHsBinds, plusHsValBinds, - Sig(..), LSig, LFixitySig, pprLHsBinds, - emptyValBindsIn, emptyValBindsOut ) -import HsPat ( HsConDetails(..), hsConArgs ) -import HsImpExp ( pprHsVar ) +import HsBinds +import HsPat +import HsImpExp import HsTypes -import NameSet ( NameSet ) -import HscTypes ( DeprecTxt ) -import CoreSyn ( RuleName ) -import Kind ( Kind, pprKind ) -import BasicTypes ( Activation(..) ) -import ForeignCall ( CCallTarget(..), DNCallSpec, CCallConv, Safety, - CExportSpec(..), CLabelString ) +import HsDoc +import NameSet +import CoreSyn +import {- Kind parts of -} Type +import BasicTypes +import ForeignCall -- others: -import FunDeps ( pprFundeps ) -import Class ( FunDep ) +import Class import Outputable -import Util ( count ) -import SrcLoc ( Located(..), unLoc, noLoc ) +import Util +import SrcLoc import FastString -\end{code} +import Data.Maybe ( isJust ) +\end{code} %************************************************************************ %* * @@ -67,6 +68,7 @@ type LHsDecl id = Located (HsDecl id) data HsDecl id = TyClD (TyClDecl id) | InstD (InstDecl id) + | DerivD (DerivDecl id) | ValD (HsBind id) | SigD (Sig id) | DefD (DefaultDecl id) @@ -74,6 +76,8 @@ data HsDecl id | DeprecD (DeprecDecl id) | RuleD (RuleDecl id) | SpliceD (SpliceDecl id) + | DocD (DocDecl id) + -- NB: all top-level fixity decls are contained EITHER -- EITHER SigDs @@ -95,6 +99,7 @@ data HsGroup id hs_valds :: HsValBinds id, hs_tyclds :: [LTyClDecl id], hs_instds :: [LInstDecl id], + hs_derivds :: [LDerivDecl id], hs_fixds :: [LFixitySig id], -- Snaffled out of both top-level fixity signatures, @@ -103,17 +108,22 @@ data HsGroup id hs_defds :: [LDefaultDecl id], hs_fords :: [LForeignDecl id], hs_depds :: [LDeprecDecl id], - hs_ruleds :: [LRuleDecl id] + hs_ruleds :: [LRuleDecl id], + + hs_docs :: [DocEntity id] + -- Used to remember the module structure, + -- which is needed to produce Haddock documentation } emptyGroup, emptyRdrGroup, emptyRnGroup :: HsGroup a emptyRdrGroup = emptyGroup { hs_valds = emptyValBindsIn } emptyRnGroup = emptyGroup { hs_valds = emptyValBindsOut } -emptyGroup = HsGroup { hs_tyclds = [], hs_instds = [], +emptyGroup = HsGroup { hs_tyclds = [], hs_instds = [], hs_derivds = [], hs_fixds = [], hs_defds = [], hs_fords = [], hs_depds = [], hs_ruleds = [], - hs_valds = error "emptyGroup hs_valds: Can't happen" } + hs_valds = error "emptyGroup hs_valds: Can't happen", + hs_docs = [] } appendGroups :: HsGroup a -> HsGroup a -> HsGroup a appendGroups @@ -121,48 +131,57 @@ appendGroups hs_valds = val_groups1, hs_tyclds = tyclds1, hs_instds = instds1, + hs_derivds = derivds1, hs_fixds = fixds1, hs_defds = defds1, hs_fords = fords1, hs_depds = depds1, - hs_ruleds = rulds1 } + hs_ruleds = rulds1, + hs_docs = docs1 } HsGroup { hs_valds = val_groups2, hs_tyclds = tyclds2, hs_instds = instds2, + hs_derivds = derivds2, hs_fixds = fixds2, hs_defds = defds2, hs_fords = fords2, hs_depds = depds2, - hs_ruleds = rulds2 } + hs_ruleds = rulds2, + hs_docs = docs2 } = HsGroup { hs_valds = val_groups1 `plusHsValBinds` val_groups2, hs_tyclds = tyclds1 ++ tyclds2, hs_instds = instds1 ++ instds2, + hs_derivds = derivds1 ++ derivds2, hs_fixds = fixds1 ++ fixds2, hs_defds = defds1 ++ defds2, hs_fords = fords1 ++ fords2, hs_depds = depds1 ++ depds2, - hs_ruleds = rulds1 ++ rulds2 } + hs_ruleds = rulds1 ++ rulds2, + hs_docs = docs1 ++ docs2 } \end{code} \begin{code} instance OutputableBndr name => Outputable (HsDecl name) where - ppr (TyClD dcl) = ppr dcl - ppr (ValD binds) = ppr binds - ppr (DefD def) = ppr def - ppr (InstD inst) = ppr inst - ppr (ForD fd) = ppr fd - ppr (SigD sd) = ppr sd - ppr (RuleD rd) = ppr rd - ppr (DeprecD dd) = ppr dd - ppr (SpliceD dd) = ppr dd + ppr (TyClD dcl) = ppr dcl + ppr (ValD binds) = ppr binds + ppr (DefD def) = ppr def + ppr (InstD inst) = ppr inst + ppr (DerivD deriv) = ppr deriv + ppr (ForD fd) = ppr fd + ppr (SigD sd) = ppr sd + ppr (RuleD rd) = ppr rd + ppr (DeprecD dd) = ppr dd + ppr (SpliceD dd) = ppr dd + ppr (DocD doc) = ppr doc instance OutputableBndr name => Outputable (HsGroup name) where ppr (HsGroup { hs_valds = val_decls, hs_tyclds = tycl_decls, hs_instds = inst_decls, + hs_derivds = deriv_decls, hs_fixds = fix_decls, hs_depds = deprec_decls, hs_fords = foreign_decls, @@ -172,6 +191,7 @@ instance OutputableBndr name => Outputable (HsGroup name) where ppr_ds deprec_decls, ppr_ds rule_decls, ppr val_decls, ppr_ds tycl_decls, ppr_ds inst_decls, + ppr_ds deriv_decls, ppr_ds foreign_decls] where ppr_ds [] = empty @@ -324,10 +344,30 @@ Interface file code: \begin{code} --- TyClDecls are precisely the kind of declarations that can --- appear in interface files; or (internally) in GHC's interface --- for a module. That's why (despite the misnomer) IfaceSig and ForeignType --- are both in TyClDecl +-- Representation of indexed types +-- ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +-- Kind signatures of indexed types come in two flavours: +-- +-- * kind signatures for type functions: variant `TyFunction' and +-- +-- * kind signatures for indexed data types and newtypes : variant `TyData' +-- iff a kind is present in `tcdKindSig' and there are no constructors in +-- `tcdCons'. +-- +-- Indexed types are represented by 'TyData' and 'TySynonym' using the field +-- 'tcdTyPats::Maybe [LHsType name]', with the following meaning: +-- +-- * If it is 'Nothing', we have a *vanilla* data type declaration or type +-- synonym declaration and 'tcdVars' contains the type parameters of the +-- type constructor. +-- +-- * If it is 'Just pats', we have the definition of an indexed type Then, +-- 'pats' are type patterns for the type-indexes of the type constructor +-- and 'tcdVars' are the variables in those patterns. Hence, the arity of +-- the indexed type (ie, the number of indexes) is 'length tcdTyPats' and +-- *not* 'length tcdVars'. +-- +-- In both cases, 'tcdVars' collects all variables we need to quantify over. type LTyClDecl name = Located (TyClDecl name) @@ -341,10 +381,20 @@ data TyClDecl name | TyData { tcdND :: NewOrData, tcdCtxt :: LHsContext name, -- Context tcdLName :: Located name, -- Type constructor + tcdTyVars :: [LHsTyVarBndr name], -- Type variables + tcdTyPats :: Maybe [LHsType name], -- Type patterns - tcdKindSig:: Maybe Kind, -- Optional kind sig; - -- (only for the 'where' form) + -- Just [t1..tn] for data instance T t1..tn = ... + -- in this case tcdTyVars = fv( tcdTyPats ) + -- Nothing for everything else + + tcdKindSig:: Maybe Kind, -- Optional kind sig + -- (Just k) for + -- (a) GADT-style data type decls with user kind sig + -- (b) 'data instance' decls with user kind sig + -- (c) 'data family' decls, whether or not there is a kind sig + -- (this is how we distinguish a data family decl) tcdCons :: [LConDecl name], -- Data constructors -- For data T a = T1 | T2 a the LConDecls all have ResTyH98 @@ -358,16 +408,22 @@ data TyClDecl name -- Typically the foralls and ty args are empty, but they -- are non-empty for the newtype-deriving case } + -- data family: tcdPats = Nothing, tcdCons = [], tcdKindSig = Just k + -- data instance: tcdPats = Just tys + -- data: tcdPats = Nothing, tcdCons is non-empty | TyFunction {tcdLName :: Located name, -- type constructor tcdTyVars :: [LHsTyVarBndr name], -- type variables tcdIso :: Bool, -- injective type? - tcdKindSig:: Maybe Kind -- result kind + tcdKind :: Kind -- result kind } | TySynonym { tcdLName :: Located name, -- type constructor tcdTyVars :: [LHsTyVarBndr name], -- type variables tcdTyPats :: Maybe [LHsType name], -- Type patterns + -- See comments for tcdTyPats in TyData + -- 'Nothing' => vanilla type synonym + tcdSynRhs :: LHsType name -- synonym expansion } @@ -377,9 +433,11 @@ data TyClDecl name tcdFDs :: [Located (FunDep name)], -- Functional deps tcdSigs :: [LSig name], -- Methods' signatures tcdMeths :: LHsBinds name, -- Default methods - tcdATs :: [LTyClDecl name] -- Associated types; ie - -- only 'TyData' + tcdATs :: [LTyClDecl name], -- Associated types; ie + -- only 'TyData', + -- 'TyFunction', -- and 'TySynonym' + tcdDocs :: [DocEntity name] -- Haddock docs } data NewOrData @@ -391,7 +449,7 @@ data NewOrData Simple classifiers \begin{code} -isTFunDecl, isDataDecl, isSynDecl, isTEqnDecl, isClassDecl :: +isTFunDecl, isDataDecl, isSynDecl, isClassDecl, isKindSigDecl, isIdxTyDecl :: TyClDecl name -> Bool -- type function kind signature @@ -411,6 +469,18 @@ isDataDecl other = False isClassDecl (ClassDecl {}) = True isClassDecl other = False + +-- kind signature (for an indexed type) +isKindSigDecl (TyFunction {} ) = True +isKindSigDecl (TyData {tcdKindSig = Just _, + tcdCons = [] }) = True +isKindSigDecl other = False + +-- definition of an instance of an indexed type +isIdxTyDecl tydecl + | isTEqnDecl tydecl = True + | isDataDecl tydecl = isJust (tcdTyPats tydecl) + | otherwise = False \end{code} Dealing with names @@ -426,9 +496,7 @@ tyClDeclNames :: Eq name => TyClDecl name -> [Located name] -- We use the equality to filter out duplicate field names tyClDeclNames (TyFunction {tcdLName = name}) = [name] -tyClDeclNames (TySynonym {tcdLName = name, - tcdTyPats= Nothing}) = [name] -tyClDeclNames (TySynonym {} ) = [] -- type equation +tyClDeclNames (TySynonym {tcdLName = name}) = [name] tyClDeclNames (ForeignType {tcdLName = name}) = [name] tyClDeclNames (ClassDecl {tcdLName = cls_name, tcdSigs = sigs, tcdATs = ats}) @@ -472,27 +540,28 @@ instance OutputableBndr name = hsep [ptext SLIT("foreign import type dotnet"), ppr ltycon] ppr (TyFunction {tcdLName = ltycon, tcdTyVars = tyvars, tcdIso = iso, - tcdKindSig = mb_sig}) + tcdKind = kind}) = typeMaybeIso <+> pp_decl_head [] ltycon tyvars Nothing <+> - ppr_sig mb_sig + dcolon <+> pprKind kind where typeMaybeIso = if iso - then ptext SLIT("type iso") - else ptext SLIT("type") - - ppr_sig Nothing = empty - ppr_sig (Just kind) = dcolon <+> pprKind kind + then ptext SLIT("type family iso") + else ptext SLIT("type family") ppr (TySynonym {tcdLName = ltycon, tcdTyVars = tyvars, tcdTyPats = typats, tcdSynRhs = mono_ty}) - = hang (ptext SLIT("type") <+> pp_decl_head [] ltycon tyvars typats <+> + = hang (ptext SLIT("type") <+> + (if isJust typats then ptext SLIT("instance") else empty) <+> + pp_decl_head [] ltycon tyvars typats <+> equals) 4 (ppr mono_ty) ppr (TyData {tcdND = new_or_data, tcdCtxt = context, tcdLName = ltycon, tcdTyVars = tyvars, tcdTyPats = typats, tcdKindSig = mb_sig, tcdCons = condecls, tcdDerivs = derivings}) - = pp_tydecl (ppr new_or_data <+> + = pp_tydecl (null condecls && isJust mb_sig) + (ppr new_or_data <+> + (if isJust typats then ptext SLIT("instance") else empty) <+> pp_decl_head (unLoc context) ltycon tyvars typats <+> ppr_sig mb_sig) (pp_condecls condecls) @@ -536,12 +605,14 @@ pp_condecls cs@(L _ ConDecl{ con_res = ResTyGADT _ } : _) -- In GADT syntax pp_condecls cs -- In H98 syntax = equals <+> sep (punctuate (ptext SLIT(" |")) (map ppr cs)) -pp_tydecl pp_head pp_decl_rhs derivings +pp_tydecl True pp_head pp_decl_rhs derivings + = pp_head +pp_tydecl False pp_head pp_decl_rhs derivings = hang pp_head 4 (sep [ - pp_decl_rhs, - case derivings of - Nothing -> empty - Just ds -> hsep [ptext SLIT("deriving"), parens (interpp'SP ds)] + pp_decl_rhs, + case derivings of + Nothing -> empty + Just ds -> hsep [ptext SLIT("deriving"), parens (interpp'SP ds)] ]) instance Outputable NewOrData where @@ -587,6 +658,8 @@ data ConDecl name , con_details :: HsConDetails name (LBangType name) -- The main payload , con_res :: ResType name -- Result type of the constructor + + , con_doc :: Maybe (LHsDoc name) -- A possible Haddock comment } data ResType name @@ -606,7 +679,7 @@ conDeclsNames cons do_one (flds_seen, acc) (ConDecl { con_name = lname, con_details = RecCon flds }) = (map unLoc new_flds ++ flds_seen, lname : [f | f <- new_flds] ++ acc) where - new_flds = [ f | (f,_) <- flds, not (unLoc f `elem` flds_seen) ] + new_flds = [ f | (HsRecField f _ _) <- flds, not (unLoc f `elem` flds_seen) ] do_one (flds_seen, acc) c = (flds_seen, (con_name c):acc) @@ -619,23 +692,23 @@ conDetailsTys details = map getBangType (hsConArgs details) instance (OutputableBndr name) => Outputable (ConDecl name) where ppr = pprConDecl -pprConDecl (ConDecl con expl tvs cxt details ResTyH98) - = sep [pprHsForAll expl tvs cxt, ppr_details con details] +pprConDecl (ConDecl con expl tvs cxt details ResTyH98 doc) + = sep [ppr_mbDoc doc, pprHsForAll expl tvs cxt, ppr_details con details] where ppr_details con (InfixCon t1 t2) = hsep [ppr t1, pprHsVar con, ppr t2] ppr_details con (PrefixCon tys) = hsep (pprHsVar con : map ppr tys) ppr_details con (RecCon fields) = ppr con <+> ppr_fields fields -pprConDecl (ConDecl con expl tvs cxt (PrefixCon arg_tys) (ResTyGADT res_ty)) +pprConDecl (ConDecl con expl tvs cxt (PrefixCon arg_tys) (ResTyGADT res_ty) _) = ppr con <+> dcolon <+> sep [pprHsForAll expl tvs cxt, ppr (foldr mk_fun_ty res_ty arg_tys)] where mk_fun_ty a b = noLoc (HsFunTy a b) -pprConDecl (ConDecl con expl tvs cxt (RecCon fields) (ResTyGADT res_ty)) - = sep [pprHsForAll expl tvs cxt, ppr con <+> ppr fields <+> dcolon <+> ppr res_ty] -ppr_fields fields = braces (sep (punctuate comma (map ppr_field fields))) -ppr_field (n, ty) = ppr n <+> dcolon <+> ppr ty +pprConDecl (ConDecl con expl tvs cxt (RecCon fields) (ResTyGADT res_ty) _) + = sep [pprHsForAll expl tvs cxt, ppr con <+> ppr_fields fields <+> dcolon <+> ppr res_ty] + +ppr_fields fields = braces (sep (punctuate comma (map ppr fields))) \end{code} %************************************************************************ @@ -653,7 +726,8 @@ data InstDecl name -- figures out the quantified type variables for us. (LHsBinds name) [LSig name] -- User-supplied pragmatic info - [LTyClDecl name]-- Associated types + [LTyClDecl name]-- Associated types (ie, 'TyData' and + -- 'TySynonym' only) instance (OutputableBndr name) => Outputable (InstDecl name) where @@ -671,6 +745,22 @@ instDeclATs (InstDecl _ _ _ ats) = ats %************************************************************************ %* * +\subsection[DerivDecl]{A stand-alone instance deriving declaration +%* * +%************************************************************************ + +\begin{code} +type LDerivDecl name = Located (DerivDecl name) + +data DerivDecl name = DerivDecl (LHsType name) + +instance (OutputableBndr name) => Outputable (DerivDecl name) where + ppr (DerivDecl ty) + = hsep [ptext SLIT("derived instance"), ppr ty] +\end{code} + +%************************************************************************ +%* * \subsection[DefaultDecl]{A @default@ declaration} %* * %************************************************************************ @@ -840,6 +930,37 @@ instance OutputableBndr name => Outputable (RuleBndr name) where ppr (RuleBndrSig name ty) = ppr name <> dcolon <> ppr ty \end{code} +%************************************************************************ +%* * +\subsection[DocDecl]{Document comments} +%* * +%************************************************************************ + +\begin{code} + +-- source code entities, for representing the module structure +data DocEntity name + = DeclEntity name + | DocEntity (DocDecl name) + +type LDocDecl name = Located (DocDecl name) + +data DocDecl name + = DocCommentNext (HsDoc name) + | DocCommentPrev (HsDoc name) + | DocCommentNamed String (HsDoc name) + | DocGroup Int (HsDoc name) + +-- Okay, I need to reconstruct the document comments, but for now: +instance Outputable (DocDecl name) where + ppr _ = text "" + +docDeclDoc (DocCommentNext d) = d +docDeclDoc (DocCommentPrev d) = d +docDeclDoc (DocCommentNamed _ d) = d +docDeclDoc (DocGroup _ d) = d + +\end{code} %************************************************************************ %* *