IMP_Ubiq()
IMPORT_1_3(List(partition))
-import HsSyn ( HsBinds(..), Bind(..), MonoBinds(..), Match(..), GRHSsAndBinds(..),
+import HsSyn ( HsBinds(..), MonoBinds(..), Match(..), GRHSsAndBinds(..),
GRHS(..), HsExpr(..), HsLit(..), InPat(..), Stmt(..), DoOrListComp(..),
+ SYN_IE(RecFlag), recursive,
ArithSeqInfo, Sig, HsType, FixityDecl, Fixity, Fake )
import RdrHsSyn ( RdrName(..), varQual, varUnqual, mkOpApp,
SYN_IE(RdrNameMonoBinds), SYN_IE(RdrNameHsExpr), SYN_IE(RdrNamePat)
)
--- import RnHsSyn ( RenamedFixityDecl(..) )
-
-import Id ( GenId, dataConNumFields, isNullaryDataCon, dataConTag,
+import BasicTypes ( IfaceFlavour(..) )
+import Id ( GenId, isNullaryDataCon, dataConTag,
dataConRawArgTys, fIRST_TAG,
- isDataCon, SYN_IE(DataCon), SYN_IE(ConTag) )
+ isDataCon, SYN_IE(DataCon), SYN_IE(ConTag),
+ SYN_IE(Id) )
import Maybes ( maybeToBool )
import Name ( getOccString, getOccName, getSrcLoc, occNameString, modAndOcc, OccName, Name )
import PrimOp ( PrimOp(..) )
import PrelInfo -- Lots of RdrNames
-import SrcLoc ( mkGeneratedSrcLoc )
-import TyCon ( TyCon, tyConDataCons, isEnumerationTyCon, maybeTyConSingleCon )
-import Type ( eqTy, isPrimType )
+import SrcLoc ( mkGeneratedSrcLoc, SrcLoc )
+import TyCon ( TyCon, isNewTyCon, tyConDataCons, isEnumerationTyCon, maybeTyConSingleCon )
+import Type ( eqTy, isPrimType, SYN_IE(Type) )
import TysPrim ( charPrimTy, intPrimTy, wordPrimTy, addrPrimTy,
floatPrimTy, doublePrimTy
)
gen_Eq_binds tycon
= let
tycon_loc = getSrcLoc tycon
- (nullary_cons, nonnullary_cons)
- = partition isNullaryDataCon (tyConDataCons tycon)
+ (nullary_cons, nonnullary_cons)
+ | isNewTyCon tycon = ([], tyConDataCons tycon)
+ | otherwise = partition isNullaryDataCon (tyConDataCons tycon)
rest
= if (null nullary_cons) then
(cmp_tags_Expr ltH_Int_RDR ah_RDR bh_RDR ltTag_Expr gtTag_Expr)))
(nullary_cons, nonnullary_cons)
- = partition isNullaryDataCon (tyConDataCons tycon)
+ | isNewTyCon tycon = ([], tyConDataCons tycon)
+ | otherwise = partition isNullaryDataCon (tyConDataCons tycon)
cmp_eq
= mk_FunMonoBind tycon_loc cmp_eq_RDR (map pats_etc nonnullary_cons ++
data_con_N_RDR = qual_orig_name data_con_N
----- single-constructor-flavored: -------------
- arity = dataConNumFields data_con_1
+ arity = argFieldCount data_con_1
min_bound_1con = mk_easy_FunMonoBind tycon_loc minBound_RDR [] [] $
mk_easy_App data_con_1_RDR (nOfThem arity minBound_RDR)
else
dc
- con_arity = dataConNumFields data_con
+ con_arity = argFieldCount data_con
data_con_RDR = qual_orig_name data_con
con_pat xs = ConPatIn data_con_RDR (map VarPatIn xs)
con_expr xs = mk_easy_App data_con_RDR xs
= let
data_con_RDR = qual_orig_name data_con
data_con_str= occNameString (getOccName data_con)
- con_arity = dataConNumFields data_con
+ con_arity = argFieldCount data_con
as_needed = take con_arity as_RDRs
bs_needed = take con_arity bs_RDRs
con_expr = mk_easy_App data_con_RDR as_needed
- nullary_con = isNullaryDataCon data_con
+ nullary_con = con_arity == 0
con_qual
= BindStmt
pats_etc data_con
= let
data_con_RDR = qual_orig_name data_con
- con_arity = dataConNumFields data_con
+ con_arity = argFieldCount data_con
bs_needed = take con_arity bs_RDRs
con_pat = ConPatIn data_con_RDR (map VarPatIn bs_needed)
- nullary_con = isNullaryDataCon data_con
+ nullary_con = con_arity == 0
show_con
= let nm = occNameString (getOccName data_con)
= ASSERT(isDataCon var)
([pat], HsLit (HsIntPrim (toInteger ((dataConTag var) - fIRST_TAG))))
where
- pat = ConPatIn var_RDR (nOfThem (dataConNumFields var) WildPatIn)
+ pat = ConPatIn var_RDR (nOfThem (argFieldCount var) WildPatIn)
var_RDR = qual_orig_name var
gen_tag_n_con_monobind (rdr_name, tycon, GenTag2Con)
= mk_match loc pats expr (mkbind binds)
where
mkbind [] = EmptyBinds
- mkbind bs = SingleBind (RecBind (foldr1 AndMonoBinds bs))
+ mkbind bs = MonoBind (foldr1 AndMonoBinds bs) [] recursive
-- The renamer expects everything in its input to be a
-- "recursive" MonoBinds, and it is its job to sort things out
-- from there.
\end{code}
\begin{code}
+argFieldCount :: Id -> Int -- Works on data and newtype constructors
+argFieldCount con = length (dataConRawArgTys con)
+\end{code}
+
+\begin{code}
untag_Expr :: TyCon -> [(RdrName, RdrName)] -> RdrNameHsExpr -> RdrNameHsExpr
untag_Expr tycon [] expr = expr
untag_Expr tycon ((untag_this, put_tag_here) : more) expr
\end{code}
\begin{code}
-qual_orig_name n = case modAndOcc n of { (m,n) -> Qual m n }
+qual_orig_name n = case modAndOcc n of { (m,n) -> Qual m n HiFile }
a_RDR = varUnqual SLIT("a")
b_RDR = varUnqual SLIT("b")