2 % (c) The GRASP/AQUA Project, Glasgow University, 1992-1996
4 \section[RnIfaces]{Cacheing and Renaming of Interfaces}
7 #include "HsVersions.h"
19 import PreludeGlaST ( returnPrimIO, thenPrimIO,
20 readVar, writeVar, MutableVar(..) )
29 import RnUtils ( RnEnv(..) )
31 import Bag ( emptyBag )
32 import ErrUtils ( Error(..), Warning(..) )
33 import FiniteMap ( emptyFM, lookupFM, addToFM )
35 import Maybes ( MaybeErr(..) )
42 type IfaceCache = MutableVar _RealWorld (FiniteMap Module ParsedIface,
43 FiniteMap Module FAST_STRING)
45 data ParsedIface = ParsedIface
48 cacheInterface :: IfaceCache -> Module
49 -> PrimIO (MaybeErr ParsedIface Error)
51 cacheInterface iface_var mod
52 = readVar iface_var `thenPrimIO` \ (iface_fm, file_fm) ->
53 case lookupFM iface_fm mod of
54 Just iface -> returnPrimIO (Succeeded iface)
56 case lookupFM file_fm mod of
57 Nothing -> returnPrimIO (Failed (noIfaceErr mod))
59 readInterface file mod `thenPrimIO` \ read_iface ->
61 Failed err -> returnPrimIO (Failed err)
64 iface_fm' = addToFM iface_fm mod iface
66 writeVar iface_var (iface_fm', file_fm) `thenPrimIO` \ _ ->
67 returnPrimIO (Succeeded iface)
70 readInterface :: FAST_STRING -> Module
71 -> PrimIO (MaybeErr ParsedIface Error)
73 readInterface file mod = panic "readInterface"
79 IfaceCache -- iface cache
80 -> RnEnv -- original name env
82 -> RenamedHsModule -- module to extend with iface decls
83 -> [RnName] -- imported names required
84 -> PrimIO (RenamedHsModule, -- extended module
85 ImplicitEnv, -- implicit names required
89 rnInterfaces iface_var occ_env us rn_module todo
90 = returnPrimIO (rn_module, (emptyFM, emptyFM), emptyBag, emptyBag)
96 IfaceCache -- iface cache
97 -> [RnName] -- all imported names required
98 -> [Module] -- directly imported modules
99 -> PrimIO (VersionInfo, -- info about version numbers
100 [Module]) -- special instance modules
102 type VersionInfo = [(Module, Version, [(FAST_STRING, Version)])]
104 finalIfaceInfo iface_var imps_reqd imp_mods
105 = returnPrimIO ([], [])
111 = ppCat [ppStr "Could not find interface for", ppPStr mod]