import TcDefaults ( tcDefaults )
import TcEnv ( tcExtendGlobalValEnv, tcExtendTypeEnv,
getEnvTyCons, getEnvClasses, tcLookupValueByKeyMaybe,
- explicitLookupValueByKey, tcSetValueEnv,
+ tcSetValueEnv, tcSetInstEnv,
initEnv,
- ValueEnv, TcTyThing(..)
+ ValueEnv,
)
-import TcExpr ( tcId )
import TcRules ( tcRules )
import TcForeign ( tcForeignImports, tcForeignExports )
import TcIfaceSig ( tcInterfaceSigs )
import TcInstDcls ( tcInstDecls1, tcInstDecls2 )
-import TcInstUtil ( buildInstanceEnvs, classDataCon, InstInfo )
+import TcInstUtil ( buildInstanceEnv, InstInfo )
import TcSimplify ( tcSimplifyTop )
import TcTyClsDecls ( tcTyAndClassDecls )
import TcTyDecls ( mkImplicitDataBinds )
-import TcType ( TcType, typeToTcType,
- TcKind, kindToTcKind,
- newTyVarTy
- )
+import TcType ( TcType, TcKind )
import RnMonad ( RnNameSupply, FixityEnv )
import Bag ( isEmptyBag )
)
import TyCon ( TyCon, tyConKind )
import Class ( Class, classSelIds, classTyCon )
-import Type ( mkTyConApp, mkForAllTy,
- boxedTypeKind, getTyVar, Type )
-import TysWiredIn ( unitTy )
import PrelInfo ( mAIN_Name )
-import TcUnify ( unifyTauTy )
import Unique ( Unique, mainKey )
import UniqSupply ( UniqSupply )
import Maybes ( maybeToBool )
import Util
import Bag ( Bag, isEmptyBag )
import Outputable
-
-import IOExts
\end{code}
Outside-world interface:
-- unf_env is also used to get the pragam info
-- for imported dfuns and default methods
- -- The knot for instance information. This isn't used at all
- -- till we type-check value declarations
- fixTc ( \ ~(rec_inst_mapper, _, _, _) ->
-
-- Type-check the type and class decls
- tcTyAndClassDecls unf_env rec_inst_mapper decls `thenTc` \ env ->
+ tcTyAndClassDecls unf_env decls `thenTc` \ env ->
-- Typecheck the instance decls, includes deriving
- tcSetEnv env (
- tcInstDecls1 unf_env decls mod_name fixities rn_name_supply
- ) `thenTc` \ (inst_info, deriv_binds) ->
-
- buildInstanceEnvs inst_info `thenNF_Tc` \ inst_mapper ->
-
- returnTc (inst_mapper, env, inst_info, deriv_binds)
-
- -- End of inner fix loop
- ) `thenTc` \ (_, env, inst_info, deriv_binds) ->
+ tcSetEnv env $
+
+ tcInstDecls1 unf_env decls
+ mod_name fixities
+ rn_name_supply `thenTc` \ (inst_info, deriv_binds) ->
- tcSetEnv env (
+ buildInstanceEnv inst_info `thenNF_Tc` \ inst_env ->
+
+ tcSetInstEnv inst_env $
let
tycons = getEnvTyCons env
classes = getEnvClasses env
tcDefaults decls `thenTc` \ defaulting_tys ->
tcSetDefaultTys defaulting_tys $
- -- Extend the TyCon envt with the tycons corresponding to
- -- the classes.
- -- They are mentioned in types in interface files.
- tcExtendTypeEnv [ (getName tycon, (kindToTcKind (tyConKind tycon), ADataTyCon tycon))
- | clas <- classes,
- let tycon = classTyCon clas
- ] $
-
-- Interface type signatures
-- We tie a knot so that the Ids read out of interfaces are in scope
-- when we read their pragmas.
tc_rules = rules',
tc_env = really_final_env
}))
- )
-- End of outer fix loop
) `thenTc` \ (final_env, stuff) ->