diff options
author | simonmar <unknown> | 2001-02-06 17:31:00 +0000 |
---|---|---|
committer | simonmar <unknown> | 2001-02-06 17:31:00 +0000 |
commit | 787f32866ccf115271f8eafb22f44b0f4b13e7b6 (patch) | |
tree | 23a9d9e56c713f3159ecec394e4245e3a13b9ee6 /ghc/compiler/rename/RnEnv.lhs | |
parent | bb14c2af6576b5a470d4b7439105a5bbe2e864ca (diff) | |
download | haskell-787f32866ccf115271f8eafb22f44b0f4b13e7b6.tar.gz |
[project @ 2001-02-06 17:31:00 by simonmar]
Qualified names on the command line may now refer to any exported
entity from any module, not just entities from the "original" defining
module.
eg. "IO.hFlush IO.stdout" now works.
There's still a problem in that home interfaces may be demand-loaded
if they're aren't already in memory, which is wrong (you can refer to
a module which isn't loaded, causing things to fall over at link
time).
Diffstat (limited to 'ghc/compiler/rename/RnEnv.lhs')
-rw-r--r-- | ghc/compiler/rename/RnEnv.lhs | 27 |
1 files changed, 23 insertions, 4 deletions
diff --git a/ghc/compiler/rename/RnEnv.lhs b/ghc/compiler/rename/RnEnv.lhs index b835791154..fc262edd3e 100644 --- a/ghc/compiler/rename/RnEnv.lhs +++ b/ghc/compiler/rename/RnEnv.lhs @@ -8,6 +8,9 @@ module RnEnv where -- Export everything #include "HsVersions.h" +import {-# SOURCE #-} RnHiFiles + +import HscTypes ( ModIface(..) ) import HsSyn import RdrHsSyn ( RdrNameIE ) import RdrName ( RdrName, rdrNameModule, rdrNameOcc, isQual, isUnqual, isOrig, @@ -27,7 +30,9 @@ import Name ( Name, import Name ( extendNameEnv_C, plusNameEnv_C, nameEnvElts ) import NameSet import OccName ( OccName, occNameUserString, occNameFlavour ) -import Module ( ModuleName, moduleName, mkVanillaModule, mkSysModuleNameFS, moduleNameFS ) +import Module ( ModuleName, moduleName, mkVanillaModule, + mkSysModuleNameFS, moduleNameFS, + WhereFrom(..) ) import FiniteMap import UniqSupply import SrcLoc ( SrcLoc, noSrcLoc ) @@ -238,9 +243,23 @@ lookupGlobalOccRn rdr_name | otherwise -> case lookupRdrEnv global_env rdr_name of Just _ -> lookupSrcName global_env rdr_name - Nothing -> newGlobalName (rdrNameModule rdr_name) - (rdrNameOcc rdr_name) - + Nothing -> lookupQualifiedName rdr_name + +-- a qualified name on the command line can refer to any module at all: we +-- try to load the interface if we don't already have it. +lookupQualifiedName :: RdrName -> RnM d Name +lookupQualifiedName rdr_name + = let + mod = rdrNameModule rdr_name + occ = rdrNameOcc rdr_name + in + loadInterface (ppr rdr_name) mod ImportBySystem `thenRn` \ iface -> + case [ name | (_,avails) <- mi_exports iface, + avail <- avails, + name <- availNames avail, + nameOccName name == occ ] of + (n:ns) -> ASSERT (null ns) returnRn n + _ -> failWithRn (mkUnboundName rdr_name) (unknownNameErr rdr_name) lookupSrcName :: GlobalRdrEnv -> RdrName -> RnM d Name -- NB: passed GlobalEnv explicitly, not necessarily in RnMS monad |