2 % (c) The GRASP/AQUA Project, Glasgow University, 1992-1998
4 \section[RnBinds]{Renaming and dependency analysis of bindings}
6 This module does renaming and dependency analysis on value bindings in
7 the abstract syntax. It does {\em not} do cycle-checks on class or
8 type-synonym declarations; those cannot be done at this stage because
9 they may be affected by renaming (which isn't fully worked out yet).
13 rnTopMonoBinds, rnMonoBinds, rnMonoBindsAndThen,
14 rnMethodBinds, renameSigs, checkSigs, unknownSigErr
17 #include "HsVersions.h"
21 import HsBinds ( eqHsSig, hsSigDoc )
25 import RnTypes ( rnHsSigType, rnHsType, rnPat )
26 import RnExpr ( rnMatch, rnGRHSs, checkPrecMatch )
27 import RnEnv ( bindLocatedLocalsRn, lookupBndrRn, lookupInstDeclBndr,
28 lookupSigOccRn, bindPatSigTyVars, bindPatSigTyVarsFV,
30 warnUnusedLocalBinds, mapFvRn, extendTyVarEnvFVRn,
32 import CmdLineOpts ( DynFlag(..) )
33 import Digraph ( SCC(..), stronglyConnComp )
34 import Name ( Name, nameOccName, nameSrcLoc )
36 import RdrName ( RdrName, rdrNameOcc )
37 import BasicTypes ( RecFlag(..), TopLevelFlag(..), isTopLevel )
38 import List ( unzip4 )
42 -- ToDo: Put the annotations into the monad, so that they arrive in the proper
43 -- place and can be used when complaining.
45 The code tree received by the function @rnBinds@ contains definitions
46 in where-clauses which are all apparently mutually recursive, but which may
47 not really depend upon each other. For example, in the top level program
52 the definitions of @a@ and @y@ do not depend on each other at all.
53 Unfortunately, the typechecker cannot always check such definitions.
54 \footnote{Mycroft, A. 1984. Polymorphic type schemes and recursive
55 definitions. In Proceedings of the International Symposium on Programming,
56 Toulouse, pp. 217-39. LNCS 167. Springer Verlag.}
57 However, the typechecker usually can check definitions in which only the
58 strongly connected components have been collected into recursive bindings.
59 This is precisely what the function @rnBinds@ does.
61 ToDo: deal with case where a single monobinds binds the same variable
64 The vertag tag is a unique @Int@; the tags only need to be unique
65 within one @MonoBinds@, so that unique-Int plumbing is done explicitly
66 (heavy monad machinery not needed).
69 %************************************************************************
71 %* naming conventions *
73 %************************************************************************
75 \subsection[name-conventions]{Name conventions}
77 The basic algorithm involves walking over the tree and returning a tuple
78 containing the new tree plus its free variables. Some functions, such
79 as those walking polymorphic bindings (HsBinds) and qualifier lists in
80 list comprehensions (@Quals@), return the variables bound in local
81 environments. These are then used to calculate the free variables of the
82 expression evaluated in these environments.
84 Conventions for variable names are as follows:
87 new code is given a prime to distinguish it from the old.
90 a set of variables defined in @Exp@ is written @dvExp@
93 a set of variables free in @Exp@ is written @fvExp@
96 %************************************************************************
98 %* analysing polymorphic bindings (HsBinds, Bind, MonoBinds) *
100 %************************************************************************
102 \subsubsection[dep-HsBinds]{Polymorphic bindings}
104 Non-recursive expressions are reconstructed without any changes at top
105 level, although their component expressions may have to be altered.
106 However, non-recursive expressions are currently not expected as
107 \Haskell{} programs, and this code should not be executed.
109 Monomorphic bindings contain information that is returned in a tuple
110 (a @FlatMonoBinds@) containing:
114 a unique @Int@ that serves as the ``vertex tag'' for this binding.
117 the name of a function or the names in a pattern. These are a set
118 referred to as @dvLhs@, the defined variables of the left hand side.
121 the free variables of the body. These are referred to as @fvBody@.
124 the definition's actual code. This is referred to as just @code@.
127 The function @nonRecDvFv@ returns two sets of variables. The first is
128 the set of variables defined in the set of monomorphic bindings, while the
129 second is the set of free variables in those bindings.
131 The set of variables defined in a non-recursive binding is just the
132 union of all of them, as @union@ removes duplicates. However, the
133 free variables in each successive set of cumulative bindings is the
134 union of those in the previous set plus those of the newest binding after
135 the defined variables of the previous set have been removed.
137 @rnMethodBinds@ deals only with the declarations in class and
138 instance declarations. It expects only to see @FunMonoBind@s, and
139 it expects the global environment to contain bindings for the binders
140 (which are all class operations).
142 %************************************************************************
144 \subsubsection{ Top-level bindings}
146 %************************************************************************
148 @rnTopMonoBinds@ assumes that the environment already
149 contains bindings for the binders of this particular binding.
152 rnTopMonoBinds :: RdrNameMonoBinds
154 -> RnM (RenamedHsBinds, DefUses)
156 -- The binders of the binding are in scope already;
157 -- the top level scope resoluttion does that
159 rnTopMonoBinds mbinds sigs
160 = bindPatSigTyVars (collectSigTysFromMonoBinds mbinds) $ \ _ ->
161 -- Hmm; by analogy with Ids, this doesn't look right
162 -- Top-level bound type vars should really scope over
163 -- everything, but we only scope them over the other bindings
165 rnMonoBinds TopLevel mbinds sigs
169 %************************************************************************
173 %************************************************************************
176 rnMonoBindsAndThen :: RdrNameMonoBinds
178 -> (RenamedHsBinds -> RnM (result, FreeVars))
179 -> RnM (result, FreeVars)
181 rnMonoBindsAndThen mbinds sigs thing_inside -- Non-empty monobinds
182 = -- Extract all the binders in this group, and extend the
183 -- current scope, inventing new names for the new binders
184 -- This also checks that the names form a set
185 bindLocatedLocalsRn doc mbinders_w_srclocs $ \ _ ->
186 bindPatSigTyVarsFV (collectSigTysFromMonoBinds mbinds) $
188 -- Then install local fixity declarations
189 -- Notice that they scope over thing_inside too
190 bindLocalFixities [sig | FixSig sig <- sigs ] $
193 rnMonoBinds NotTopLevel mbinds sigs `thenM` \ (binds, bind_dus) ->
195 -- Now do the "thing inside"
196 thing_inside binds `thenM` \ (result,result_fvs) ->
198 -- Final error checking
200 bndrs = duDefs bind_dus
201 all_uses = findUses bind_dus result_fvs
202 unused_bndrs = nameSetToList (bndrs `minusNameSet` all_uses)
204 warnUnusedLocalBinds unused_bndrs `thenM_`
206 returnM (result, all_uses `minusNameSet` bndrs)
208 mbinders_w_srclocs = collectLocatedMonoBinders mbinds
209 doc = text "In the binding group for:"
210 <+> pprWithCommas ppr (map fst mbinders_w_srclocs)
214 %************************************************************************
216 \subsubsection{ MonoBinds -- the main work is done here}
218 %************************************************************************
220 @rnMonoBinds@ is used by {\em both} top-level and nested bindings.
221 It assumes that all variables bound in this group are already in scope.
222 This is done {\em either} by pass 3 (for the top-level bindings),
223 {\em or} by @rnMonoBinds@ (for the nested ones).
226 rnMonoBinds :: TopLevelFlag
229 -> RnM (RenamedHsBinds, DefUses)
231 -- Assumes the binders of the binding are in scope already
233 rnMonoBinds top_lvl mbinds sigs
234 = renameSigs sigs `thenM` \ siglist ->
236 -- Rename the bindings, returning a MonoBindsInfo
237 -- which is a list of indivisible vertices so far as
238 -- the strongly-connected-components (SCC) analysis is concerned
239 flattenMonoBinds siglist mbinds `thenM` \ mbinds_info ->
241 -- Do the SCC analysis
243 scc_result = rnSCC mbinds_info
244 (binds_s, bind_dus_s) = unzip (map reconstructCycle scc_result)
245 bind_dus = mkDUs bind_dus_s
246 final_binds = foldr ThenBinds EmptyBinds binds_s
247 binders = duDefs bind_dus
250 -- Check for duplicate or mis-placed signatures
251 checkSigs (okBindSig binders) siglist `thenM_`
253 -- Warn about missing signatures,
254 -- but only at top level, and not in interface mode
255 -- (The latter is important when renaming bindings from 'deriving' clauses.)
256 getModeRn `thenM` \ mode ->
257 doptM Opt_WarnMissingSigs `thenM` \ warn_missing_sigs ->
258 (if isTopLevel top_lvl &&
260 not (isInterfaceMode mode)
262 type_sig_vars = [n | Sig n _ _ <- siglist]
263 un_sigd_binders = filter (not . (`elem` type_sig_vars))
264 (nameSetToList binders)
266 mappM_ missingSigWarn un_sigd_binders
271 returnM (final_binds, bind_dus `plusDU` usesOnly (hsSigsFVs siglist))
274 @flattenMonoBinds@ is ever-so-slightly magical in that it sticks
275 unique ``vertex tags'' on its output; minor plumbing required.
278 flattenMonoBinds :: [RenamedSig] -- Signatures
280 -> RnM [FlatMonoBinds]
282 flattenMonoBinds sigs EmptyMonoBinds = returnM []
284 flattenMonoBinds sigs (AndMonoBinds bs1 bs2)
285 = flattenMonoBinds sigs bs1 `thenM` \ flat1 ->
286 flattenMonoBinds sigs bs2 `thenM` \ flat2 ->
287 returnM (flat1 ++ flat2)
289 flattenMonoBinds sigs (PatMonoBind pat grhss locn)
291 rnPat pat `thenM` \ (pat', pat_fvs) ->
293 -- Find which things are bound in this group
295 names_bound_here = mkNameSet (collectPatBinders pat')
297 sigsForMe names_bound_here sigs `thenM` \ sigs_for_me ->
298 rnGRHSs PatBindRhs grhss `thenM` \ (grhss', fvs) ->
300 [(names_bound_here, fvs `plusFV` pat_fvs,
301 PatMonoBind pat' grhss' locn, sigs_for_me
304 flattenMonoBinds sigs (FunMonoBind name inf matches locn)
306 lookupBndrRn name `thenM` \ new_name ->
308 names_bound_here = unitNameSet new_name
310 sigsForMe names_bound_here sigs `thenM` \ sigs_for_me ->
311 mapFvRn (rnMatch (FunRhs new_name)) matches `thenM` \ (new_matches, fvs) ->
312 mappM_ (checkPrecMatch inf new_name) new_matches `thenM_`
314 [(unitNameSet new_name, fvs,
315 FunMonoBind new_name inf new_matches locn, sigs_for_me
319 sigsForMe names_bound_here sigs
320 = foldlM check [] (filter (sigForThisGroup names_bound_here) sigs)
322 check sigs sig = case filter (eqHsSig sig) sigs of
323 [] -> returnM (sig:sigs)
324 other -> dupSigDeclErr sig `thenM_`
329 @rnMethodBinds@ is used for the method bindings of a class and an instance
330 declaration. Like @rnMonoBinds@ but without dependency analysis.
332 NOTA BENE: we record each {\em binder} of a method-bind group as a free variable.
333 That's crucial when dealing with an instance decl:
335 instance Foo (T a) where
338 This might be the {\em sole} occurrence of @op@ for an imported class @Foo@,
339 and unless @op@ occurs we won't treat the type signature of @op@ in the class
340 decl for @Foo@ as a source of instance-decl gates. But we should! Indeed,
341 in many ways the @op@ in an instance decl is just like an occurrence, not
345 rnMethodBinds :: Name -- Class name
346 -> [Name] -- Names for generic type variables
348 -> RnM (RenamedMonoBinds, FreeVars)
350 rnMethodBinds cls gen_tyvars EmptyMonoBinds = returnM (EmptyMonoBinds, emptyFVs)
352 rnMethodBinds cls gen_tyvars (AndMonoBinds mb1 mb2)
353 = rnMethodBinds cls gen_tyvars mb1 `thenM` \ (mb1', fvs1) ->
354 rnMethodBinds cls gen_tyvars mb2 `thenM` \ (mb2', fvs2) ->
355 returnM (mb1' `AndMonoBinds` mb2', fvs1 `plusFV` fvs2)
357 rnMethodBinds cls gen_tyvars (FunMonoBind name inf matches locn)
360 lookupInstDeclBndr cls name `thenM` \ sel_name ->
361 -- We use the selector name as the binder
363 mapFvRn (rn_match sel_name) matches `thenM` \ (new_matches, fvs) ->
364 mappM_ (checkPrecMatch inf sel_name) new_matches `thenM_`
365 returnM (FunMonoBind sel_name inf new_matches locn, fvs `addOneFV` sel_name)
367 -- Gruesome; bring into scope the correct members of the generic type variables
368 -- See comments in RnSource.rnSourceDecl(ClassDecl)
369 rn_match sel_name match@(Match (TypePat ty : _) _ _)
370 = extendTyVarEnvFVRn gen_tvs $
371 rnMatch (FunRhs sel_name) match
373 tvs = map rdrNameOcc (extractHsTyRdrNames ty)
374 gen_tvs = [tv | tv <- gen_tyvars, nameOccName tv `elem` tvs]
376 rn_match sel_name match = rnMatch (FunRhs sel_name) match
379 -- Can't handle method pattern-bindings which bind multiple methods.
380 rnMethodBinds cls gen_tyvars mbind@(PatMonoBind other_pat _ locn)
381 = addSrcLoc locn (addErr (methodBindErr mbind)) `thenM_`
382 returnM (EmptyMonoBinds, emptyFVs)
386 %************************************************************************
388 Strongly connected components
391 %************************************************************************
393 During analysis a @MonoBinds@ is flattened to a @FlatMonoBinds@.
394 The @RenamedMonoBinds@ is always an empty bind, a pattern binding or
395 a function binding, and has itself been dependency-analysed and
399 type FlatMonoBinds = (Defs, Uses, RenamedMonoBinds, [RenamedSig])
400 -- Signatures, if any, for this vertex
402 rnSCC :: [FlatMonoBinds] -> [SCC FlatMonoBinds]
403 rnSCC nodes = stronglyConnComp (mkEdges nodes)
407 mkEdges :: [FlatMonoBinds] -> [(FlatMonoBinds, VertexTag, [VertexTag])]
408 -- We keep the uses with the binding,
409 -- so we can track unused bindings better
411 = [ (thing, tag, dest_vertices uses)
412 | (thing@(_, uses, _, _), tag) <- tagged_nodes
415 tagged_nodes = nodes `zip` [0::VertexTag ..]
417 -- An edge (v,v') indicates that v depends on v'
418 dest_vertices uses = [ target_vertex
419 | ((defs, _, _, _), target_vertex) <- tagged_nodes,
420 defs `intersectsNameSet` uses
423 reconstructCycle :: SCC FlatMonoBinds -> (RenamedHsBinds, (Defs,Uses))
424 reconstructCycle (AcyclicSCC (defs, uses, binds, sigs))
425 = (MonoBind binds sigs NonRecursive, (defs, uses))
426 reconstructCycle (CyclicSCC cycle)
427 = (MonoBind this_gp_binds this_gp_sigs Recursive,
428 (unionManyNameSets defs_s, unionManyNameSets uses_s))
430 (defs_s, uses_s, binds_s, sigs_s) = unzip4 cycle
431 this_gp_binds = foldr1 AndMonoBinds binds_s
432 this_gp_sigs = foldr1 (++) sigs_s
436 %************************************************************************
438 \subsubsection[dep-Sigs]{Signatures (and user-pragmas for values)}
440 %************************************************************************
442 @renameSigs@ checks for:
444 \item more than one sig for one thing;
445 \item signatures given for things not bound here;
446 \item with suitably flaggery, that all top-level things have type signatures.
449 At the moment we don't gather free-var info from the types in
450 signatures. We'd only need this if we wanted to report unused tyvars.
453 checkSigs :: (RenamedSig -> Bool) -- OK-sig predicbate
456 checkSigs ok_sig sigs
457 -- Check for (a) duplicate signatures
458 -- (b) signatures for things not in this group
459 -- Well, I can't see the check for (a)... ToDo!
460 = mappM_ unknownSigErr bad_sigs
462 bad_sigs = filter (not . ok_sig) sigs
464 -- We use lookupSigOccRn in the signatures, which is a little bit unsatisfactory
465 -- because this won't work for:
466 -- instance Foo T where
469 -- We'll just rename the INLINE prag to refer to whatever other 'op'
470 -- is in scope. (I'm assuming that Baz.op isn't in scope unqualified.)
471 -- Doesn't seem worth much trouble to sort this.
473 renameSigs :: [Sig RdrName] -> RnM [Sig Name]
474 renameSigs sigs = mappM renameSig (filter (not . isFixitySig) sigs)
475 -- Remove fixity sigs which have been dealt with already
477 renameSig :: Sig RdrName -> RnM (Sig Name)
478 -- ClassOpSig, FixitSig is renamed elsewhere.
479 renameSig (Sig v ty src_loc)
480 = addSrcLoc src_loc $
481 lookupSigOccRn v `thenM` \ new_v ->
482 rnHsSigType (quotes (ppr v)) ty `thenM` \ new_ty ->
483 returnM (Sig new_v new_ty src_loc)
485 renameSig (SpecInstSig ty src_loc)
486 = addSrcLoc src_loc $
487 rnHsType (text "A SPECIALISE instance pragma") ty `thenM` \ new_ty ->
488 returnM (SpecInstSig new_ty src_loc)
490 renameSig (SpecSig v ty src_loc)
491 = addSrcLoc src_loc $
492 lookupSigOccRn v `thenM` \ new_v ->
493 rnHsSigType (quotes (ppr v)) ty `thenM` \ new_ty ->
494 returnM (SpecSig new_v new_ty src_loc)
496 renameSig (InlineSig b v p src_loc)
497 = addSrcLoc src_loc $
498 lookupSigOccRn v `thenM` \ new_v ->
499 returnM (InlineSig b new_v p src_loc)
503 %************************************************************************
505 \subsection{Error messages}
507 %************************************************************************
512 addErr (sep [ptext SLIT("Duplicate") <+> what_it_is <> colon,
515 (what_it_is, loc) = hsSigDoc sig
519 addErr (sep [ptext SLIT("Misplaced") <+> what_it_is <> colon,
522 (what_it_is, loc) = hsSigDoc sig
525 = addSrcLoc (nameSrcLoc var) $
526 addWarn (sep [ptext SLIT("Definition but no type signature for"), quotes (ppr var)])
529 = hang (ptext SLIT("Can't handle multiple methods defined by one pattern binding"))