import RnHsSyn ( RenamedHsBinds, RenamedTyClDecl, RenamedHsPred )
import CmdLineOpts ( DynFlag(..) )
-import Generics ( mkGenericBinds )
+import Generics ( mkTyConGenericBinds )
import TcRnMonad
import TcEnv ( newDFunName,
InstInfo(..), pprInstInfo, InstBindings(..),
import NameSet ( NameSet, emptyNameSet, duDefs )
import Unique ( Unique, getUnique )
-import TyCon ( tyConTyVars, tyConDataCons, tyConArity,
+import TyCon ( tyConTyVars, tyConDataCons, tyConArity, tyConHasGenerics,
tyConTheta, isProductTyCon, isDataTyCon,
isEnumerationTyCon, isRecursiveTyCon, TyCon
)
-- before tacking the "ordinary" ones
-- Generate the generic to/from functions from each type declaration
- ; tcg_env <- getGblEnv
- ; let gen_binds = mkGenericBinds (typeEnvTyCons (tcg_type_env tcg_env))
+ ; gen_binds <- mkGenericBinds tycl_decls
; let inst_info = newtype_inst_info ++ ordinary_inst_info
-- Rename these extra bindings, discarding warnings about unused bindings etc
-- Done
; returnM (inst_infos, andMonoBindList (extra_binds : aux_binds_s)) }
+
+-----------------------------------------
+mkGenericBinds tycl_decls
+ = do { tcs <- mapM tcLookupTyCon [tc_name | TyData { tcdName = tc_name } <- tycl_decls]
+ -- We are only interested in the data type declarations
+ ; return (andMonoBindList [mkTyConGenericBinds tc | tc <- tcs, tyConHasGenerics tc]) }
+ -- And then only in the ones whose 'has-generics' flag is on
\end{code}
\begin{code}
-module Generics ( canDoGenerics, mkGenericBinds,
+module Generics ( canDoGenerics, mkTyConGenericBinds,
mkGenericRhs,
validGenericInstanceType, validGenericMethodType
) where
type US = Int -- Local unique supply, just a plain Int
type FromAlt = (Pat RdrName, HsExpr RdrName)
-mkGenericBinds :: [TyCon] -> MonoBinds RdrName
-mkGenericBinds tcs = andMonoBindList [ mkTyConGenBinds tc
- | tc <- tcs, tyConHasGenerics tc]
-
-mkTyConGenBinds :: TyCon -> MonoBinds RdrName
-mkTyConGenBinds tycon
+mkTyConGenericBinds :: TyCon -> MonoBinds RdrName
+mkTyConGenericBinds tycon
= FunMonoBind from_RDR False {- Not infix -}
[mkSimpleHsAlt pat rhs | (pat,rhs) <- from_alts]
loc