%
+% (c) The University of Glasgow 2006
% (c) The GRASP/AQUA Project, Glasgow University, 1992-1998
%
\section{Haskell abstract syntax definition}
module HsPat,
module HsTypes,
module HsUtils,
+ module HsDoc,
Fixity,
- HsModule(..), HsExtCore(..)
- ) where
+ HsModule(..), HsExtCore(..),
+
+ HaddockModInfo(..),
+ emptyHaddockModInfo,
+) where
#include "HsVersions.h"
import HsLit
import HsPat
import HsTypes
-import HscTypes ( DeprecTxt )
-import BasicTypes ( Fixity )
+import BasicTypes ( Fixity, DeprecTxt )
import HsUtils
+import HsDoc
-- others:
import IfaceSyn ( IfaceBinding )
import Outputable
import SrcLoc ( Located(..) )
-import Module ( Module )
+import Module ( Module, ModuleName )
\end{code}
All we actually declare here is the top-level structure for a module.
\begin{code}
data HsModule name
= HsModule
- (Maybe (Located Module))-- Nothing => "module X where" is omitted
+ (Maybe (Located ModuleName))-- Nothing => "module X where" is omitted
-- (in which case the next field is Nothing too)
(Maybe [LIE name]) -- Export list; Nothing => export list omitted, so export everything
-- Just [] => export *nothing*
-- often empty, downstream.
[LHsDecl name] -- Type, class, value, and interface signature decls
(Maybe DeprecTxt) -- reason/explanation for deprecation of this module
+ (Maybe String) -- Haddock options, declared with the {-# DOCOPTIONS ... #-} pragma
+ (HaddockModInfo name) -- Haddock module info
+ (Maybe (HsDoc name)) -- Haddock module description
+
+data HaddockModInfo name = HaddockModInfo {
+ hmi_description :: Maybe (HsDoc name),
+ hmi_portability :: Maybe String,
+ hmi_stability :: Maybe String,
+ hmi_maintainer :: Maybe String
+}
+
+emptyHaddockModInfo :: HaddockModInfo a
+emptyHaddockModInfo = HaddockModInfo {
+ hmi_description = Nothing,
+ hmi_portability = Nothing,
+ hmi_stability = Nothing,
+ hmi_maintainer = Nothing
+}
data HsExtCore name -- Read from Foo.hcr
= HsExtCore
[IfaceBinding] -- And the bindings
\end{code}
+
\begin{code}
+instance Outputable Char where
+ ppr c = text [c]
+
instance (OutputableBndr name)
=> Outputable (HsModule name) where
- ppr (HsModule Nothing _ imports decls _)
- = pp_nonnull imports $$ pp_nonnull decls
+ ppr (HsModule Nothing _ imports decls _ _ _ mbDoc)
+ = pp_mb mbDoc $$ pp_nonnull imports $$ pp_nonnull decls
- ppr (HsModule (Just name) exports imports decls deprec)
+ ppr (HsModule (Just name) exports imports decls deprec opts _ mbDoc)
= vcat [
+ pp_mb mbDoc,
case exports of
Nothing -> pp_header (ptext SLIT("where"))
Just es -> vcat [
],
pp_nonnull imports,
pp_nonnull decls
- ]
+ ]
where
pp_header rest = case deprec of
Nothing -> pp_modname <+> rest
pp_modname = ptext SLIT("module") <+> ppr name
+pp_mb (Just x) = ppr x
+pp_mb Nothing = empty
+
pp_nonnull [] = empty
pp_nonnull xs = vcat (map ppr xs)
\end{code}