%
-% (c) The AQUA Project, Glasgow University, 1993-2000
+% (c) The University of Glasgow, 2000
%
\section[CmCompile]{Compiler for GHCI}
\begin{code}
module CmCompile ( cmCompile,
- ModDetails, -- abstract
- ModIFace, -- abstract
- PCS, emptyPCS, -- abstract
- HST, -- not abstract (CM needs to see it)
- HIT, -- ditto
+ ModDetails, -- abstract
+ ModIFace, -- abstract
+ PersistentCompilerState, emptyPCS, -- abstract
+ HomeSymbolTable, -- not abstract (CM needs to see it)
+ HomeInterfaceTable, -- ditto
CompResult(..)
)
where
#include "HsVersions.h"
-import CmLink ( Linkable )
-import Outputable ( SDoc )
-import CmFind ( Finder )
-import CmSummarise ( ModSummary )
-import CmStaticInfo ( SI )
-import FiniteMap ( FiniteMap, emptyFM )
-
-import Module ( Module )
-import RnMonad ( Avails, GlobalRdrEnv, DeclsMap,
- WhetherHasOrphans, ImportVersion,
- IfaceInsts, IfaceRules, ExportItem )
-import TcEnv ( TyThing, InstEnv )
-import Name ( Name, OccName )
-import BasicTypes ( Fixity, Version )
-import Id ( Id )
-import CoreSyn ( CoreRule )
-import RdrHsSyn ( RdrNameDeprecation, RdrNameRuleDecl, RdrNameFixitySig,
- RdrNameHsDecl, RdrNameInstDecl )
-
+-- many of these need to be moved to HscTypes
+--import CmLink ( Linkable(..) )
+--import Outputable ( SDoc )
+--import CmFind ( Finder )
+--import CmSummarise ( ModSummary, name_of_summary )
+--import FiniteMap ( FiniteMap, emptyFM )
+
+--import Module ( Module )
+--import RnMonad ( Avails, GlobalRdrEnv, DeclsMap,
+-- WhetherHasOrphans, ImportVersion,
+-- IfaceInsts, IfaceRules, ExportItem )
+--import TcEnv ( TyThing, InstEnv )
+--import Name ( Name, OccName )
+--import BasicTypes ( Fixity, Version )
+--import Id ( Id )
+--import CoreSyn ( CoreRule )
+--import RdrHsSyn ( RdrNameDeprecation, RdrNameRuleDecl, RdrNameFixitySig,
+-- RdrNameHsDecl, RdrNameInstDecl )
+
+import HscTypes ( )
\end{code}
+
+
+%************************************************************************
+%* *
+\subsection{The main compiler interface}
+%* *
+%************************************************************************
+
+
\begin{code}
-cmCompile :: SI -- obvious
- -> Finder -- to find modules
- -> ModSummary -- summary, including source
- -> Maybe ModIFace -- old interface, if available
- -> HST -- for home module ModDetails
- -> PCS -- IN: persistent compiler state
+cmCompile :: Finder -- to find modules
+ -> ModSummary -- summary, including source
+ -> Maybe ModIFace -- old interface, if available
+ -> HomeModMap -- ModuleName -> Module
+ -> HomeSymbolTable -- for home module ModDetails
+ -> PersistentCompilerState -- IN: persistent compiler state
-> IO CompResult
-cmCompile flags finder summary old_iface hst pcs
- = return (error "cmCompile:unimp")
-
+cmCompile finder summary old_iface hst pcs
+ = do putStrLn ("cmCompile: compiling " ++ name_of_summary summary)
+ return (CompOK (error "cmCompile:modDetails")
+ (Just (error "cmCompile:modIFace",
+ --error "cmCompile:Linkable"
+ --LM (name_of_summary summary) []
+ LM (name_of_summary summary) []
+ ))
+ pcs
+ []
+ )
data CompResult
= CompOK ModDetails -- new details (HST additions)
(Maybe (ModIFace, Linkable))
-- summary and code; Nothing => compilation not reqd
-- (old summary and code are still valid)
- PCS -- updated PCS
- [SDoc] -- warnings
-
- | CompErrs PCS -- updated PCS
- [SDoc] -- warnings and errors
+ PersistentCompilerState -- updated PCS
+ [SDoc] -- warnings
-emptyPCS :: IO PCS
-emptyPCS = return (MkPCS emptyPIT emptyPST emptyHoldingPen)
+ | CompErrs PersistentCompilerState -- updated PCS
+ [SDoc] -- errors
+ [SDoc] -- warnings
-- These two are only here to avoid recursion between CmCompile and
-- CompManager. They really ought to be in the latter.
-type HST = FiniteMap {-really:Module-} String{- == ModName-} ModDetails
-type HIT = FiniteMap {-really:Module-} String{- == ModName-} ModIFace
-
-
-data PCS = MkPCS PIT -- Package interface table
- PST -- Package symbol table
- HoldingPen -- pre slurped interface bits and pieces
-
-type PIT = FiniteMap Module ModIFace
-type PST = FiniteMap Module ModDetails
-
-emptyPIT :: PIT
-emptyPIT = emptyFM
-
-emptyPST :: PST
-emptyPST = emptyFM
-
--- ModIFace is nearly the same as RnMonad.ParsedIface.
--- Right now it's identical :)
-data ModIFace
- = ModIFace {
- mi_mod :: Module, -- Complete with package info
- mi_vers :: Version, -- Module version number
- mi_orphan :: WhetherHasOrphans, -- Whether this module has orphans
- mi_usages :: [ImportVersion OccName], -- Usages
- mi_exports :: [ExportItem], -- Exports
- mi_insts :: [RdrNameInstDecl], -- Local instance declarations
- mi_decls :: [(Version, RdrNameHsDecl)], -- Local definitions
- mi_fixity :: (Version, [RdrNameFixitySig]), -- Local fixity declarations,
- -- with their version
- mi_rules :: (Version, [RdrNameRuleDecl]), -- Rules, with their version
- mi_deprecs :: [RdrNameDeprecation] -- Deprecations
- }
+type ModuleEnv a = UniqFM a -- Domain is Module
-data ModDetails
- = ModDetails {
- moduleExports :: Avails,
- moduleEnv :: GlobalRdrEnv, -- == FM RdrName [Name]
- typeEnv :: FiniteMap Name TyThing, -- TyThing is in TcEnv.lhs
- instEnv :: InstEnv,
- fixityEnv :: FiniteMap Name Fixity,
- ruleEnv :: FiniteMap Id [CoreRule]
- }
+type HomeModMap = FiniteMap ModuleName Module -- domain: home mods only
+type HomeSymbolTable = ModuleEnv ModDetails -- ditto
+type HomeInterfaceTable = ModuleEnv ModIFace
+\end{code}
--- This should eventually replace RnMonad.Ifaces
-data HoldingPen
- = HoldingPen {
- iDecls :: DeclsMap, -- A single, global map of Names to decls
- iInsts :: IfaceInsts,
- -- The as-yet un-slurped instance decls; this bag is depleted when we
- -- slurp an instance decl so that we don't slurp the same one twice.
- -- Each is 'gated' by the names that must be available before
- -- this instance decl is needed.
+%************************************************************************
+%* *
+\subsection{Module details}
+%* *
+%************************************************************************
- iRules :: IfaceRules
- -- Similar to instance decls, only for rules
+A @ModDetails@ summarises everything we know about a compiled module
+
+Auxiliary definitions
+
+\begin{code}
+{- I DONT think this should be here -- should be in HscTypes
+type DeprecationEnv = NameEnv DeprecTxt -- Give reason for deprecation
+
+type GlobalRdrEnv = RdrNameEnv [Name] -- The list is because there may be name clashes
+ -- These only get reported on lookup,
+ -- not on construction
+
+data GenAvailInfo name = Avail name -- An ordinary identifier
+ | AvailTC name -- The name of the type or class
+ [name] -- The available pieces of type/class.
+ -- NB: If the type or class is itself
+ -- to be in scope, it must be in this list.
+ -- Thus, typically: AvailTC Eq [Eq, ==, /=]
+ deriving( Eq )
+ -- Equality used when deciding if the interface has changed
+
+type AvailEnv = NameEnv AvailInfo -- Maps a Name to the AvailInfo that contains it
+type AvailInfo = GenAvailInfo Name
+type RdrAvailInfo = GenAvailInfo OccName
+type Avails = [AvailInfo]
+-}
+\end{code}
+
+
+%************************************************************************
+%* *
+\subsection{The persistent compiler state}
+%* *
+%************************************************************************
+
+\begin{code}
+data PersistentCompilerState
+ = PCS {
+ pcsPST :: PackageSymbolTable, -- Domain = non-home-package modules
+ pcsHP :: RnMonad.HoldingPen, -- Pre-slurped interface bits and pieces
+ pcsNS :: NameSupply -- Allocate uniques for names
}
-emptyHoldingPen :: HoldingPen
-emptyHoldingPen = error "emptyHoldingPen:unimp"
+type PackageSymbolTable = ModuleEnv ModDetails
+
+data NameSupply
+ = NS { nsUniqs :: UniqSupply,
+ nsNames :: FiniteMap (Module,OccName) Name -- Ensures that one original name gets one unique
+ nsIParam :: FiniteMap OccName Name -- Ensures that one implicit parameter name gets one unique
+ }
+=======
+>>>>>>> 1.9
+=======
+
+-- should be somewhere else?
+emptyPCS :: IO PersistentCompilerState
+emptyPCS = return (PersistentCompilerState
+ { pcs_modmap = emptyFM,
+ pcs_pit = emptyPIT,
+ pcs_pst = emptyPST,
+ pcs_hp = emptyHoldingPen })
+>>>>>>> 1.10
\end{code}
+