X-Git-Url: http://git.megacz.com/?a=blobdiff_plain;f=ghc%2Fcompiler%2Frename%2FRnNames.lhs;h=9197fd978dcc24ae03094db9faa62bb35bccee41;hb=49bff3215bf3fe9ada24dac2cf80f97db4e597dd;hp=6eac67c0cc2e5f45809912afe23a7ec1951e9204;hpb=84ed91abfe3f9df43d5b33e404138e43a574beb8;p=ghc-hetmet.git diff --git a/ghc/compiler/rename/RnNames.lhs b/ghc/compiler/rename/RnNames.lhs index 6eac67c..9197fd9 100644 --- a/ghc/compiler/rename/RnNames.lhs +++ b/ghc/compiler/rename/RnNames.lhs @@ -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} %*********************************************************