2 % (c) The University of Glasgow, 2000
4 \section[HscTypes]{Types for the per-module compiler}
8 ModDetails(..), GlobalSymbolTable,
9 HomeSymbolTable, PackageSymbolTable,
11 TyThing(..), lookupTypeEnv,
13 WhetherHasOrphans, ImportVersion, ExportItem,
14 PersistentRenamerState(..), IsBootInterface, Avails, DeclsMap,
15 IfaceInsts, IfaceRules, DeprecationEnv, OrigNameEnv,
16 AvailEnv, AvailInfo, GenAvailInfo(..),
17 PersistentCompilerState(..),
19 InstEnv, ClsInstEnv, DFunId,
21 GlobalRdrEnv, RdrAvailInfo,
24 Provenance(..), ImportReason(..), PrintUnqualified,
25 pprNameProvenance, hasBetterProv
29 #include "HsVersions.h"
31 import Name ( Name, NameEnv, NamedThing,
32 unitNameEnv, extendNameEnv, plusNameEnv,
33 lookupNameEnv, emptyNameEnv, getName, nameModule,
35 import Module ( Module, ModuleName,
36 extendModuleEnv, lookupModuleEnv )
37 import Class ( Class )
38 import OccName ( OccName )
39 import RdrName ( RdrNameEnv, emptyRdrEnv )
40 import Outputable ( SDoc )
41 import UniqFM ( UniqFM )
42 import FiniteMap ( FiniteMap, emptyFM, addToFM, lookupFM, foldFM )
45 import VarEnv ( IdEnv, emptyVarEnv )
46 import BasicTypes ( Version, Fixity, defaultFixity )
47 import TyCon ( TyCon )
48 import ErrUtils ( ErrMsg, WarnMsg )
49 import CmLink ( Linkable )
50 import RdrHsSyn ( RdrNameInstDecl, RdrNameRuleDecl, RdrNameHsDecl,
51 RdrNameDeprecation, RdrNameFixitySig )
52 import UniqSupply ( UniqSupply )
53 import HsDecls ( DeprecTxt )
54 import CoreSyn ( CoreRule )
55 import NameSet ( NameSet )
57 import VarSet ( TyVarSet )
58 import Panic ( panic )
60 import SrcLoc ( SrcLoc, isGoodSrcLoc )
63 %************************************************************************
65 \subsection{Symbol tables and Module details}
67 %************************************************************************
69 A @ModIface@ plus a @ModDetails@ summarises everything we know
70 about a compiled module. The @ModIface@ is the stuff *before* linking,
71 and can be written out to an interface file. The @ModDetails@ is after
72 linking; it is the "linked" form of the mi_decls field.
77 md_module :: Module, -- Complete with package info
78 md_version :: VersionInfo, -- Module version number
79 md_orphan :: WhetherHasOrphans, -- Whether this module has orphans
80 md_usages :: [ImportVersion Name], -- Usages
82 md_exports :: Avails, -- What it exports
83 md_globals :: GlobalRdrEnv, -- Its top level environment
85 md_fixities :: NameEnv Fixity, -- Fixities
86 md_deprecs :: NameEnv DeprecTxt, -- Deprecations
88 -- The next three fields are created by the typechecker
90 md_insts :: [DFunId], -- Dfun-ids for the instances in this module
91 md_rules :: RuleEnv -- Domain may include Ids from other modules
97 emptyModDetails :: Module -> ModDetails
99 = ModDetails { md_id = mod,
101 md_globals = emptyRdrEnv,
102 md_fixities = emptyNameEnv,
103 md_deprecs = emptyNameEnv,
104 md_types = emptyNameEnv,
106 md_rules = emptyRuleEnv
110 Symbol tables map modules to ModDetails:
113 type SymbolTable = ModuleEnv ModDetails
114 type HomeSymbolTable = SymbolTable -- Domain = modules in the home package
115 type PackageSymbolTable = SymbolTable -- Domain = modules in the some other package
116 type GlobalSymbolTable = SymbolTable -- Domain = all modules
119 Simple lookups in the symbol table.
122 lookupFixityEnv :: SymbolTable -> Name -> Maybe Fixity
123 -- Returns defaultFixity if there isn't an explicit fixity
124 lookupFixityEnv tbl name
125 = case lookupModuleEnv tbl (nameModule name) of
127 Just details -> lookupNameEnv (md_fixities details) name
131 %************************************************************************
133 \subsection{Type environment stuff}
135 %************************************************************************
138 type TypeEnv = NameEnv TyThing
140 data TyThing = AnId Id
144 instance NamedThing TyThing where
145 getName (AnId id) = getName id
146 getName (ATyCon tc) = getName tc
147 getName (AClass cl) = getName cl
152 lookupTypeEnv :: SymbolTable -> Name -> Maybe TyThing
153 lookupTypeEnv tbl name
154 = case lookupModuleEnv tbl (nameModule name) of
155 Just details -> lookupNameEnv (md_types details) name
159 groupTyThings :: [TyThing] -> FiniteMap Module TypeEnv
160 -- Finite map because we want the range too
162 = foldl add emptyFM things
164 add :: FiniteMap Module TypeEnv -> TyThing -> FiniteMap Module TypeEnv
165 add tbl thing = addToFM tbl mod new_env
168 mod = nameModule name
169 new_env = case lookupFM tbl mod of
170 Nothing -> unitNameEnv name thing
171 Just env -> extendNameEnv env name thing
173 extendTypeEnv :: SymbolTable -> FiniteMap Module TypeEnv -> SymbolTable
174 extendTypeEnv tbl things
175 = foldFM add tbl things
178 = panic "extendTypeEnv" --extendModuleEnv mod new_details
181 = case lookupModuleEnv tbl mod of
182 Nothing -> (emptyModDetails mod) {md_types = type_env}
183 Just details -> details {md_types = md_types details
184 `plusNameEnv` type_env}
188 %************************************************************************
190 \subsection{Auxiliary types}
192 %************************************************************************
194 These types are defined here because they are mentioned in ModDetails,
195 but they are mostly elaborated elsewhere
203 declVers :: NameEnv Version
206 type DeprecationEnv = NameEnv DeprecTxt -- Give reason for deprecation
208 type InstEnv = UniqFM ClsInstEnv -- Maps Class to instances for that class
209 type ClsInstEnv = [(TyVarSet, [Type], DFunId)] -- The instances for a particular class
212 type RuleEnv = IdEnv [CoreRule]
214 emptyRuleEnv = emptyVarEnv
219 type Avails = [AvailInfo]
220 type AvailInfo = GenAvailInfo Name
221 type RdrAvailInfo = GenAvailInfo OccName
223 data GenAvailInfo name = Avail name -- An ordinary identifier
224 | AvailTC name -- The name of the type or class
225 [name] -- The available pieces of type/class.
226 -- NB: If the type or class is itself
227 -- to be in scope, it must be in this list.
228 -- Thus, typically: AvailTC Eq [Eq, ==, /=]
230 -- Equality used when deciding if the interface has changed
232 type AvailEnv = NameEnv AvailInfo -- Maps a Name to the AvailInfo that contains it
236 %************************************************************************
238 \subsection{ModIface}
240 %************************************************************************
243 type ExportItem = (ModuleName, [RdrAvailInfo])
245 type ImportVersion name = (ModuleName, WhetherHasOrphans, IsBootInterface, WhatsImported name)
247 type ModVersionInfo = (Version, -- Version of the whole module
248 Version, -- Version number for all fixity decls together
249 Version) -- ...ditto all rules together
251 type WhetherHasOrphans = Bool
253 -- * an instance decl in a module other than the defn module for
254 -- one of the tycons or classes in the instance head
255 -- * a transformation rule in a module other than the one defining
256 -- the function in the head of the rule.
258 type IsBootInterface = Bool
260 data WhatsImported name = NothingAtAll -- The module is below us in the
261 -- hierarchy, but we import nothing
263 | Everything Version -- The module version
265 | Specifically Version -- Module version
266 Version -- Fixity version
267 Version -- Rules version
268 [(name,Version)] -- List guaranteed non-empty
270 -- 'Specifically' doesn't let you say "I imported f but none of the fixities in
271 -- the module". If you use anything in the module you get its fixity and rule version
272 -- So if the fixities or rules change, you'll recompile, even if you don't use either.
273 -- This is easy to implement, and it's safer: you might not have used the rules last
274 -- time round, but if someone has added a new rule you might need it this time
276 -- 'Everything' means there was a "module M" in
277 -- this module's export list, so we just have to go by M's version,
278 -- not the list of (name,version) pairs
282 %************************************************************************
284 \subsection{The persistent compiler state}
286 %************************************************************************
289 data PersistentCompilerState
291 pcs_PST :: PackageSymbolTable, -- Domain = non-home-package modules
292 -- except that the InstEnv components is empty
293 pcs_insts :: InstEnv, -- The total InstEnv accumulated from all
294 -- the non-home-package modules
295 pcs_rules :: RuleEnv, -- Ditto RuleEnv
297 pcs_PRS :: PersistentRenamerState
301 The @PersistentRenamerState@ persists across successive calls to the
305 * A name supply, which deals with allocating unique names to
306 (Module,OccName) original names,
308 * An accumulated InstEnv from all the modules in pcs_PST
309 The point is that we don't want to keep recreating it whenever
310 we compile a new module. The InstEnv component of pcPST is empty.
311 (This means we might "see" instances that we shouldn't "really" see;
312 but the Haskell Report is vague on what is meant to be visible,
313 so we just take the easy road here.)
317 * A "holding pen" for declarations that have been read out of
318 interface files but not yet sucked in, renamed, and typechecked
321 data PersistentRenamerState
322 = PRS { prsOrig :: OrigNameEnv,
323 prsDecls :: DeclsMap,
324 prsInsts :: IfaceInsts,
325 prsRules :: IfaceRules
329 The OrigNameEnv makes sure that there is just one Unique assigned for
330 each original name; i.e. (module-name, occ-name) pair. The Name is
331 always stored as a Global, and has the SrcLoc of its binding location.
332 Actually that's not quite right. When we first encounter the original
333 name, we might not be at its binding site (e.g. we are reading an
334 interface file); so we give it 'noSrcLoc' then. Later, when we find
335 its binding site, we fix it up.
337 Exactly the same is true of the Module stored in the Name. When we first
338 encounter the occurrence, we may not know the details of the module, so
339 we just store junk. Then when we find the binding site, we fix it up.
343 = Orig { origNames :: FiniteMap (ModuleName,OccName) Name, -- Ensures that one original name gets one unique
344 origIParam :: FiniteMap OccName Name -- Ensures that one implicit parameter name gets one unique
349 A DeclsMap contains a binding for each Name in the declaration
350 including the constructors of a type decl etc. The Bool is True just
354 type DeclsMap = NameEnv (AvailInfo, Bool, (Module, RdrNameHsDecl))
356 type IfaceInsts = Bag GatedDecl
357 type IfaceRules = Bag GatedDecl
359 type GatedDecl = (NameSet, (Module, RdrNameHsDecl))
363 %************************************************************************
365 \subsection{The result of compiling one module}
367 %************************************************************************
371 = CompOK ModDetails -- new details (HST additions)
372 (Maybe (ModIFace, Linkable))
373 -- summary and code; Nothing => compilation not reqd
374 -- (old summary and code are still valid)
375 PersistentCompilerState -- updated PCS
376 (Bag WarnMsg) -- warnings
378 | CompErrs PersistentCompilerState -- updated PCS
379 (Bag ErrMsg) -- errors
380 (Bag WarnMsg) -- warnings
383 -- The driver sits between 'compile' and 'hscMain', translating calls
384 -- to the former into calls to the latter, and results from the latter
385 -- into results from the former. It does things like preprocessing
386 -- the .hs file if necessary, and compiling up the .stub_c files to
387 -- generate Linkables.
390 = HscOK ModDetails -- new details (HomeSymbolTable additions)
391 (Maybe ModIFace) -- new iface (if any compilation was done)
392 (Maybe String) -- generated stub_h filename (in /tmp)
393 (Maybe String) -- generated stub_c filename (in /tmp)
394 PersistentCompilerState -- updated PCS
397 | HscErrs PersistentCompilerState -- updated PCS
402 -- These two are only here to avoid recursion between CmCompile and
403 -- CompManager. They really ought to be in the latter.
404 type ModuleEnv a = UniqFM a -- Domain is Module
406 type HomeModMap = FiniteMap ModuleName Module -- domain: home mods only
407 type HomeInterfaceTable = ModuleEnv ModIFace
411 %************************************************************************
413 \subsection{Provenance and export info}
415 %************************************************************************
417 The GlobalRdrEnv gives maps RdrNames to Names. There is a separate
418 one for each module, corresponding to that module's top-level scope.
421 type GlobalRdrEnv = RdrNameEnv [(Name,Provenance)] -- The list is because there may be name clashes
422 -- These only get reported on lookup,
423 -- not on construction
426 The "provenance" of something says how it came to be in scope.
430 = LocalDef -- Defined locally
432 | NonLocalDef -- Defined non-locally
437 Moved here from Name.
438 pp_prov (LocalDef _ Exported) = char 'x'
439 pp_prov (LocalDef _ NotExported) = char 'l'
440 pp_prov (NonLocalDef ImplicitImport _) = char 'j'
441 pp_prov (NonLocalDef (UserImport _ _ True ) _) = char 'I' -- Imported by name
442 pp_prov (NonLocalDef (UserImport _ _ False) _) = char 'i' -- Imported by ..
443 pp_prov SystemProv = char 's'
447 = UserImport Module SrcLoc Bool -- Imported from module M on line L
448 -- Note the M may well not be the defining module
450 -- The Bool is true iff the thing was named *explicitly* in the import spec,
451 -- rather than being imported as part of a group; e.g.
454 -- Here, everything imported by B, and the constructors of T
455 -- are not named explicitly; only T is named explicitly.
456 -- This info is used when warning of unused names.
458 | ImplicitImport -- Imported implicitly for some other reason
461 type PrintUnqualified = Bool -- True <=> the unqualified name of this thing is
462 -- in scope in this module, so print it
463 -- unqualified in error messages
467 hasBetterProv :: Provenance -> Provenance -> Bool
469 -- a local thing over an imported thing
470 -- a user-imported thing over a non-user-imported thing
471 -- an explicitly-imported thing over an implicitly imported thing
472 hasBetterProv LocalDef _ = True
473 hasBetterProv (NonLocalDef (UserImport _ _ True) _) _ = True
474 hasBetterProv (NonLocalDef (UserImport _ _ _ ) _) (NonLocalDef ImplicitImport _) = True
475 hasBetterProv _ _ = False
477 pprNameProvenance :: Name -> Provenance -> SDoc
478 pprNameProvenance name LocalDef = ptext SLIT("defined at") <+> ppr (nameSrcLoc name)
479 pprNameProvenance name (NonLocalDef why _) = sep [ppr_reason why,
480 nest 2 (parens (ppr_defn (nameSrcLoc name)))]
482 ppr_reason ImplicitImport = ptext SLIT("implicitly imported")
483 ppr_reason (UserImport mod loc _) = ptext SLIT("imported from") <+> ppr mod <+> ptext SLIT("at") <+> ppr loc
485 ppr_defn loc | isGoodSrcLoc loc = ptext SLIT("at") <+> ppr loc