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(..),
35 import BasicTypes ( Fixity, WarningTxt )
40 import IfaceSyn ( IfaceBinding )
42 import SrcLoc ( Located(..) )
43 import Module ( Module, ModuleName )
48 -- | All we actually declare here is the top-level structure for a module.
51 hsmodName :: Maybe (Located ModuleName),
52 -- ^ @Nothing@: \"module X where\" is omitted (in which case the next
53 -- field is Nothing too)
54 hsmodExports :: Maybe [LIE name],
57 -- - @Nothing@: export list omitted, so export everything
59 -- - @Just []@: export /nothing/
61 -- - @Just [...]@: as you would expect...
63 hsmodImports :: [LImportDecl name],
64 -- ^ We snaffle interesting stuff out of the imported interfaces early
65 -- on, adding that info to TyDecls/etc; so this list is often empty,
67 hsmodDecls :: [LHsDecl name],
68 -- ^ Type, class, value, and interface signature decls
69 hsmodDeprecMessage :: Maybe WarningTxt,
70 -- ^ reason\/explanation for warning/deprecation of this module
71 hsmodHaddockModHeader :: Maybe LHsDocString
72 -- ^ Haddock module info and description, unparsed
76 data HsExtCore name -- Read from Foo.hcr
79 [TyClDecl name] -- Type declarations only; just as in Haskell source,
80 -- so that we can infer kinds etc
81 [IfaceBinding] -- And the bindings
86 instance Outputable Char where
89 instance (OutputableBndr name)
90 => Outputable (HsModule name) where
92 ppr (HsModule Nothing _ imports decls _ mbDoc)
93 = pp_mb mbDoc $$ pp_nonnull imports $$ pp_nonnull decls
95 ppr (HsModule (Just name) exports imports decls deprec mbDoc)
99 Nothing -> pp_header (ptext (sLit "where"))
102 nest 8 (fsep (punctuate comma (map ppr es))),
103 nest 4 (ptext (sLit ") where"))
109 pp_header rest = case deprec of
110 Nothing -> pp_modname <+> rest
111 Just d -> vcat [ pp_modname, ppr d, rest ]
113 pp_modname = ptext (sLit "module") <+> ppr name
115 pp_mb :: Outputable t => Maybe t -> SDoc
116 pp_mb (Just x) = ppr x
117 pp_mb Nothing = empty
119 pp_nonnull :: Outputable t => [t] -> SDoc
120 pp_nonnull [] = empty
121 pp_nonnull xs = vcat (map ppr xs)