2 % (c) The University of Glasgow 2006
3 % (c) The GRASP/AQUA Project, Glasgow University, 1992-1998
5 \section{Haskell abstract syntax definition}
7 This module glues together the pieces of the Haskell abstract syntax,
8 which is declared in the various \tr{Hs*} modules. This module,
9 therefore, is almost nothing but re-exporting.
24 HsModule(..), HsExtCore(..),
38 import BasicTypes ( Fixity, WarningTxt )
43 import IfaceSyn ( IfaceBinding )
45 import SrcLoc ( Located(..) )
46 import Module ( Module, ModuleName )
50 All we actually declare here is the top-level structure for a module.
54 (Maybe (Located ModuleName))-- Nothing => "module X where" is omitted
55 -- (in which case the next field is Nothing too)
56 (Maybe [LIE name]) -- Export list; Nothing => export list omitted, so export everything
57 -- Just [] => export *nothing*
58 -- Just [...] => as you would expect...
59 [LImportDecl name] -- We snaffle interesting stuff out of the
60 -- imported interfaces early on, adding that
61 -- info to TyDecls/etc; so this list is
62 -- often empty, downstream.
63 [LHsDecl name] -- Type, class, value, and interface signature decls
64 (Maybe WarningTxt) -- reason/explanation for warning/deprecation of this module
65 (HaddockModInfo name) -- Haddock module info
66 (Maybe (HsDoc name)) -- Haddock module description
68 data HaddockModInfo name = HaddockModInfo {
69 hmi_description :: Maybe (HsDoc name),
70 hmi_portability :: Maybe String,
71 hmi_stability :: Maybe String,
72 hmi_maintainer :: Maybe String
75 emptyHaddockModInfo :: HaddockModInfo a
76 emptyHaddockModInfo = HaddockModInfo {
77 hmi_description = Nothing,
78 hmi_portability = Nothing,
79 hmi_stability = Nothing,
80 hmi_maintainer = Nothing
83 data HsExtCore name -- Read from Foo.hcr
86 [TyClDecl name] -- Type declarations only; just as in Haskell source,
87 -- so that we can infer kinds etc
88 [IfaceBinding] -- And the bindings
93 instance Outputable Char where
96 instance (OutputableBndr name)
97 => Outputable (HsModule name) where
99 ppr (HsModule Nothing _ imports decls _ _ mbDoc)
100 = pp_mb mbDoc $$ pp_nonnull imports $$ pp_nonnull decls
102 ppr (HsModule (Just name) exports imports decls deprec _ mbDoc)
106 Nothing -> pp_header (ptext (sLit "where"))
109 nest 8 (fsep (punctuate comma (map ppr es))),
110 nest 4 (ptext (sLit ") where"))
116 pp_header rest = case deprec of
117 Nothing -> pp_modname <+> rest
118 Just d -> vcat [ pp_modname, ppr d, rest ]
120 pp_modname = ptext (sLit "module") <+> ppr name
122 pp_mb :: Outputable t => Maybe t -> SDoc
123 pp_mb (Just x) = ppr x
124 pp_mb Nothing = empty
126 pp_nonnull :: Outputable t => [t] -> SDoc
127 pp_nonnull [] = empty
128 pp_nonnull xs = vcat (map ppr xs)