diff options
author | David Feuer <david.feuer@gmail.com> | 2017-03-01 13:47:39 -0500 |
---|---|---|
committer | David Feuer <David.Feuer@gmail.com> | 2017-03-01 13:47:41 -0500 |
commit | cbe569a56e2a82bb93a008beb56869d9a6a1d047 (patch) | |
tree | 4143ecfabf7b171159c2980e545fe66e0118e1f0 /compiler/ghci | |
parent | 701256df88c61a2eee4cf00a59e61ef76a57b4b4 (diff) | |
download | haskell-cbe569a56e2a82bb93a008beb56869d9a6a1d047.tar.gz |
Upgrade UniqSet to a newtype
The fundamental problem with `type UniqSet = UniqFM` is that `UniqSet`
has a key invariant `UniqFM` does not. For example, `fmap` over
`UniqSet` will generally produce nonsense.
* Upgrade `UniqSet` from a type synonym to a newtype.
* Remove unused and shady `extendVarSet_C` and `addOneToUniqSet_C`.
* Use cached unique in `tyConsOfType` by replacing
`unitNameEnv (tyConName tc) tc` with `unitUniqSet tc`.
Reviewers: austin, hvr, goldfire, simonmar, niteria, bgamari
Reviewed By: niteria
Subscribers: thomie
Differential Revision: https://phabricator.haskell.org/D3146
Diffstat (limited to 'compiler/ghci')
-rw-r--r-- | compiler/ghci/Debugger.hs | 10 | ||||
-rw-r--r-- | compiler/ghci/RtClosureInspect.hs | 11 |
2 files changed, 10 insertions, 11 deletions
diff --git a/compiler/ghci/Debugger.hs b/compiler/ghci/Debugger.hs index 95d734ea5d..b40dd5cd89 100644 --- a/compiler/ghci/Debugger.hs +++ b/compiler/ghci/Debugger.hs @@ -27,7 +27,7 @@ import IfaceEnv( newInteractiveBinder ) import Name import Var hiding ( varName ) import VarSet -import UniqFM +import UniqSet import Type import GHC import Outputable @@ -100,11 +100,11 @@ pprintClosureCommand bindThings force str = do my_tvs = termTyCoVars t tvs = env_tvs `minusVarSet` my_tvs tyvarOccName = nameOccName . tyVarName - tidyEnv = (initTidyOccEnv (map tyvarOccName (nonDetEltsUFM tvs)) - -- It's OK to use nonDetEltsUFM here because initTidyOccEnv + tidyEnv = (initTidyOccEnv (map tyvarOccName (nonDetEltsUniqSet tvs)) + -- It's OK to use nonDetEltsUniqSet here because initTidyOccEnv -- forgets the ordering immediately by creating an env - , env_tvs `intersectVarSet` my_tvs) - return$ mapTermType (snd . tidyOpenType tidyEnv) t + , getUniqSet $ env_tvs `intersectVarSet` my_tvs) + return $ mapTermType (snd . tidyOpenType tidyEnv) t -- | Give names, and bind in the interactive environment, to all the suspensions -- included (inductively) in a term diff --git a/compiler/ghci/RtClosureInspect.hs b/compiler/ghci/RtClosureInspect.hs index b63c1c94b2..a5b791a151 100644 --- a/compiler/ghci/RtClosureInspect.hs +++ b/compiler/ghci/RtClosureInspect.hs @@ -46,7 +46,6 @@ import TcEnv import TyCon import Name -import VarEnv import Util import VarSet import BasicTypes ( Boxity(..) ) @@ -307,12 +306,12 @@ mapTermTypeM f = foldTermM TermFoldM { termTyCoVars :: Term -> TyCoVarSet termTyCoVars = foldTerm TermFold { fTerm = \ty _ _ tt -> - tyCoVarsOfType ty `plusVarEnv` concatVarEnv tt, + tyCoVarsOfType ty `unionVarSet` concatVarEnv tt, fSuspension = \_ ty _ _ -> tyCoVarsOfType ty, - fPrim = \ _ _ -> emptyVarEnv, - fNewtypeWrap= \ty _ t -> tyCoVarsOfType ty `plusVarEnv` t, - fRefWrap = \ty t -> tyCoVarsOfType ty `plusVarEnv` t} - where concatVarEnv = foldr plusVarEnv emptyVarEnv + fPrim = \ _ _ -> emptyVarSet, + fNewtypeWrap= \ty _ t -> tyCoVarsOfType ty `unionVarSet` t, + fRefWrap = \ty t -> tyCoVarsOfType ty `unionVarSet` t} + where concatVarEnv = foldr unionVarSet emptyVarSet ---------------------------------- -- Pretty printing of terms |