[project @ 1999-01-27 14:51:14 by simonpj]
[ghc-hetmet.git] / ghc / compiler / hsSyn / HsSyn.lhs
1 %
2 % (c) The GRASP/AQUA Project, Glasgow University, 1992-1998
3 %
4 \section{Haskell abstract syntax definition}
5
6 This module glues together the pieces of the Haskell abstract syntax,
7 which is declared in the various \tr{Hs*} modules.  This module,
8 therefore, is almost nothing but re-exporting.
9
10 \begin{code}
11 module HsSyn (
12
13         -- NB: don't reexport HsCore or HsPragmas;
14         -- this module tells about "real Haskell"
15
16         module HsSyn,
17         module HsBinds,
18         module HsDecls,
19         module HsExpr,
20         module HsImpExp,
21         module HsBasic,
22         module HsMatches,
23         module HsPat,
24         module HsTypes,
25         Fixity, NewOrData, 
26
27         collectTopBinders, collectMonoBinders
28      ) where
29
30 #include "HsVersions.h"
31
32 -- friends:
33 import HsDecls          
34 import HsBinds
35 import HsExpr
36 import HsImpExp
37 import HsBasic
38 import HsMatches
39 import HsPat
40 import HsTypes
41 import HsCore
42 import BasicTypes       ( Fixity, Version, NewOrData )
43
44 -- others:
45 import Outputable
46 import SrcLoc           ( SrcLoc )
47 import Bag
48 import OccName          ( Module, pprModule )
49 \end{code}
50
51 All we actually declare here is the top-level structure for a module.
52 \begin{code}
53 data HsModule name pat
54   = HsModule
55         Module                  -- module name
56         (Maybe Version)         -- source interface version number
57         (Maybe [IE name])       -- export list; Nothing => export everything
58                                 -- Just [] => export *nothing* (???)
59                                 -- Just [...] => as you would expect...
60         [ImportDecl name]       -- We snaffle interesting stuff out of the
61                                 -- imported interfaces early on, adding that
62                                 -- info to TyDecls/etc; so this list is
63                                 -- often empty, downstream.
64         [HsDecl name pat]       -- Type, class, value, and interface signature decls
65         SrcLoc
66 \end{code}
67
68 \begin{code}
69 instance (Outputable name, Outputable pat)
70         => Outputable (HsModule name pat) where
71
72     ppr (HsModule name iface_version exports imports
73                       decls src_loc)
74       = vcat [
75             case exports of
76               Nothing -> hsep [ptext SLIT("module"), pprModule name, ptext SLIT("where")]
77               Just es -> vcat [
78                             hsep [ptext SLIT("module"), pprModule name, lparen],
79                             nest 8 (interpp'SP es),
80                             nest 4 (ptext SLIT(") where"))
81                           ],
82             pp_nonnull imports,
83             pp_nonnull decls
84         ]
85       where
86         pp_nonnull [] = empty
87         pp_nonnull xs = vcat (map ppr xs)
88
89         pp_iface_version Nothing  = empty
90         pp_iface_version (Just n) = hsep [text "{-# INTERFACE", int n, text "#-}"]
91 \end{code}
92
93
94 %************************************************************************
95 %*                                                                      *
96 \subsection{Collecting binders from @HsBinds@}
97 %*                                                                      *
98 %************************************************************************
99
100 Get all the binders in some @MonoBinds@, IN THE ORDER OF APPEARANCE.
101
102 These functions are here, rather than in HsBinds, to avoid a loop between HsPat and HsBinds.
103
104 \begin{verbatim}
105 ...
106 where
107   (x, y) = ...
108   f i j  = ...
109   [a, b] = ...
110 \end{verbatim}
111 it should return @[x, y, f, a, b]@ (remember, order important).
112
113 \begin{code}
114 collectTopBinders :: HsBinds name (InPat name) -> Bag (name,SrcLoc)
115 collectTopBinders EmptyBinds     = emptyBag
116 collectTopBinders (MonoBind b _ _) = collectMonoBinders b
117 collectTopBinders (ThenBinds b1 b2)
118  = collectTopBinders b1 `unionBags` collectTopBinders b2
119
120 collectMonoBinders :: MonoBinds name (InPat name) -> Bag (name,SrcLoc)
121 collectMonoBinders EmptyMonoBinds                = emptyBag
122 collectMonoBinders (PatMonoBind pat _ loc)       = listToBag (map (\v->(v,loc)) (collectPatBinders pat))
123 collectMonoBinders (FunMonoBind f _ matches loc) = unitBag (f,loc)
124 collectMonoBinders (VarMonoBind v expr)          = error "collectMonoBinders"
125 collectMonoBinders (CoreMonoBind v expr)         = error "collectMonoBinders"
126 collectMonoBinders (AndMonoBinds bs1 bs2)        = collectMonoBinders bs1 `unionBags`
127                                                    collectMonoBinders bs2
128 \end{code}
129