ff52101c45dd6a84d4ea6e9d421a24e54426ec9c
[ghc-hetmet.git] / compiler / typecheck / TcTyDecls.lhs
1 %
2 % (c) The University of Glasgow 2006
3 % (c) The GRASP/AQUA Project, Glasgow University, 1992-1999
4 %
5
6 Analysis functions over data types.  Specficially, detecting recursive types.
7
8 This stuff is only used for source-code decls; it's recorded in interface
9 files for imported data types.
10
11 \begin{code}
12 {-# OPTIONS_GHC -w #-}
13 -- The above warning supression flag is a temporary kludge.
14 -- While working on this module you are encouraged to remove it and fix
15 -- any warnings in the module. See
16 --     http://hackage.haskell.org/trac/ghc/wiki/WorkingConventions#Warnings
17 -- for details
18
19 module TcTyDecls(
20         calcRecFlags, 
21         calcClassCycles, calcSynCycles
22     ) where
23
24 #include "HsVersions.h"
25
26 import TypeRep
27 import HsSyn
28 import RnHsSyn
29 import Type
30 import HscTypes
31 import TyCon
32 import Class
33 import DataCon
34 import Name
35 import NameEnv
36 import NameSet
37 import Digraph
38 import BasicTypes
39 import SrcLoc
40 import Outputable
41 \end{code}
42
43
44 %************************************************************************
45 %*                                                                      *
46         Cycles in class and type synonym declarations
47 %*                                                                      *
48 %************************************************************************
49
50 Checking for class-decl loops is easy, because we don't allow class decls
51 in interface files.
52
53 We allow type synonyms in hi-boot files, but we *trust* hi-boot files, 
54 so we don't check for loops that involve them.  So we only look for synonym
55 loops in the module being compiled.
56
57 We check for type synonym and class cycles on the *source* code.
58 Main reasons: 
59
60   a) Otherwise we'd need a special function to extract type-synonym tycons
61         from a type, whereas we have extractHsTyNames already
62
63   b) If we checked for type synonym loops after building the TyCon, we
64         can't do a hoistForAllTys on the type synonym rhs, (else we fall into
65         a black hole) which seems unclean.  Apart from anything else, it'd mean 
66         that a type-synonym rhs could have for-alls to the right of an arrow, 
67         which means adding new cases to the validity checker
68
69         Indeed, in general, checking for cycles beforehand means we need to
70         be less careful about black holes through synonym cycles.
71
72 The main disadvantage is that a cycle that goes via a type synonym in an 
73 .hi-boot file can lead the compiler into a loop, because it assumes that cycles
74 only occur entirely within the source code of the module being compiled.  
75 But hi-boot files are trusted anyway, so this isn't much worse than (say) 
76 a kind error.
77
78 [  NOTE ----------------------------------------------
79 If we reverse this decision, this comment came from tcTyDecl1, and should
80  go back there
81         -- dsHsType, not tcHsKindedType, to avoid a loop.  tcHsKindedType does hoisting,
82         -- which requires looking through synonyms... and therefore goes into a loop
83         -- on (erroneously) recursive synonyms.
84         -- Solution: do not hoist synonyms, because they'll be hoisted soon enough
85         --           when they are substituted
86
87 We'd also need to add back in this definition
88
89 synTyConsOfType :: Type -> [TyCon]
90 -- Does not look through type synonyms at all
91 -- Return a list of synonym tycons
92 synTyConsOfType ty
93   = nameEnvElts (go ty)
94   where
95      go :: Type -> NameEnv TyCon  -- The NameEnv does duplicate elim
96      go (TyVarTy v)               = emptyNameEnv
97      go (TyConApp tc tys)         = go_tc tc tys
98      go (AppTy a b)               = go a `plusNameEnv` go b
99      go (FunTy a b)               = go a `plusNameEnv` go b
100      go (PredTy (IParam _ ty))    = go ty       
101      go (PredTy (ClassP cls tys)) = go_s tys    -- Ignore class
102      go (NoteTy _ ty)             = go ty       
103      go (ForAllTy _ ty)           = go ty
104
105      go_tc tc tys | isSynTyCon tc = extendNameEnv (go_s tys) (tyConName tc) tc
106                   | otherwise     = go_s tys
107      go_s tys = foldr (plusNameEnv . go) emptyNameEnv tys
108 ---------------------------------------- END NOTE ]
109
110 \begin{code}
111 calcSynCycles :: [LTyClDecl Name] -> [SCC (LTyClDecl Name)]
112 calcSynCycles decls
113   = stronglyConnComp syn_edges
114   where
115     syn_edges = [ (ldecl, unLoc (tcdLName decl), 
116                           mk_syn_edges (tcdSynRhs decl))
117                 | ldecl@(L _ decl) <- decls ]
118
119     mk_syn_edges rhs = [ tc | tc <- nameSetToList (extractHsTyNames rhs), 
120                               not (isTyVarName tc) ]
121
122
123 calcClassCycles :: [LTyClDecl Name] -> [[LTyClDecl Name]]
124 calcClassCycles decls
125   = [decls | CyclicSCC decls <- stronglyConnComp cls_edges]
126   where
127     cls_edges = [ (ldecl, unLoc (tcdLName decl),        
128                           mk_cls_edges (unLoc (tcdCtxt decl)))
129                 | ldecl@(L _ decl) <- decls, isClassDecl decl ]
130
131     mk_cls_edges ctxt = [ cls | L _ (HsClassP cls _) <- ctxt ]
132 \end{code}
133
134
135 %************************************************************************
136 %*                                                                      *
137         Deciding which type constructors are recursive
138 %*                                                                      *
139 %************************************************************************
140
141 For newtypes, we label some as "recursive" such that
142
143     INVARIANT: there is no cycle of non-recursive newtypes
144
145 In any loop, only one newtype need be marked as recursive; it is
146 a "loop breaker".  Labelling more than necessary as recursive is OK,
147 provided the invariant is maintained.
148
149 A newtype M.T is defined to be "recursive" iff
150         (a) it is declared in an hi-boot file (see RdrHsSyn.hsIfaceDecl)
151         (b) it is declared in a source file, but that source file has a
152             companion hi-boot file which declares the type
153    or   (c) one can get from T's rhs to T via type 
154             synonyms, or non-recursive newtypes *in M*
155              e.g.  newtype T = MkT (T -> Int)
156
157 (a) is conservative; declarations in hi-boot files are always 
158         made loop breakers. That's why in (b) we can restrict attention
159         to tycons in M, because any loops through newtypes outside M
160         will be broken by those newtypes
161 (b) ensures that a newtype is not treated as a loop breaker in one place
162 and later as a non-loop-breaker.  This matters in GHCi particularly, when
163 a newtype T might be embedded in many types in the environment, and then
164 T's source module is compiled.  We don't want T's recursiveness to change.
165
166 The "recursive" flag for algebraic data types is irrelevant (never consulted)
167 for types with more than one constructor.
168
169 An algebraic data type M.T is "recursive" iff
170         it has just one constructor, and 
171         (a) it is declared in an hi-boot file (see RdrHsSyn.hsIfaceDecl)
172         (b) it is declared in a source file, but that source file has a
173             companion hi-boot file which declares the type
174  or     (c) one can get from its arg types to T via type synonyms, 
175             or by non-recursive newtypes or non-recursive product types in M
176              e.g.  data T = MkT (T -> Int) Bool
177 Just like newtype in fact
178
179 A type synonym is recursive if one can get from its
180 right hand side back to it via type synonyms.  (This is
181 reported as an error.)
182
183 A class is recursive if one can get from its superclasses
184 back to it.  (This is an error too.)
185
186 Hi-boot types
187 ~~~~~~~~~~~~~
188 A data type read from an hi-boot file will have an AbstractTyCon as its AlgTyConRhs
189 and will respond True to isHiBootTyCon. The idea is that we treat these as if one
190 could get from these types to anywhere.  So when we see
191
192         module Baz where
193         import {-# SOURCE #-} Foo( T )
194         newtype S = MkS T
195
196 then we mark S as recursive, just in case. What that means is that if we see
197
198         import Baz( S )
199         newtype R = MkR S
200
201 then we don't need to look inside S to compute R's recursiveness.  Since S is imported
202 (not from an hi-boot file), one cannot get from R back to S except via an hi-boot file,
203 and that means that some data type will be marked recursive along the way.  So R is
204 unconditionly non-recursive (i.e. there'll be a loop breaker elsewhere if necessary)
205
206 This in turn means that we grovel through fewer interface files when computing 
207 recursiveness, because we need only look at the type decls in the module being
208 compiled, plus the outer structure of directly-mentioned types.
209
210 \begin{code}
211 calcRecFlags :: ModDetails -> [TyThing] -> (Name -> RecFlag)
212 -- The 'boot_names' are the things declared in M.hi-boot, if M is the current module.
213 -- Any type constructors in boot_names are automatically considered loop breakers
214 calcRecFlags boot_details tyclss
215   = is_rec
216   where
217     is_rec n | n `elemNameSet` rec_names = Recursive
218              | otherwise                 = NonRecursive
219
220     boot_name_set = availsToNameSet (md_exports boot_details)
221     rec_names = boot_name_set     `unionNameSets` 
222                 nt_loop_breakers  `unionNameSets`
223                 prod_loop_breakers
224
225     all_tycons = [ tc | tycls <- tyclss,
226                            -- Recursion of newtypes/data types can happen via 
227                            -- the class TyCon, so tyclss includes the class tycons
228                         let tc = getTyCon tycls,
229                         not (tyConName tc `elemNameSet` boot_name_set) ]
230                            -- Remove the boot_name_set because they are going 
231                            -- to be loop breakers regardless.
232
233         -------------------------------------------------
234         --                      NOTE
235         -- These edge-construction loops rely on
236         -- every loop going via tyclss, the types and classes
237         -- in the module being compiled.  Stuff in interface 
238         -- files should be correctly marked.  If not (e.g. a
239         -- type synonym in a hi-boot file) we can get an infinite
240         -- loop.  We could program round this, but it'd make the code
241         -- rather less nice, so I'm not going to do that yet.
242
243         --------------- Newtypes ----------------------
244     new_tycons = filter isNewTyConAndNotOpen all_tycons
245     isNewTyConAndNotOpen tycon = isNewTyCon tycon && not (isOpenTyCon tycon)
246     nt_loop_breakers = mkNameSet (findLoopBreakers nt_edges)
247     is_rec_nt tc = tyConName tc  `elemNameSet` nt_loop_breakers
248         -- is_rec_nt is a locally-used helper function
249
250     nt_edges = [(t, mk_nt_edges t) | t <- new_tycons]
251
252     mk_nt_edges nt      -- Invariant: nt is a newtype
253         = concatMap (mk_nt_edges1 nt) (tcTyConsOfType (new_tc_rhs nt))
254                         -- tyConsOfType looks through synonyms
255
256     mk_nt_edges1 nt tc 
257         | tc `elem` new_tycons = [tc]           -- Loop
258                 -- At this point we know that either it's a local *data* type,
259                 -- or it's imported.  Either way, it can't form part of a newtype cycle
260         | otherwise = []
261
262         --------------- Product types ----------------------
263         -- The "prod_tycons" are the non-newtype products
264     prod_tycons = [tc | tc <- all_tycons, 
265                         not (isNewTyCon tc), isProductTyCon tc]
266     prod_loop_breakers = mkNameSet (findLoopBreakers prod_edges)
267
268     prod_edges = [(tc, mk_prod_edges tc) | tc <- prod_tycons]
269         
270     mk_prod_edges tc    -- Invariant: tc is a product tycon
271         = concatMap (mk_prod_edges1 tc) (dataConOrigArgTys (head (tyConDataCons tc)))
272
273     mk_prod_edges1 ptc ty = concatMap (mk_prod_edges2 ptc) (tcTyConsOfType ty)
274
275     mk_prod_edges2 ptc tc 
276         | tc `elem` prod_tycons   = [tc]                -- Local product
277         | tc `elem` new_tycons    = if is_rec_nt tc     -- Local newtype
278                                     then []
279                                     else mk_prod_edges1 ptc (new_tc_rhs tc)
280                 -- At this point we know that either it's a local non-product data type,
281                 -- or it's imported.  Either way, it can't form part of a cycle
282         | otherwise = []
283                         
284 new_tc_rhs tc = snd (newTyConRhs tc)    -- Ignore the type variables
285
286 getTyCon (ATyCon tc) = tc
287 getTyCon (AClass cl) = classTyCon cl
288 getTyCon other       = panic "getTyCon"
289
290 findLoopBreakers :: [(TyCon, [TyCon])] -> [Name]
291 -- Finds a set of tycons that cut all loops
292 findLoopBreakers deps
293   = go [(tc,tc,ds) | (tc,ds) <- deps]
294   where
295     go edges = [ name
296                | CyclicSCC ((tc,_,_) : edges') <- stronglyConnCompR edges,
297                  name <- tyConName tc : go edges']
298 \end{code}
299
300 These two functions know about type representations, so they could be
301 in Type or TcType -- but they are very specialised to this module, so 
302 I've chosen to put them here.
303
304 \begin{code}
305 tcTyConsOfType :: Type -> [TyCon]
306 -- tcTyConsOfType looks through all synonyms, but not through any newtypes.  
307 -- When it finds a Class, it returns the class TyCon.  The reaons it's here
308 -- (not in Type.lhs) is because it is newtype-aware.
309 tcTyConsOfType ty 
310   = nameEnvElts (go ty)
311   where
312      go :: Type -> NameEnv TyCon  -- The NameEnv does duplicate elim
313      go ty | Just ty' <- tcView ty = go ty'
314      go (TyVarTy v)                = emptyNameEnv
315      go (TyConApp tc tys)          = go_tc tc tys
316      go (AppTy a b)                = go a `plusNameEnv` go b
317      go (FunTy a b)                = go a `plusNameEnv` go b
318      go (PredTy (IParam _ ty))     = go ty
319      go (PredTy (ClassP cls tys))  = go_tc (classTyCon cls) tys
320      go (ForAllTy _ ty)            = go ty
321      go other                      = panic "tcTyConsOfType"
322
323      go_tc tc tys = extendNameEnv (go_s tys) (tyConName tc) tc
324      go_s tys = foldr (plusNameEnv . go) emptyNameEnv tys
325 \end{code}