removeTarget,
guessTarget,
+ -- * Extending the program scope
+ extendGlobalRdrScope, -- :: Session -> [GlobalRdrElt] -> IO ()
+ setGlobalRdrScope, -- :: Session -> [GlobalRdrElt] -> IO ()
+ extendGlobalTypeScope, -- :: Session -> [Id] -> IO ()
+ setGlobalTypeScope, -- :: Session -> [Id] -> IO ()
+
-- * Loading\/compiling the program
depanal,
load, LoadHowMuch(..), SuccessFlag(..), -- also does depanal
tcRnLookupName, getModuleExports )
import RdrName ( plusGlobalRdrEnv, Provenance(..),
ImportSpec(..), ImpDeclSpec(..), ImpItemSpec(..),
- emptyGlobalRdrEnv, mkGlobalRdrEnv )
+ mkGlobalRdrEnv )
import HscMain ( hscParseIdentifier, hscStmt, hscTcExpr, hscKcType )
import Type ( tidyType )
import VarEnv ( emptyTidyEnv )
import Packages ( initPackages )
import NameSet ( NameSet, nameSetToList, elemNameSet )
import RdrName ( GlobalRdrEnv, GlobalRdrElt(..), RdrName(..),
- globalRdrEnvElts )
+ globalRdrEnvElts, extendGlobalRdrEnv,
+ emptyGlobalRdrEnv )
import HsSyn
import Type ( Kind, Type, dropForAlls, PredType, ThetaType,
pprThetaArrow, pprParendType, splitForAllTys,
lhs_file = file `joinFileExt` "lhs"
-- -----------------------------------------------------------------------------
+-- Extending the program scope
+
+extendGlobalRdrScope :: Session -> [GlobalRdrElt] -> IO ()
+extendGlobalRdrScope session rdrElts
+ = modifySession session $ \hscEnv ->
+ let global_rdr = hsc_global_rdr_env hscEnv
+ in hscEnv{ hsc_global_rdr_env = foldl extendGlobalRdrEnv global_rdr rdrElts }
+
+setGlobalRdrScope :: Session -> [GlobalRdrElt] -> IO ()
+setGlobalRdrScope session rdrElts
+ = modifySession session $ \hscEnv ->
+ hscEnv{ hsc_global_rdr_env = foldl extendGlobalRdrEnv emptyGlobalRdrEnv rdrElts }
+
+extendGlobalTypeScope :: Session -> [Id] -> IO ()
+extendGlobalTypeScope session ids
+ = modifySession session $ \hscEnv ->
+ let global_type = hsc_global_type_env hscEnv
+ in hscEnv{ hsc_global_type_env = extendTypeEnvWithIds global_type ids }
+
+setGlobalTypeScope :: Session -> [Id] -> IO ()
+setGlobalTypeScope session ids
+ = modifySession session $ \hscEnv ->
+ hscEnv{ hsc_global_type_env = extendTypeEnvWithIds emptyTypeEnv ids }
+
+-- -----------------------------------------------------------------------------
-- Loading the program
-- Perform a dependency analysis starting from the current targets
import Var ( Id )
import Module ( emptyModuleEnv, ModLocation(..) )
-import RdrName ( GlobalRdrEnv, RdrName )
+import RdrName ( GlobalRdrEnv, RdrName, emptyGlobalRdrEnv )
import HsSyn ( HsModule, LHsBinds, HsGroup, LIE, LImportDecl )
import SrcLoc ( Located(..) )
import StringBuffer ( hGetStringBuffer, stringToStringBuffer )
import CodeGen ( codeGen )
import CmmParse ( parseCmmFile )
import CodeOutput ( codeOutput )
+import NameEnv ( emptyNameEnv )
import DynFlags
import ErrUtils
hsc_HPT = emptyHomePackageTable,
hsc_EPS = eps_var,
hsc_NC = nc_var,
- hsc_FC = fc_var } ) }
+ hsc_FC = fc_var,
+ hsc_global_rdr_env = emptyGlobalRdrEnv,
+ hsc_global_type_env = emptyNameEnv } ) }
knownKeyNames :: [Name] -- Put here to avoid loops involving DsMeta,
import Id ( Id, mkExportedLocalId, isLocalId, idName, idType )
import Var ( Var )
import Module ( Module, ModuleEnv, moduleEnvElts, elemModuleEnv )
-import OccName ( mkVarOccFS )
+import OccName ( mkVarOccFS, plusOccEnv )
import Name ( Name, NamedThing(..), isExternalName, getSrcLoc, isWiredInName,
mkExternalName, isInternalName )
import NameSet
-- Update the gbl env
updGblEnv ( \ gbl ->
- gbl { tcg_rdr_env = rdr_env,
+ gbl { tcg_rdr_env = plusOccEnv (tcg_rdr_env gbl) rdr_env,
tcg_inst_env = extendInstEnvList (tcg_inst_env gbl) home_insts,
tcg_imports = tcg_imports gbl `plusImportAvails` imports,
tcg_rn_imports = if save_rn_syntax then