[project @ 2003-07-23 13:08:22 by simonpj]
[ghc-hetmet.git] / ghc / compiler / rename / RnNames.lhs
index 6eac67c..9197fd9 100644 (file)
@@ -6,7 +6,7 @@
 \begin{code}
 module RnNames (
        rnImports, importsFromLocalDecls, exportsFromAvail,
-       reportUnusedNames, mkModDeps, main_RDR_Unqual
+       reportUnusedNames, mkModDeps
     ) where
 
 #include "HsVersions.h"
@@ -19,12 +19,12 @@ import HsSyn                ( IE(..), ieName, ImportDecl(..),
                          ForeignDecl(..), HsGroup(..),
                          collectLocatedHsBinders, tyClDeclNames 
                        )
-import RdrHsSyn                ( RdrNameIE, RdrNameImportDecl )
+import RdrHsSyn                ( RdrNameIE, RdrNameImportDecl, main_RDR_Unqual )
 import RnEnv
 import TcRnMonad
 
 import FiniteMap
-import PrelNames       ( pRELUDE_Name, mAIN_Name, isBuiltInSyntaxName )
+import PrelNames       ( pRELUDE_Name, isBuiltInSyntaxName )
 import Module          ( Module, ModuleName, ModuleEnv, moduleName, 
                          moduleNameUserString, isHomeModule,
                          emptyModuleEnv, unitModuleEnvByName, unitModuleEnv, 
@@ -34,15 +34,14 @@ import NameSet
 import NameEnv
 import OccName         ( OccName, srcDataName, isTcOcc )
 import HscTypes                ( Provenance(..), ImportReason(..), GlobalRdrEnv,
-                         GenAvailInfo(..), AvailInfo, Avails, 
+                         GenAvailInfo(..), AvailInfo, Avails, GhciMode(..),
                          IsBootInterface,
                          availName, availNames, availsToNameSet, 
                          Deprecations(..), ModIface(..), Dependencies(..),
                          GlobalRdrElt(..), unQualInScope, isLocalGRE, pprNameProvenance
                        )
-import OccName         ( varName )
 import RdrName         ( RdrName, rdrNameOcc, setRdrNameSpace, lookupRdrEnv, rdrEnvToList,
-                         emptyRdrEnv, foldRdrEnv, rdrEnvElts, mkRdrUnqual, isQual, mkUnqual )
+                         emptyRdrEnv, foldRdrEnv, rdrEnvElts, mkRdrUnqual, isQual )
 import Outputable
 import Maybe           ( isJust, isNothing, catMaybes )
 import Maybes          ( orElse )
@@ -529,39 +528,46 @@ type ExportOccMap = FiniteMap OccName (Name, RdrNameIE)
        --   that have the same occurrence name
 
 
-exportsFromAvail :: Maybe [RdrNameIE] -> TcRn m Avails
+exportsFromAvail :: Maybe Module       -- Nothing => no 'module M(..) where' header at all
+                -> Maybe [RdrNameIE]   -- Nothing => no explicit export list
+                -> TcRn m Avails
        -- Complains if two distinct exports have same OccName
         -- Warns about identical exports.
        -- Complains about exports items not in scope
 
-exportsFromAvail exports
+exportsFromAvail maybe_mod exports
  = do { TcGblEnv { tcg_rdr_env = rdr_env, 
                   tcg_imports = imports } <- getGblEnv ;
+
+       -- If the module header is omitted altogether, then behave
+       -- as if the user had written "module Main(main) where..."
+       -- EXCEPT in interactive mode, when we behave as if he had
+       -- written "module Main where ..."
+       -- Reason: don't want to complain about 'main' not in scope
+       --         in interactive mode
+       ghci_mode <- getGhciMode ;
+       let { real_exports 
+               = case maybe_mod of
+                   Just mod -> exports
+                   Nothing | ghci_mode == Interactive -> Nothing
+                           | otherwise              -> Just [IEVar main_RDR_Unqual] } ;
+
        exports_from_avail exports rdr_env imports }
 
 exports_from_avail Nothing rdr_env
                   imports@(ImportAvails { imp_env = entity_avail_env })
- = do { this_mod <- getModule ;
-       if moduleName this_mod == mAIN_Name then
-          exports_from_avail (Just [IEVar main_RDR_Unqual]) rdr_env imports
-               -- Behave just as if we'd said module Main(main)
-               -- This is particularly important if we compile module Main,
-               -- but then use ghci to call it... we jolly well expect to
-               -- see 'main'!
-       else 
-               -- Export all locally-defined things
-               -- We do this by filtering the global RdrEnv,
-               -- keeping only things that are (a) qualified,
-               -- (b) locally defined, (c) a 'main' name
-               -- Then we look up in the entity-avail-env
-       return [ lookupAvailEnv entity_avail_env name
+ =     -- Export all locally-defined things
+       -- We do this by filtering the global RdrEnv,
+       -- keeping only things that are (a) qualified,
+       -- (b) locally defined, (c) a 'main' name
+       -- Then we look up in the entity-avail-env
+   return [ lookupAvailEnv entity_avail_env name
               | (rdr_name, gres) <- rdrEnvToList rdr_env,
                 isQual rdr_name,       -- Avoid duplicates
                 GRE { gre_name   = name, 
                       gre_parent = Nothing,    -- Main things only
                       gre_prov   = LocalDef } <- gres
               ]
-    }
 
 exports_from_avail (Just export_items) rdr_env
                   (ImportAvails { imp_qual = mod_avail_env, 
@@ -678,13 +684,6 @@ check_occs ie occs avail
                     returnM occs }
       where
        name_occ = nameOccName name
-
-----------------------------
-main_RDR_Unqual :: RdrName
-main_RDR_Unqual = mkUnqual varName FSLIT("main")
-       -- Don't get a RdrName from PrelNames.mainName, because 
-       -- nameRdrNamegets an Orig RdrName, and we want a Qual or Unqual one.  
-       -- An Unqual one will do just fine
 \end{code}
 
 %*********************************************************