[project @ 2003-09-23 16:52:44 by sof]
[ghc-hetmet.git] / ghc / compiler / rename / RnNames.lhs
index 12eb33a..d1a4f01 100644 (file)
@@ -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 )
@@ -194,9 +193,10 @@ importsFromImportDecl this_mod
        not_self (m, _) = m /= this_mod_name
 
        import_all = case imp_spec of
-                       (Just (False, _)) -> False      -- Imports are spec'd explicitly
-                       other             -> True       -- Everything is imported, 
-                                                       -- (or almost everything [hiding])
+                       Just (isHid, ls) -- Imports are spec'd explicitly
+                         | not isHid  -> Just (not (null ls)) 
+                       _       -> Nothing      -- Everything is imported, 
+                                               -- (or almost everything [hiding])
 
        qual_mod_name = case as_mod of
                          Nothing           -> imp_mod_name
@@ -529,14 +529,30 @@ 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
@@ -773,14 +789,21 @@ reportUnusedNames gbl_env dus
     direct_import_mods = map (moduleName . fst) 
                             (moduleEnvElts (imp_mods imports))
 
+    hasEmptyImpList :: ModuleName -> Bool
+    hasEmptyImpList m = 
+       case lookupModuleEnvByName (imp_mods imports) m of
+        Just (_,Just x) -> not x
+        _ -> False
+
     -- unused_imp_mods are the directly-imported modules 
     -- that are not mentioned in minimal_imports1
     -- [Note: not 'minimal_imports', because that includes direcly-imported
     --       modules even if we use nothing from them; see notes above]
     unused_imp_mods = [m | m <- direct_import_mods,
                       isNothing (lookupFM minimal_imports1 m),
-                      m /= pRELUDE_Name]
-    
+                      m /= pRELUDE_Name,
+                      not (hasEmptyImpList m)]
+
     module_unused :: Module -> Bool
     module_unused mod = moduleName mod `elem` unused_imp_mods