import DsUtils
import DsArrows
import DsMonad
+import Name
#ifdef GHCI
import PrelNames
-- below. Then pattern-match would fail. Urk.)
putSrcSpanDs loc $
case bind of
- FunBind { fun_id = L _ fun, fun_matches = matches, fun_co_fn = co_fn, fun_tick = tick }
- -> matchWrapper (FunRhs (idName fun)) matches `thenDs` \ (args, rhs) ->
+ FunBind { fun_id = L _ fun, fun_matches = matches, fun_co_fn = co_fn,
+ fun_tick = tick, fun_infix = inf }
+ -> matchWrapper (FunRhs (idName fun ) inf) matches `thenDs` \ (args, rhs) ->
ASSERT( null args ) -- Functions aren't lifted
ASSERT( isIdHsWrapper co_fn )
mkOptTickBox tick rhs `thenDs` \ rhs' ->
constructor @C@, setting all of @C@'s fields to bottom.
\begin{code}
-dsExpr (RecordCon (L _ data_con_id) con_expr (HsRecordBinds rbinds))
+dsExpr (RecordCon (L _ data_con_id) con_expr rbinds)
= dsExpr con_expr `thenDs` \ con_expr' ->
let
(arg_tys, _) = tcSplitFunTys (exprType con_expr')
-- hence TcType.tcSplitFunTys
mk_arg (arg_ty, lbl) -- Selector id has the field label as its name
- = case [rhs | (L _ sel_id, rhs) <- rbinds, lbl == idName sel_id] of
+ = case findField (rec_flds rbinds) lbl of
(rhs:rhss) -> ASSERT( null rhss )
dsLExpr rhs
[] -> mkErrorAppDs rEC_CON_ERROR_ID arg_ty (showSDoc (ppr lbl))
dictionaries.
\begin{code}
-dsExpr (RecordUpd record_expr (HsRecordBinds []) _ _ _)
+dsExpr expr@(RecordUpd record_expr (HsRecFields { rec_flds = fields })
+ cons_to_upd in_inst_tys out_inst_tys)
+ | null fields
= dsLExpr record_expr
-
-dsExpr expr@(RecordUpd record_expr (HsRecordBinds rbinds) cons_to_upd in_inst_tys out_inst_tys)
+ | otherwise
= -- Record stuff doesn't work for existentials
-- The type checker checks for this, but we need
-- worry only about the constructors that are to be updated
(mkFamilyTyConApp tycon out_inst_tys)
mk_val_arg field old_arg_id
- = case [rhs | (L _ sel_id, rhs) <- rbinds, field == idName sel_id] of
+ = case findField fields field of
(rhs:rest) -> ASSERT(null rest) rhs
[] -> nlHsVar old_arg_id
dsExpr (ExprWithTySig _ _) = panic "dsExpr:ExprWithTySig"
#endif
+
+findField :: [HsRecField Id arg] -> Name -> [arg]
+findField rbinds lbl
+ = [rhs | HsRecField { hsRecFieldId = id, hsRecFieldArg = rhs } <- rbinds
+ , lbl == idName (unLoc id) ]
\end{code}
%--------------------------------------------------------------------