- let Just reconstructedType = termType term
- new_type = mostSpecificType (idType id) reconstructedType
- return . Just $ setIdType id new_type
-
- updateIds :: Session -> [Id] -> IO ()
- updateIds (Session ref) new_ids = do
+ -- Then, we extract a substitution,
+ -- mapping the old tyvars to the reconstructed types.
+ let Just reconstructed_type = termType term
+
+ -- tcUnifyTys doesn't look through forall's, so we drop them from
+ -- the original type, instead of sigma-typing the reconstructed type
+ -- In addition, we strip newtypes too, since the reconstructed type might
+ -- not have recovered them all
+ mb_subst = tcUnifyTys (const BindMe)
+ [repType' $ dropForAlls$ idType id]
+ [repType' $ reconstructed_type]
+
+ ASSERT2 (isJust mb_subst, ppr reconstructed_type $$ (ppr$ idType id))
+ return mb_subst
+
+ applySubstToEnv :: Session -> TvSubst -> IO ()
+ applySubstToEnv cms subst | isEmptyTvSubst subst = return ()
+ applySubstToEnv cms@(Session ref) subst = do
+ hsc_env <- readIORef ref
+ inScope <- GHC.getBindings cms
+ let ictxt = hsc_IC hsc_env
+ ids = ic_tmp_ids ictxt
+ ids' = map (\id -> id `setIdType` substTy subst (idType id)) ids
+ subst_dom= varEnvKeys$ getTvSubstEnv subst
+ subst_ran= varEnvElts$ getTvSubstEnv subst
+ new_tvs = [ tv | Just tv <- map getTyVar_maybe subst_ran]
+ ic_tyvars'= (`delVarSetListByKey` subst_dom)
+ . (`extendVarSetList` new_tvs)
+ $ ic_tyvars ictxt
+ ictxt' = ictxt { ic_tmp_ids = ids'
+ , ic_tyvars = ic_tyvars' }
+ writeIORef ref (hsc_env {hsc_IC = ictxt'})
+
+ where delVarSetListByKey = foldl' delVarSetByKey
+
+ tidyTermTyVars :: Session -> Term -> IO Term
+ tidyTermTyVars (Session ref) t = do