Improve pretty-printing for holes
[ghc.git] / compiler / hsSyn / HsSyn.lhs
1 %
2 % (c) The University of Glasgow 2006
3 % (c) The GRASP/AQUA Project, Glasgow University, 1992-1998
4 %
5 \section{Haskell abstract syntax definition}
6
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.
10
11 \begin{code}
12 {-# LANGUAGE DeriveDataTypeable #-}
13
14 module HsSyn (
15         module HsBinds,
16         module HsDecls,
17         module HsExpr,
18         module HsImpExp,
19         module HsLit,
20         module HsPat,
21         module HsTypes,
22         module HsUtils,
23         module HsDoc,
24         Fixity,
25
26         HsModule(..), HsExtCore(..),
27 ) where
28
29 -- friends:
30 import HsDecls
31 import HsBinds
32 import HsExpr
33 import HsImpExp
34 import HsLit
35 import HsPat
36 import HsTypes
37 import BasicTypes       ( Fixity, WarningTxt )
38 import HsUtils
39 import HsDoc
40
41 -- others:
42 import OccName          ( HasOccName )
43 import IfaceSyn         ( IfaceBinding )
44 import Outputable
45 import SrcLoc
46 import Module           ( Module, ModuleName )
47 import FastString
48
49 -- libraries:
50 import Data.Data hiding ( Fixity )
51 \end{code}
52
53 \begin{code}
54 -- | All we actually declare here is the top-level structure for a module.
55 data HsModule name
56   = HsModule {
57       hsmodName :: Maybe (Located ModuleName),
58         -- ^ @Nothing@: \"module X where\" is omitted (in which case the next
59         --     field is Nothing too)
60       hsmodExports :: Maybe [LIE name],
61         -- ^ Export list
62         --
63         --  - @Nothing@: export list omitted, so export everything
64         --
65         --  - @Just []@: export /nothing/
66         --
67         --  - @Just [...]@: as you would expect...
68         --
69       hsmodImports :: [LImportDecl name],
70         -- ^ We snaffle interesting stuff out of the imported interfaces early
71         -- on, adding that info to TyDecls/etc; so this list is often empty,
72         -- downstream.
73       hsmodDecls :: [LHsDecl name],
74         -- ^ Type, class, value, and interface signature decls
75       hsmodDeprecMessage :: Maybe WarningTxt,
76         -- ^ reason\/explanation for warning/deprecation of this module
77       hsmodHaddockModHeader :: Maybe LHsDocString
78         -- ^ Haddock module info and description, unparsed
79    } deriving (Data, Typeable)
80
81 data HsExtCore name     -- Read from Foo.hcr
82   = HsExtCore
83         Module
84         [TyClDecl name] -- Type declarations only; just as in Haskell source,
85                         -- so that we can infer kinds etc
86         [IfaceBinding]  -- And the bindings
87 \end{code}
88
89
90 \begin{code}
91 instance (OutputableBndr name, HasOccName name)
92         => Outputable (HsModule name) where
93
94     ppr (HsModule Nothing _ imports decls _ mbDoc)
95       = pp_mb mbDoc $$ pp_nonnull imports $$ pp_nonnull decls
96
97     ppr (HsModule (Just name) exports imports decls deprec mbDoc)
98       = vcat [
99             pp_mb mbDoc,
100             case exports of
101               Nothing -> pp_header (ptext (sLit "where"))
102               Just es -> vcat [
103                            pp_header lparen,
104                            nest 8 (fsep (punctuate comma (map ppr es))),
105                            nest 4 (ptext (sLit ") where"))
106                           ],
107             pp_nonnull imports,
108             pp_nonnull decls
109           ]
110       where
111         pp_header rest = case deprec of
112            Nothing -> pp_modname <+> rest
113            Just d -> vcat [ pp_modname, ppr d, rest ]
114
115         pp_modname = ptext (sLit "module") <+> ppr name
116
117 pp_mb :: Outputable t => Maybe t -> SDoc
118 pp_mb (Just x) = ppr x
119 pp_mb Nothing  = empty
120
121 pp_nonnull :: Outputable t => [t] -> SDoc
122 pp_nonnull [] = empty
123 pp_nonnull xs = vcat (map ppr xs)
124 \end{code}