)
import Module ( Module, ModuleName, WhereFrom(..),
moduleNameUserString, moduleName,
- moduleEnvElts, lookupModuleEnv
+ moduleEnvElts
)
import Name ( Name, NamedThing(..), getSrcLoc,
nameIsLocalOrFrom, nameOccName, nameModule,
Provenance(..), ImportReason(..), initialVersionInfo,
Deprecations(..), lookupDeprec, lookupIface
)
+import CmStaticInfo ( GhciMode(..) )
import List ( partition, nub )
\end{code}
print_unqual = unQualInScope rdr_env
in
- initRnMS rdr_env emptyLocalFixityEnv SourceMode (rnExpr expr)
+ initRnMS rdr_env emptyLocalFixityEnv CmdLineMode (rnExpr expr)
`thenRn` \ (e,fvs) ->
checkErrsRn `thenRn` \ no_errs_so_far ->
implicit_occs = string_occs ++ foldr ((++) . get) implicit_main decls
- get (TyClD (TyData _ _ _ _ _ _ (Just deriv_classes) _ _ _))
- = concat (map get_deriv deriv_classes)
- get other = []
+ get (TyClD (TyData {tcdDerivs = Just deriv_classes})) = concat (map get_deriv deriv_classes)
+ get other = []
get_deriv cls = case lookupUFM derivingOccurrences cls of
Nothing -> []
getFixities acc (FixD fix)
= fix_decl acc fix
- getFixities acc (TyClD (ClassDecl _ _ _ _ sigs _ _ _ ))
+ getFixities acc (TyClD (ClassDecl { tcdSigs = sigs}))
= foldlRn fix_decl acc [sig | FixSig sig <- sigs]
-- Get fixities from class decl sigs too.
getFixities acc other_decl
%************************************************************************
\begin{code}
-checkOldIface :: DynFlags
+checkOldIface :: GhciMode
+ -> DynFlags
-> HomeIfaceTable -> HomeSymbolTable
-> PersistentCompilerState
-> FilePath
-> IO (PersistentCompilerState, Bool, (RecompileRequired, Maybe ModIface))
-- True <=> errors happened
-checkOldIface dflags hit hst pcs iface_path source_unchanged maybe_iface
+checkOldIface ghci_mode dflags hit hst pcs iface_path source_unchanged maybe_iface
+
+ -- If the source has changed and we're in interactive mode, avoid reading
+ -- an interface; just return the one we might have been supplied with.
+ | ghci_mode == Interactive && not source_unchanged
+ = return (pcs, False, (outOfDate, maybe_iface))
+
+ | otherwise
= runRn dflags hit hst pcs (panic "Bogus module") $
case maybe_iface of
Just old_iface -> -- Use the one we already have
-- Do the transitive closure
lookupOrigNames implicit_occs `thenRn` \ implicit_names ->
- closeDecls decls (needed `plusFV` implicit_names)
+ closeDecls decls (needed `plusFV` implicit_names) `thenRn` \closed_decls ->
+ rnDump [] closed_decls `thenRn_`
+ returnRn closed_decls
where
implicit_occs = string_occs -- Data type decls with record selectors,
-- which may appear in the decls, need unpackCString
minimal_imports1 = foldr add_name minimal_imports0 defined_and_used
minimal_imports = foldr add_inst_mod minimal_imports1 inst_mods
- add_name (n,NonLocalDef (UserImport m _ _)) acc = addToFM_C plusAvailEnv acc (moduleName (nameModule n))
+ -- We've carefully preserved the provenance so that we can
+ -- construct minimal imports that import the name by (one of)
+ -- the same route(s) as the programmer originally did.
+ add_name (n,NonLocalDef (UserImport m _ _)) acc = addToFM_C plusAvailEnv acc (moduleName m)
(unitAvailEnv (mk_avail n))
add_name (n,other_prov) acc = acc
pit = iPIT ifaces
deprecs = [ (n,txt)
| n <- nameSetToList used_names,
+ not (nameIsLocalOrFrom this_mod n),
Just txt <- [lookup_deprec hit pit n] ]
+ -- nameIsLocalOrFrom: don't complain about locally defined names
+ -- For a start, we may be exporting a deprecated thing
+ -- Also we may use a deprecated thing in the defn of another
+ -- deprecated things. We may even use a deprecated thing in
+ -- the defn of a non-deprecated thing, when changing a module's
+ -- interface
in
mapRn_ warnDeprec deprecs
where
- export_mods = nub [ moduleName (nameModule name)
+ export_mods = nub [ moduleName mod
| avail <- export_avails,
- let name = availName avail,
- not (nameIsLocalOrFrom this_mod name) ]
+ let mod = nameModule (availName avail),
+ mod /= this_mod ]
load_home m = loadInterface (text "Check deprecations for" <+> ppr m) m ImportBySystem
lookup_deprec hit pit n
- | nameIsLocalOrFrom this_mod n
- = lookupDeprec my_deprecs n
- | otherwise
= case lookupIface hit pit n of
Just iface -> lookupDeprec (mi_deprecs iface) n
Nothing -> pprPanic "warnDeprecations:" (ppr n)