[project @ 2001-01-18 12:54:16 by simonmar]
[ghc-hetmet.git] / ghc / compiler / rename / RnEnv.lhs
index 0dc76fe..b835791 100644 (file)
@@ -16,9 +16,9 @@ import RdrName                ( RdrName, rdrNameModule, rdrNameOcc, isQual, isUnqual, isOrig,
 import HsTypes         ( hsTyVarName, replaceTyVarName )
 import HscTypes                ( Provenance(..), pprNameProvenance, hasBetterProv,
                          ImportReason(..), GlobalRdrEnv, AvailEnv,
-                         AvailInfo, Avails, GenAvailInfo(..), OrigNameEnv(..) )
+                         AvailInfo, Avails, GenAvailInfo(..), NameSupply(..) )
 import RnMonad
-import Name            ( Name, NamedThing(..),
+import Name            ( Name,
                          getSrcLoc, 
                          mkLocalName, mkGlobalName,
                          mkIPName, nameOccName, nameModule_maybe,
@@ -71,7 +71,7 @@ newTopBinder mod rdr_name loc
     let 
        occ = rdrNameOcc rdr_name
        key = (moduleName mod, occ)
-       cache = origNames name_supply
+       cache = nsNames name_supply
     in
     case lookupFM cache key of
 
@@ -86,7 +86,7 @@ newTopBinder mod rdr_name loc
                        new_name  = setNameModuleAndLoc name mod loc
                        new_cache = addToFM cache key new_name
                     in
-                    setNameSupplyRn (name_supply {origNames = new_cache})      `thenRn_`
+                    setNameSupplyRn (name_supply {nsNames = new_cache})        `thenRn_`
                     traceRn (text "newTopBinder: overwrite" <+> ppr new_name) `thenRn_`
                     returnRn new_name
                     
@@ -95,12 +95,12 @@ newTopBinder mod rdr_name loc
        -- Even for locally-defined names we use implicitImportProvenance; 
        -- updateProvenances will set it to rights
        Nothing -> let
-                       (us', us1) = splitUniqSupply (origNS name_supply)
+                       (us', us1) = splitUniqSupply (nsUniqs name_supply)
                        uniq       = uniqFromSupply us1
                        new_name   = mkGlobalName uniq mod occ loc
                        new_cache  = addToFM cache key new_name
                   in
-                  setNameSupplyRn (name_supply {origNS = us', origNames = new_cache})  `thenRn_`
+                  setNameSupplyRn (name_supply {nsUniqs = us', nsNames = new_cache})   `thenRn_`
                   traceRn (text "newTopBinder: new" <+> ppr new_name) `thenRn_`
                   returnRn new_name
 
@@ -127,17 +127,17 @@ newGlobalName mod_name occ
   = getNameSupplyRn            `thenRn` \ name_supply ->
     let
        key = (mod_name, occ)
-       cache = origNames name_supply
+       cache = nsNames name_supply
     in
     case lookupFM cache key of
        Just name -> -- traceRn (text "newGlobalName: hit" <+> ppr name) `thenRn_`
                     returnRn name
 
-       Nothing   -> setNameSupplyRn (name_supply {origNS = us', origNames = new_cache})  `thenRn_`
+       Nothing   -> setNameSupplyRn (name_supply {nsUniqs = us', nsNames = new_cache})  `thenRn_`
                     -- traceRn (text "newGlobalName: new" <+> ppr name)                  `thenRn_`
                     returnRn name
                  where
-                    (us', us1) = splitUniqSupply (origNS name_supply)
+                    (us', us1) = splitUniqSupply (nsUniqs name_supply)
                     uniq       = uniqFromSupply us1
                     mod        = mkVanillaModule mod_name
                     name       = mkGlobalName uniq mod occ noSrcLoc
@@ -146,14 +146,14 @@ newGlobalName mod_name occ
 newIPName rdr_name
   = getNameSupplyRn            `thenRn` \ name_supply ->
     let
-       ipcache = origIParam name_supply
+       ipcache = nsIPs name_supply
     in
     case lookupFM ipcache key of
        Just name -> returnRn name
-       Nothing   -> setNameSupplyRn (name_supply {origNS = us', origIParam = new_ipcache})     `thenRn_`
+       Nothing   -> setNameSupplyRn (name_supply {nsUniqs = us', nsIPs = new_ipcache}) `thenRn_`
                     returnRn name
                  where
-                    (us', us1)  = splitUniqSupply (origNS name_supply)
+                    (us', us1)  = splitUniqSupply (nsUniqs name_supply)
                     uniq        = uniqFromSupply us1
                     name        = mkIPName uniq key
                     new_ipcache = addToFM ipcache key name
@@ -177,13 +177,12 @@ lookupBndrRn rdr_name
 
 lookupTopBndrRn rdr_name
   = getModeRn  `thenRn` \ mode ->
-    case mode of 
-       InterfaceMode -> lookupIfaceName rdr_name       
-
-       SourceMode    -> -- Source mode, so look up a *qualified* version
-                        -- of the name, so that we get the right one even
-                        -- if there are many with the same occ name
-                        -- There must *be* a binding
+    if isInterfaceMode mode
+       then lookupIfaceName rdr_name   
+       else     -- Source mode, so look up a *qualified* version
+                -- of the name, so that we get the right one even
+                -- if there are many with the same occ name
+                -- There must *be* a binding
                getModuleRn             `thenRn` \ mod ->
                getGlobalNameEnv        `thenRn` \ global_env ->
                lookupSrcName global_env (qualifyRdrName (moduleName mod) rdr_name)
@@ -216,11 +215,32 @@ lookupOccRn rdr_name
 
 lookupGlobalOccRn rdr_name
   = getModeRn          `thenRn` \ mode ->
+    if (isInterfaceMode mode)
+       then lookupIfaceName rdr_name
+       else 
+
+    getGlobalNameEnv   `thenRn` \ global_env ->
     case mode of 
-       SourceMode    -> getGlobalNameEnv                       `thenRn` \ global_env ->
-                        lookupSrcName global_env rdr_name
+       SourceMode -> lookupSrcName global_env rdr_name
+
+       CmdLineMode
+        | not (isQual rdr_name) -> 
+               lookupSrcName global_env rdr_name
+
+               -- We allow qualified names on the command line to refer to 
+               -- *any* name exported by any module in scope, just as if 
+               -- there was an "import qualified M" declaration for every 
+               -- module.
+               --
+               -- First look up the name in the normal environment.  If
+               -- it isn't there, we manufacture a new occurrence of an
+               -- original name.
+        | otherwise -> 
+               case lookupRdrEnv global_env rdr_name of
+                      Just _  -> lookupSrcName global_env rdr_name
+                      Nothing -> newGlobalName (rdrNameModule rdr_name)
+                                               (rdrNameOcc rdr_name)
 
-       InterfaceMode -> lookupIfaceName rdr_name
 
 lookupSrcName :: GlobalRdrEnv -> RdrName -> RnM d Name
 -- NB: passed GlobalEnv explicitly, not necessarily in RnMS monad
@@ -270,7 +290,6 @@ calls it at all I think).
 
   \fbox{{\em Jan 98: this comment is wrong: @rnHsType@ uses it quite a bit.}}
 
-
 \begin{code}
 lookupOrigNames :: [RdrName] -> RnM d NameSet
 lookupOrigNames rdr_names
@@ -278,10 +297,10 @@ lookupOrigNames rdr_names
     returnRn (mkNameSet names)
 \end{code}
 
-lookupSysBinder is used for the "system binders" of a type, class, or instance decl.
-It ensures that the module is set correctly in the name cache, and sets the provenance
-on the returned name too.  The returned name will end up actually in the type, class,
-or instance.
+lookupSysBinder is used for the "system binders" of a type, class, or
+instance decl.  It ensures that the module is set correctly in the
+name cache, and sets the provenance on the returned name too.  The
+returned name will end up actually in the type, class, or instance.
 
 \begin{code}
 lookupSysBinder rdr_name
@@ -292,7 +311,6 @@ lookupSysBinder rdr_name
 \end{code}
 
 
-
 %*********************************************************
 %*                                                     *
 \subsection{Binding}
@@ -306,13 +324,13 @@ newLocalsRn rdr_names_w_loc
  =  getNameSupplyRn            `thenRn` \ name_supply ->
     let
        n          = length rdr_names_w_loc
-       (us', us1) = splitUniqSupply (origNS name_supply)
+       (us', us1) = splitUniqSupply (nsUniqs name_supply)
        uniqs      = uniqsFromSupply n us1
        names      = [ mkLocalName uniq (rdrNameOcc rdr_name) loc
                     | ((rdr_name,loc), uniq) <- rdr_names_w_loc `zip` uniqs
                     ]
     in
-    setNameSupplyRn (name_supply {origNS = us'})       `thenRn_`
+    setNameSupplyRn (name_supply {nsUniqs = us'})      `thenRn_`
     returnRn names
 
 
@@ -360,11 +378,11 @@ bindCoreLocalRn rdr_name enclosed_scope
     getLocalNameEnv            `thenRn` \ name_env ->
     getNameSupplyRn            `thenRn` \ name_supply ->
     let
-       (us', us1) = splitUniqSupply (origNS name_supply)
+       (us', us1) = splitUniqSupply (nsUniqs name_supply)
        uniq       = uniqFromSupply us1
        name       = mkLocalName uniq (rdrNameOcc rdr_name) loc
     in
-    setNameSupplyRn (name_supply {origNS = us'})       `thenRn_`
+    setNameSupplyRn (name_supply {nsUniqs = us'})      `thenRn_`
     let
        new_name_env = extendRdrEnv name_env rdr_name name
     in
@@ -410,7 +428,7 @@ bindLocalsFVRn doc rdr_names enclosed_scope
 
 -------------------------------------
 extendTyVarEnvFVRn :: [Name] -> RnMS (a, FreeVars) -> RnMS (a, FreeVars)
-       -- This tiresome function is used only in rnDecl on InstDecl
+       -- This tiresome function is used only in rnSourceDecl on InstDecl
 extendTyVarEnvFVRn tyvars enclosed_scope
   = bindLocalNames tyvars enclosed_scope       `thenRn` \ (thing, fvs) -> 
     returnRn (thing, delListFromNameSet fvs tyvars)
@@ -493,13 +511,14 @@ checkDupNames doc_str rdr_names_w_loc
 \begin{code}
 mkGlobalRdrEnv :: ModuleName           -- Imported module (after doing the "as M" name change)
               -> Bool                  -- True <=> want unqualified import
+              -> Bool                  -- True <=> want qualified import
               -> [AvailInfo]           -- What's to be hidden (but only the unqualified 
                                        --      version is hidden)
               -> (Name -> Provenance)
               -> Avails                -- Whats imported and how
               -> GlobalRdrEnv
 
-mkGlobalRdrEnv this_mod unqual_imp hides mk_provenance avails
+mkGlobalRdrEnv this_mod unqual_imp qual_imp hides mk_provenance avails
   = gbl_env2
   where
        -- Make the name environment.  We're talking about a 
@@ -517,11 +536,14 @@ mkGlobalRdrEnv this_mod unqual_imp hides mk_provenance avails
     add_avail env avail = foldl add_name env (availNames avail)
 
     add_name env name
-       | unqual_imp = env2
-       | otherwise  = env1
+       | qual_imp && unqual_imp = env3
+       | unqual_imp             = env2
+       | qual_imp               = env1
+       | otherwise              = env
        where
          env1 = addOneToGlobalRdrEnv env  (mkRdrQual this_mod occ) (name,prov)
-         env2 = addOneToGlobalRdrEnv env1 (mkRdrUnqual occ)        (name,prov)
+         env2 = addOneToGlobalRdrEnv env  (mkRdrUnqual occ)        (name,prov)
+         env3 = addOneToGlobalRdrEnv env1 (mkRdrUnqual occ)        (name,prov)
          occ  = nameOccName name
          prov = mk_provenance name
 
@@ -537,7 +559,7 @@ mkIfaceGlobalRdrEnv :: [(ModuleName,Avails)] -> GlobalRdrEnv
 mkIfaceGlobalRdrEnv m_avails
   = foldl add emptyRdrEnv m_avails
   where
-    add env (mod,avails) = plusGlobalRdrEnv env (mkGlobalRdrEnv mod True [] (\n -> LocalDef) avails)
+    add env (mod,avails) = plusGlobalRdrEnv env (mkGlobalRdrEnv mod True False [] (\n -> LocalDef) avails)
 \end{code}
 
 \begin{code}