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.
12 {-# LANGUAGE DeriveDataTypeable #-}
26 HsModule(..), HsExtCore(..), CodeFlavor(..)
37 import BasicTypes ( Fixity, WarningTxt )
42 import IfaceSyn ( IfaceBinding )
45 import Module ( Module, ModuleName )
49 import Data.Data hiding ( Fixity )
54 data CodeFlavor = LambdaFlavor | KappaFlavor
56 -- | All we actually declare here is the top-level structure for a module.
59 hsmodName :: Maybe (Located ModuleName),
60 -- ^ @Nothing@: \"module X where\" is omitted (in which case the next
61 -- field is Nothing too)
62 hsmodExports :: Maybe [LIE name],
65 -- - @Nothing@: export list omitted, so export everything
67 -- - @Just []@: export /nothing/
69 -- - @Just [...]@: as you would expect...
71 hsmodImports :: [LImportDecl name],
72 -- ^ We snaffle interesting stuff out of the imported interfaces early
73 -- on, adding that info to TyDecls/etc; so this list is often empty,
75 hsmodDecls :: [LHsDecl name],
76 -- ^ Type, class, value, and interface signature decls
77 hsmodDeprecMessage :: Maybe WarningTxt,
78 -- ^ reason\/explanation for warning/deprecation of this module
79 hsmodHaddockModHeader :: Maybe LHsDocString
80 -- ^ Haddock module info and description, unparsed
81 } deriving (Data, Typeable)
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)