2 % (c) The GRASP/AQUA Project, Glasgow University, 1992-1997
4 \section[RnMonad]{The monad used by the renamer}
7 #include "HsVersions.h"
11 -- close it up (partly done to allow unfoldings)
17 SYN_IE(RdrNameHsDecl),
18 SYN_IE(RdrNameInstDecl),
28 #if __GLASGOW_HASKELL__ <= 201
29 import PreludeGlaST ( SYN_IE(ST), thenStrictlyST, returnStrictlyST )
36 #define IOError13 IOError
42 import BasicTypes ( SYN_IE(Version), NewOrData )
43 import ErrUtils ( addErrLoc, addShortErrLocLine, addShortWarnLocLine,
44 pprBagOfErrors, SYN_IE(Error), SYN_IE(Warning)
46 import Name ( SYN_IE(Module), Name, OccName, Provenance, SYN_IE(NameSet), emptyNameSet,
48 modAndOcc, NamedThing(..)
50 import CmdLineOpts ( opt_D_show_rn_trace, opt_IgnoreIfacePragmas )
51 import PrelInfo ( builtinNames )
52 import TyCon ( TyCon {- instance NamedThing -} )
53 import TysWiredIn ( boolTyCon )
55 import Outputable ( PprStyle(..) )
56 import SrcLoc ( SrcLoc, mkGeneratedSrcLoc )
57 import Unique ( Unique )
58 import UniqFM ( UniqFM )
59 import FiniteMap ( FiniteMap, emptyFM, bagToFM )
60 import Bag ( Bag, mapBag, emptyBag, isEmptyBag, snocBag )
63 #if __GLASGOW_HASKELL__ >= 202
67 infixr 9 `thenRn`, `thenRn_`
71 %************************************************************************
73 \subsection{Somewhat magical interface to other monads}
75 %************************************************************************
78 #if __GLASGOW_HASKELL__ >= 200
79 # define REAL_WORLD RealWorld
81 # define REAL_WORLD _RealWorld
86 sstToIO :: SST REAL_WORLD r -> IO r
89 sstToST sst `thenStrictlyST` \ r ->
90 returnStrictlyST (Right r))
92 ioToRnMG :: IO r -> RnMG (Either IOError13 r)
93 ioToRnMG (MkIO io) rn_down g_down = stToSST io
95 traceRn :: Doc -> RnMG ()
96 traceRn msg | opt_D_show_rn_trace = ioToRnMG (hPutStr stderr (show msg) >>
97 hPutStr stderr "\n") `thenRn_`
99 | otherwise = returnRn ()
103 %************************************************************************
105 \subsection{Data types}
107 %************************************************************************
109 ===================================================
111 ===================================================
114 type RnM s d r = RnDown s -> d -> SST s r
115 type RnMS s r = RnM s (SDown s) r -- Renaming source
116 type RnMG r = RnM REAL_WORLD GDown r -- Getting global names etc
117 type MutVar a = MutableVar REAL_WORLD a -- ToDo: there ought to be a standard defn of this
120 data RnDown s = RnDown
122 (MutableVar s RnNameSupply)
123 (MutableVar s (Bag Warning, Bag Error))
124 (MutableVar s ([Name],[Name])) -- Occurrences: compulsory and optional resp
126 data Necessity = Compulsory | Optional -- We *must* find definitions for
127 -- compulsory occurrences; we *may* find them
128 -- for optional ones.
130 -- For getting global names
135 -- For renaming source code
138 NameEnv -- Local name envt (includes global name envt,
139 -- but may shadow it)
144 data RnSMode = SourceMode -- Renaming source code
145 | InterfaceMode Necessity -- Renaming interface declarations. The "necessity"
146 -- flag says free variables *must* be found and slurped
147 -- or whether they need not be. For value signatures of
148 -- things that are themselves compulsorily imported
149 -- we arrange that the type signature is read in compulsory mode,
150 -- but the pragmas in optional mode.
152 type SearchPath = [(String,String)] -- List of (directory,suffix) pairs to search
153 -- for interface files.
154 type FreeVars = NameSet
157 ===================================================
159 ===================================================
162 type RnNameSupply = (UniqSupply, Int, FiniteMap (Module,OccName) Name)
163 -- Ensures that one (m,n) pair gets one unique
164 -- The Int is used to give a number to each instance declaration;
165 -- it's really a separate name supply.
167 data RnEnv = RnEnv NameEnv FixityEnv
168 emptyRnEnv = RnEnv emptyNameEnv emptyFixityEnv
170 type NameEnv = FiniteMap RdrName Name
171 emptyNameEnv = emptyFM
173 type FixityEnv = FiniteMap RdrName (Fixity, Provenance)
174 emptyFixityEnv = emptyFM
175 -- It's possible to have a different fixity for B.op than for op:
177 -- module A( op ) where module B where
178 -- import qualified B( op ) infixr 2 op
179 -- infixl 9 `op` op = ...
180 -- op a b = a `B.op` b
182 data ExportEnv = ExportEnv Avails Fixities
183 type Avails = [AvailInfo]
184 type Fixities = [(OccName, (Fixity, Provenance))]
185 -- Can contain duplicates, if one module defines the same fixity,
186 -- or the same type/class/id, more than once. Hence a boring old list.
187 -- This allows us to report duplicates in just one place, namely plusRnEnv.
189 type ExportAvails = (FiniteMap Module Avails, -- Used to figure out "module M" export specifiers
190 -- Includes avails only from *unqualified* imports
191 -- (see 1.4 Report Section 5.1.1)
193 UniqFM AvailInfo) -- Used to figure out all other export specifiers.
194 -- Maps a Name to the AvailInfo that contains it
195 -- NB: Contain bindings for class ops but
196 -- not constructors (see defn of availEntityNames)
199 data GenAvailInfo name = NotAvailable
200 | Avail name -- An ordinary identifier
201 | AvailTC name -- The name of the type or class
202 [name] -- The available pieces of type/class. NB: If the type or
203 -- class is itself to be in scope, it must be in this list.
204 -- Thus, typically: AvailTC Eq [Eq, ==, /=]
205 type AvailInfo = GenAvailInfo Name
206 type RdrAvailInfo = GenAvailInfo OccName
209 ===================================================
211 ===================================================
214 type ExportItem = (Module, IfaceFlavour, [RdrAvailInfo])
215 type VersionInfo name = [ImportVersion name]
216 type ImportVersion name = (Module, IfaceFlavour, Version, [LocalVersion name])
217 type LocalVersion name = (name, Version)
221 Module -- Module name
222 Version -- Module version number
223 [ImportVersion OccName] -- Usages
224 [ExportItem] -- Exports
225 [Module] -- Special instance modules
226 [(OccName,Fixity)] -- Fixities
227 [(Version, RdrNameHsDecl)] -- Local definitions
228 [RdrNameInstDecl] -- Local instance declarations
230 type InterfaceDetails = (VersionInfo Name, -- Version information
231 ExportEnv, -- What this module exports
232 [Module]) -- Instance modules
234 type RdrNamePragma = () -- Fudge for now
238 Module -- Name of this module
239 (FiniteMap Module (IfaceFlavour, -- Exports
245 NameSet -- All the names (whether "big" or "small", whether wired-in or not,
246 -- whether locally defined or not) that have been slurped in so far.
248 [(Name,Version)] -- All the (a) non-wired-in (b) "big" (c) non-locally-defined names that
249 -- have been slurped in so far, with their versions.
250 -- This is used to generate the "usage" information for this module.
251 -- Subset of the previous field.
253 (Bag IfaceInst, NameSet) -- The as-yet un-slurped instance decls; this bag is depleted when we
254 -- slurp an instance decl so that we don't slurp the same one twice.
255 -- Together with them is the set of tycons/classes that may allow
256 -- the instance decls in.
258 (FiniteMap Name RdrNameTyDecl)
259 -- Deferred data type declarations; each has the following properties
260 -- * it's a data type decl
261 -- * its TyCon is needed
262 -- * the decl may or may not have been slurped, depending on whether any
263 -- of the constrs are needed.
265 [Module] -- Set of modules with "special" instance declarations
266 -- Excludes this module
269 type DeclsMap = FiniteMap Name (Version, AvailInfo, RdrNameHsDecl)
270 type IfaceInst = ((Module, RdrNameInstDecl), -- Instance decl
271 [Name]) -- "Gate" names. Slurp this instance decl when this
272 -- list becomes empty. It's depleted whenever we
273 -- slurp another type or class decl.
277 %************************************************************************
279 \subsection{Main monad code}
281 %************************************************************************
284 initRn :: Module -> UniqSupply -> SearchPath -> SrcLoc
286 -> IO (r, Bag Error, Bag Warning)
288 initRn mod us dirs loc do_rn
290 newMutVarSST (us, 1, builtins) `thenSST` \ names_var ->
291 newMutVarSST (emptyBag,emptyBag) `thenSST` \ errs_var ->
292 newMutVarSST (emptyIfaces mod) `thenSST` \ iface_var ->
293 newMutVarSST initOccs `thenSST` \ occs_var ->
295 rn_down = RnDown loc names_var errs_var occs_var
296 g_down = GDown dirs iface_var
299 do_rn rn_down g_down `thenSST` \ res ->
301 -- grab errors and return
302 readMutVarSST errs_var `thenSST` \ (warns,errs) ->
303 returnSST (res, errs, warns)
306 initRnMS :: RnEnv -> Module -> RnSMode -> RnMS REAL_WORLD r -> RnMG r
307 initRnMS rn_env@(RnEnv name_env _) mod_name mode m rn_down g_down
309 s_down = SDown rn_env name_env mod_name mode
314 emptyIfaces :: Module -> Ifaces
315 emptyIfaces mod = Ifaces mod emptyFM emptyFM emptyNameSet [] (emptyBag, emptyNameSet) emptyFM []
317 builtins :: FiniteMap (Module,OccName) Name
318 builtins = bagToFM (mapBag (\ name -> (modAndOcc name, name)) builtinNames)
320 -- Initial value for the occurrence pool.
321 initOccs :: ([Name],[Name]) -- Compulsory and optional respectively
322 initOccs = ([getName boolTyCon], [])
323 -- Booleans occur implicitly a lot, so it's tiresome to keep recording the fact, and
324 -- rather implausible that not one will be used in the module.
325 -- We could add some other common types, notably lists, but the general idea is
326 -- to do as much as possible explicitly.
332 @renameSourceCode@ is used to rename stuff "out-of-line"; that is, not as part of
333 the main renamer. Examples: pragmas (which we don't want to rename unless
334 we actually explore them); and derived definitions, which are only generated
337 The @RnNameSupply@ includes a @UniqueSupply@, so if you call it more than
338 once you must either split it, or install a fresh unique supply.
341 renameSourceCode :: Module
346 -- Alas, we can't use the real runST, with the desired signature:
347 -- renameSourceCode :: RnNameSupply -> RnMS s r -> r
348 -- because we can't manufacture "new versions of runST".
350 renameSourceCode mod_name name_supply m
352 newMutVarSST name_supply `thenSST` \ names_var ->
353 newMutVarSST (emptyBag,emptyBag) `thenSST` \ errs_var ->
354 newMutVarSST ([],[]) `thenSST` \ occs_var ->
356 rn_down = RnDown mkGeneratedSrcLoc names_var errs_var occs_var
357 s_down = SDown emptyRnEnv emptyNameEnv mod_name (InterfaceMode Compulsory)
359 m rn_down s_down `thenSST` \ result ->
361 readMutVarSST errs_var `thenSST` \ (warns,errs) ->
363 (if not (isEmptyBag errs) then
364 trace ("Urk! renameSourceCode found errors" ++ display errs)
365 else if not (isEmptyBag warns) then
366 trace ("Urk! renameSourceCode found warnings" ++ display warns)
373 display errs = show (pprBagOfErrors PprDebug errs)
375 {-# INLINE thenRn #-}
376 {-# INLINE thenRn_ #-}
377 {-# INLINE returnRn #-}
380 returnRn :: a -> RnM s d a
381 thenRn :: RnM s d a -> (a -> RnM s d b) -> RnM s d b
382 thenRn_ :: RnM s d a -> RnM s d b -> RnM s d b
383 andRn :: (a -> a -> a) -> RnM s d a -> RnM s d a -> RnM s d a
384 mapRn :: (a -> RnM s d b) -> [a] -> RnM s d [b]
385 sequenceRn :: [RnM s d a] -> RnM s d [a]
386 foldlRn :: (b -> a -> RnM s d b) -> b -> [a] -> RnM s d b
387 mapAndUnzipRn :: (a -> RnM s d (b,c)) -> [a] -> RnM s d ([b],[c])
388 fixRn :: (a -> RnM s d a) -> RnM s d a
390 returnRn v gdown ldown = returnSST v
391 thenRn m k gdown ldown = m gdown ldown `thenSST` \ r -> k r gdown ldown
392 thenRn_ m k gdown ldown = m gdown ldown `thenSST_` k gdown ldown
393 fixRn m gdown ldown = fixSST (\r -> m r gdown ldown)
394 andRn combiner m1 m2 gdown ldown
395 = m1 gdown ldown `thenSST` \ res1 ->
396 m2 gdown ldown `thenSST` \ res2 ->
397 returnSST (combiner res1 res2)
399 sequenceRn [] = returnRn []
400 sequenceRn (m:ms) = m `thenRn` \ r ->
401 sequenceRn ms `thenRn` \ rs ->
404 mapRn f [] = returnRn []
406 = f x `thenRn` \ r ->
407 mapRn f xs `thenRn` \ rs ->
410 foldlRn k z [] = returnRn z
411 foldlRn k z (x:xs) = k z x `thenRn` \ z' ->
414 mapAndUnzipRn f [] = returnRn ([],[])
415 mapAndUnzipRn f (x:xs)
416 = f x `thenRn` \ (r1, r2) ->
417 mapAndUnzipRn f xs `thenRn` \ (rs1, rs2) ->
418 returnRn (r1:rs1, r2:rs2)
420 mapAndUnzip3Rn f [] = returnRn ([],[],[])
421 mapAndUnzip3Rn f (x:xs)
422 = f x `thenRn` \ (r1, r2, r3) ->
423 mapAndUnzip3Rn f xs `thenRn` \ (rs1, rs2, rs3) ->
424 returnRn (r1:rs1, r2:rs2, r3:rs3)
429 %************************************************************************
431 \subsection{Boring plumbing for common part}
433 %************************************************************************
436 ================ Errors and warnings =====================
439 failWithRn :: a -> Error -> RnM s d a
440 failWithRn res msg (RnDown loc names_var errs_var occs_var) l_down
441 = readMutVarSST errs_var `thenSST` \ (warns,errs) ->
442 writeMutVarSST errs_var (warns, errs `snocBag` err) `thenSST_`
445 err = addShortErrLocLine loc msg
447 warnWithRn :: a -> Warning -> RnM s d a
448 warnWithRn res msg (RnDown loc names_var errs_var occs_var) l_down
449 = readMutVarSST errs_var `thenSST` \ (warns,errs) ->
450 writeMutVarSST errs_var (warns `snocBag` warn, errs) `thenSST_`
453 warn = addShortWarnLocLine loc msg
455 addErrRn :: Error -> RnM s d ()
456 addErrRn err = failWithRn () err
458 checkRn :: Bool -> Error -> RnM s d () -- Check that a condition is true
459 checkRn False err = addErrRn err
460 checkRn True err = returnRn ()
462 addWarnRn :: Warning -> RnM s d ()
463 addWarnRn warn = warnWithRn () warn
465 checkErrsRn :: RnM s d Bool -- True <=> no errors so far
466 checkErrsRn (RnDown loc names_var errs_var occs_var) l_down
467 = readMutVarSST errs_var `thenSST` \ (warns,errs) ->
468 returnSST (isEmptyBag errs)
472 ================ Source location =====================
475 pushSrcLocRn :: SrcLoc -> RnM s d a -> RnM s d a
476 pushSrcLocRn loc' m (RnDown loc names_var errs_var occs_var) l_down
477 = m (RnDown loc' names_var errs_var occs_var) l_down
479 getSrcLocRn :: RnM s d SrcLoc
480 getSrcLocRn (RnDown loc names_var errs_var occs_var) l_down
484 ================ Name supply =====================
487 getNameSupplyRn :: RnM s d RnNameSupply
488 getNameSupplyRn (RnDown loc names_var errs_var occs_var) l_down
489 = readMutVarSST names_var
491 setNameSupplyRn :: RnNameSupply -> RnM s d ()
492 setNameSupplyRn names' (RnDown loc names_var errs_var occs_var) l_down
493 = writeMutVarSST names_var names'
495 -- The "instance-decl unique supply", inst, is just an integer that's used to
496 -- give a unique number for each instance declaration.
497 newInstUniq :: RnM s d Int
498 newInstUniq (RnDown loc names_var errs_var occs_var) l_down
499 = readMutVarSST names_var `thenSST` \ (us, inst, cache) ->
500 writeMutVarSST names_var (us, inst+1, cache) `thenSST_`
504 ================ Occurrences =====================
506 Every time we get an occurrence of a name we put it in one of two lists:
507 one for "compulsory" occurrences
508 one for "optional" occurrences
510 The significance of "compulsory" is
511 (a) we *must* find the declaration
512 (b) in the case of type or class names, the name is part of the
513 source level program, and we must slurp in any instance decls
516 We don't need instance decls "optional" names, because the type inference
517 process will never come across them. Optional names are buried inside
518 type checked (but not renamed) cross-module unfoldings and such.
520 The pair of lists is held in a mutable variable in RnDown.
522 The lists are kept separate so that we can process all the compulsory occurrences
523 before any of the optional ones. Why? Because suppose we processed an optional
524 "g", and slurped an interface decl of g::T->T. Then we'd rename the type T->T in
525 optional mode. But if we later need g compulsorily we'll find that it's already
526 been slurped and will do nothing. We could, I suppose, rename it a second time,
527 but it seems simpler just to do all the compulsory ones first.
530 addOccurrenceName :: Name -> RnMS s Name -- Same name returned as passed
531 addOccurrenceName name (RnDown loc names_var errs_var occs_var)
532 (SDown rn_env local_env mod_name mode)
533 | isLocallyDefinedName name ||
534 not_necessary necessity
538 = readMutVarSST occs_var `thenSST` \ (comp_occs, opt_occs) ->
540 new_occ_pair = case necessity of
541 Optional -> (comp_occs, name:opt_occs)
542 Compulsory -> (name:comp_occs, opt_occs)
544 writeMutVarSST occs_var new_occ_pair `thenSST_`
547 necessity = case mode of
548 SourceMode -> Compulsory
549 InterfaceMode necessity -> necessity
552 addOccurrenceNames :: [Name] -> RnMS s ()
553 addOccurrenceNames names (RnDown loc names_var errs_var occs_var)
554 (SDown rn_env local_env mod_name mode)
555 | not_necessary necessity
559 = readMutVarSST occs_var `thenSST` \ (comp_occs, opt_occs) ->
561 new_occ_pair = case necessity of
562 Optional -> (comp_occs, non_local_names ++ opt_occs)
563 Compulsory -> (non_local_names ++ comp_occs, opt_occs)
565 writeMutVarSST occs_var new_occ_pair
567 non_local_names = filter (not . isLocallyDefinedName) names
568 necessity = case mode of
569 SourceMode -> Compulsory
570 InterfaceMode necessity -> necessity
572 -- Never look for optional things if we're
573 -- ignoring optional input interface information
574 not_necessary Compulsory = False
575 not_necessary Optional = opt_IgnoreIfacePragmas
577 popOccurrenceName :: Necessity -> RnM s d (Maybe Name)
578 popOccurrenceName necessity (RnDown loc names_var errs_var occs_var) l_down
579 = readMutVarSST occs_var `thenSST` \ occs ->
580 case (necessity, occs) of
581 -- Find a compulsory occurrence
582 (Compulsory, (comp:comps, opts)) -> writeMutVarSST occs_var (comps, opts) `thenSST_`
583 returnSST (Just comp)
585 -- Find an optional occurrence
586 -- We shouldn't be looking unless we've done all the compulsories
587 (Optional, (comps, opt:opts)) -> ASSERT( null comps )
588 writeMutVarSST occs_var (comps, opts) `thenSST_`
591 -- No suitable occurrence
592 other -> returnSST Nothing
594 -- findOccurrencesRn does the enclosed thing with a *fresh* occurrences
595 -- variable, and returns the list of occurrences thus found. It's useful
596 -- when loading instance decls and specialisation signatures, when we want to
597 -- know the names of the things in the types, but we don't want to treat them
600 findOccurrencesRn :: RnM s d a -> RnM s d [Name]
601 findOccurrencesRn enclosed_thing (RnDown loc names_var errs_var occs_var) l_down
602 = newMutVarSST ([],[]) `thenSST` \ new_occs_var ->
603 enclosed_thing (RnDown loc names_var errs_var new_occs_var) l_down `thenSST_`
604 readMutVarSST new_occs_var `thenSST` \ (occs,_) ->
609 %************************************************************************
611 \subsection{Plumbing for rename-source part}
613 %************************************************************************
615 ================ RnEnv =====================
618 getGlobalNameEnv :: RnMS s NameEnv
619 getGlobalNameEnv rn_down (SDown (RnEnv global_env fixity_env) local_env mod_name mode)
620 = returnSST global_env
622 getNameEnv :: RnMS s NameEnv
623 getNameEnv rn_down (SDown rn_env local_env mod_name mode)
624 = returnSST local_env
626 setNameEnv :: NameEnv -> RnMS s a -> RnMS s a
627 setNameEnv local_env' m rn_down (SDown rn_env local_env mod_name mode)
628 = m rn_down (SDown rn_env local_env' mod_name mode)
630 getFixityEnv :: RnMS s FixityEnv
631 getFixityEnv rn_down (SDown (RnEnv name_env fixity_env) local_env mod_name mode)
632 = returnSST fixity_env
635 ================ Module and Mode =====================
638 getModuleRn :: RnMS s Module
639 getModuleRn rn_down (SDown rn_env local_env mod_name mode)
644 getModeRn :: RnMS s RnSMode
645 getModeRn rn_down (SDown rn_env local_env mod_name mode)
648 setModeRn :: RnSMode -> RnMS s a -> RnMS s a
649 setModeRn new_mode thing_inside rn_down (SDown rn_env local_env mod_name mode)
650 = thing_inside rn_down (SDown rn_env local_env mod_name new_mode)
654 %************************************************************************
656 \subsection{Plumbing for rename-globals part}
658 %************************************************************************
661 getIfacesRn :: RnMG Ifaces
662 getIfacesRn rn_down (GDown dirs iface_var)
663 = readMutVarSST iface_var
665 setIfacesRn :: Ifaces -> RnMG ()
666 setIfacesRn ifaces rn_down (GDown dirs iface_var)
667 = writeMutVarSST iface_var ifaces
669 getSearchPathRn :: RnMG SearchPath
670 getSearchPathRn rn_down (GDown dirs iface_var)