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,
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 )
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
-- 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
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