cleanTempDirs )
import Module
import UniqFM
+import UniqSet
+import Unique
import PackageConfig
import FiniteMap
import Panic
-- we have to implement the shadowing behaviour of ic_tmp_ids here
-- (see InteractiveContext) and the quickest way is to use an OccEnv.
let
- tmp_ids = reverse (ic_tmp_ids (hsc_IC hsc_env))
- env = mkOccEnv [ (nameOccName (idName id), id) | id <- tmp_ids ]
+ tmp_ids = ic_tmp_ids (hsc_IC hsc_env)
+ filtered = foldr f (const []) tmp_ids emptyUniqSet
+ f id rest set
+ | uniq `elementOfUniqSet` set = rest set
+ | otherwise = AnId id : rest (addOneToUniqSet set uniq)
+ where uniq = getUnique (nameOccName (idName id))
in
- return (map AnId (occEnvElts env))
+ return filtered
getPrintUnqual :: Session -> IO PrintUnqualified
getPrintUnqual s = withSession s (return . icPrintUnqual . hsc_IC)
-- ic_toplev_scope and ic_exports
ic_tmp_ids :: [Id], -- Names bound during interaction.
- -- Earlier Ids shadow
- -- later ones with the same OccName.
+ -- Later Ids shadow
+ -- earlier ones with the same OccName.
ic_tyvars :: TyVarSet -- skolem type variables free in
-- ic_tmp_ids. These arise at
-> TyVarSet
-> InteractiveContext
extendInteractiveContext ictxt ids tyvars
- = ictxt { ic_tmp_ids = ids ++ ic_tmp_ids ictxt,
+ = ictxt { ic_tmp_ids = ic_tmp_ids ictxt ++ ids,
+ -- NB. must be this way around, because we want
+ -- new ids to shadow existing bindings.
ic_tyvars = ic_tyvars ictxt `unionVarSet` tyvars }
\end{code}
tcg_inst_env = extendInstEnvList (tcg_inst_env env) dfuns }) $
- tcExtendIdEnv (reverse (ic_tmp_ids icxt)) $
+ tcExtendIdEnv (ic_tmp_ids icxt) $
-- tcExtendIdEnv does lots:
-- - it extends the local type env (tcl_env) with the given Ids,
-- - it extends the local rdr env (tcl_rdr) with the Names from
-- - it adds the free tyvars of the Ids to the tcl_tyvars
-- set.
--
- -- earlier ids in ic_tmp_ids must shadow later ones with the same
- -- OccName, but tcExtendIdEnv has the opposite behaviour, hence the
- -- reverse above.
+ -- later ids in ic_tmp_ids must shadow earlier ones with the same
+ -- OccName, and tcExtendIdEnv implements this behaviour.
do { traceTc (text "setIC" <+> ppr (ic_tmp_ids icxt))
; thing_inside }