Print infix function definitions correctly in HsSyn
[ghc-hetmet.git] / compiler / deSugar / DsExpr.lhs
index 23db23f..34a3a20 100644 (file)
@@ -19,14 +19,12 @@ import DsListComp
 import DsUtils
 import DsArrows
 import DsMonad
+import Name
 
 #ifdef GHCI
 import PrelNames
-import DsBreakpoint
        -- Template Haskell stuff iff bootstrapped
 import DsMeta
-#else
-import DsBreakpoint
 #endif
 
 import HsSyn
@@ -43,7 +41,6 @@ import CostCentre
 import Id
 import PrelInfo
 import DataCon
-import TyCon
 import TysWiredIn
 import BasicTypes
 import PrelNames
@@ -52,8 +49,6 @@ import Util
 import Bag
 import Outputable
 import FastString
-
-import Data.Maybe
 \end{code}
 
 
@@ -109,8 +104,9 @@ ds_val_bind (NonRecursive, hsbinds) body
        --       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' ->
@@ -189,21 +185,6 @@ scrungleMatch var scrut body
 \begin{code}
 dsLExpr :: LHsExpr Id -> DsM CoreExpr
 
-#if defined(GHCI)
-dsLExpr (L loc expr@(HsWrap w (HsVar v)))
-    | idName v `elem` [breakpointName, breakpointCondName, breakpointAutoName]
-    , WpTyApp ty <- simpWrapper w
-    = do areBreakpointsEnabled <- breakpoints_enabled
-         if areBreakpointsEnabled
-           then do
-              L _ breakpointExpr <- mkBreakpointExpr loc v ty
-              dsLExpr (L loc $ HsWrap w breakpointExpr)
-           else putSrcSpanDs loc $ dsExpr expr
-       where simpWrapper (WpCompose w1 WpHole) = w1
-             simpWrapper (WpCompose WpHole w1) = w1
-             simpWrapper w = w
-#endif
-
 dsLExpr (L loc e) = putSrcSpanDs loc $ dsExpr e
 
 dsExpr :: HsExpr Id -> DsM CoreExpr
@@ -227,7 +208,7 @@ dsExpr expr@(HsLam a_Match)
 dsExpr expr@(HsApp fun arg)      
   = dsLExpr fun                `thenDs` \ core_fun ->
     dsLExpr arg                `thenDs` \ core_arg ->
-    returnDs (core_fun `App` core_arg)
+    returnDs (core_fun `mkDsApp` core_arg)
 \end{code}
 
 Operator sections.  At first it looks as if we can convert
@@ -257,12 +238,12 @@ dsExpr (OpApp e1 op _ e2)
     -- for the type of y, we need the type of op's 2nd argument
     dsLExpr e1                         `thenDs` \ x_core ->
     dsLExpr e2                         `thenDs` \ y_core ->
-    returnDs (mkApps core_op [x_core, y_core])
+    returnDs (mkDsApps core_op [x_core, y_core])
     
 dsExpr (SectionL expr op)      -- Desugar (e !) to ((!) e)
   = dsLExpr op                         `thenDs` \ core_op ->
     dsLExpr expr                       `thenDs` \ x_core ->
-    returnDs (App core_op x_core)
+    returnDs (mkDsApp core_op x_core)
 
 -- dsLExpr (SectionR op expr)  -- \ x -> op x expr
 dsExpr (SectionR op expr)
@@ -277,7 +258,7 @@ dsExpr (SectionR op expr)
     newSysLocalDs y_ty                 `thenDs` \ y_id ->
 
     returnDs (bindNonRec y_id y_core $
-             Lam x_id (mkApps core_op [Var x_id, Var y_id]))
+             Lam x_id (mkDsApps core_op [Var x_id, Var y_id]))
 
 dsExpr (HsSCC cc expr)
   = dsLExpr expr                       `thenDs` \ core_expr ->
@@ -299,8 +280,7 @@ dsExpr (HsCase discrim matches)
 -- Pepe: The binds are in scope in the body but NOT in the binding group
 --       This is to avoid silliness in breakpoints
 dsExpr (HsLet binds body)
-  = (bindLocalsDs (map unLoc $ collectLocalBinders binds) $ 
-     dsAndThenMaybeInsertBreakpoint body) `thenDs` \ body' ->
+  = dsLExpr body `thenDs` \ body' ->
     dsLocalBinds binds body'
 
 -- We need the `ListComp' form to use `deListComp' (rather than the "do" form)
@@ -437,7 +417,7 @@ dsExpr (RecordCon (L _ data_con_id) con_expr rbinds)
        -- 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))
@@ -477,70 +457,51 @@ might do some argument-evaluation first; and may have to throw away some
 dictionaries.
 
 \begin{code}
-dsExpr (RecordUpd record_expr [] record_in_ty record_out_ty)
+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 rbinds record_in_ty record_out_ty)
-  = dsLExpr record_expr                `thenDs` \ record_expr' ->
-
-       -- Desugar the rbinds, and generate let-bindings if
-       -- necessary so that we don't lose sharing
-
-    let
-       in_inst_tys  = tcTyConAppArgs record_in_ty      -- Newtype opaque
-       out_inst_tys = tcTyConAppArgs record_out_ty     -- Newtype opaque
-       in_out_ty    = mkFunTy record_in_ty record_out_ty
-
-       mk_val_arg field old_arg_id 
-         = case [rhs | (L _ sel_id, rhs) <- rbinds, field == idName sel_id] of
-             (rhs:rest) -> ASSERT(null rest) rhs
-             []         -> nlHsVar old_arg_id
-
-       mk_alt con
-         = ASSERT( isVanillaDataCon con )
-           newSysLocalsDs (dataConInstOrigArgTys con in_inst_tys) `thenDs` \ arg_ids ->
-               -- This call to dataConInstOrigArgTys won't work for existentials
-               -- but existentials don't have record types anyway
-           let 
-               val_args = zipWithEqual "dsExpr:RecordUpd" mk_val_arg
-                                       (dataConFieldLabels con) arg_ids
-               rhs = foldl (\a b -> nlHsApp a b)
-                           (nlHsTyApp (dataConWrapId con) out_inst_tys)
-                           val_args
-           in
-           returnDs (mkSimpleMatch [mkPrefixConPat con (map nlVarPat arg_ids) record_in_ty] rhs)
-    in
-       -- Record stuff doesn't work for existentials
+  | 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
-    ASSERT2( all isVanillaDataCon cons_to_upd, ppr expr )
+    ASSERT2( notNull cons_to_upd && all isVanillaDataCon cons_to_upd, ppr expr )
+
+    do { record_expr' <- dsLExpr record_expr
+       ; let   -- Awkwardly, for families, the match goes 
+               -- from instance type to family type
+               tycon     = dataConTyCon (head cons_to_upd)
+               in_ty     = mkTyConApp tycon in_inst_tys
+               in_out_ty = mkFunTy in_ty
+                                   (mkFamilyTyConApp tycon out_inst_tys)
+
+               mk_val_arg field old_arg_id 
+                 = case findField fields field  of
+                     (rhs:rest) -> ASSERT(null rest) rhs
+                     []         -> nlHsVar old_arg_id
+
+               mk_alt con
+                 = ASSERT( isVanillaDataCon con )
+                   do  { arg_ids <- newSysLocalsDs (dataConInstOrigArgTys con in_inst_tys)
+                       -- This call to dataConInstOrigArgTys won't work for existentials
+                       -- but existentials don't have record types anyway
+                       ; let val_args = zipWithEqual "dsExpr:RecordUpd" mk_val_arg
+                                               (dataConFieldLabels con) arg_ids
+                             rhs = foldl (\a b -> nlHsApp a b)
+                                         (nlHsTyApp (dataConWrapId con) out_inst_tys)
+                                         val_args
+                             pat = mkPrefixConPat con (map nlVarPat arg_ids) in_ty
+
+                       ; return (mkSimpleMatch [pat] rhs) }
 
        -- It's important to generate the match with matchWrapper,
        -- and the right hand sides with applications of the wrapper Id
        -- so that everything works when we are doing fancy unboxing on the
        -- constructor aguments.
-    mappM mk_alt cons_to_upd                           `thenDs` \ alts ->
-    matchWrapper RecUpd (MatchGroup alts in_out_ty)    `thenDs` \ ([discrim_var], matching_code) ->
-
-    returnDs (bindNonRec discrim_var record_expr' matching_code)
+       ; alts <- mapM mk_alt cons_to_upd
+       ; ([discrim_var], matching_code) <- matchWrapper RecUpd (MatchGroup alts in_out_ty)
 
-  where
-    updated_fields :: [FieldLabel]
-    updated_fields = [ idName sel_id | (L _ sel_id,_) <- rbinds]
-
-       -- Get the type constructor from the record_in_ty
-       -- so that we are sure it'll have all its DataCons
-       -- (In GHCI, it's possible that some TyCons may not have all
-       --  their constructors, in a module-loop situation.)
-    tycon       = tcTyConAppTyCon record_in_ty
-    data_cons   = tyConDataCons tycon
-    cons_to_upd = filter has_all_fields data_cons
-
-    has_all_fields :: DataCon -> Bool
-    has_all_fields con_id 
-      = all (`elem` con_fields) updated_fields
-      where
-       con_fields = dataConFieldLabels con_id
+       ; return (bindNonRec discrim_var record_expr' matching_code) }
 \end{code}
 
 Here is where we desugar the Template Haskell brackets and escapes
@@ -560,9 +521,9 @@ dsExpr (HsProc pat cmd) = dsProcExpr pat cmd
 Hpc Support 
 
 \begin{code}
-dsExpr (HsTick ix e) = do
+dsExpr (HsTick ix vars e) = do
   e' <- dsLExpr e
-  mkTickBox ix e'
+  mkTickBox ix vars e'
 
 -- There is a problem here. The then and else branches
 -- have no free variables, so they are open to lifting.
@@ -585,6 +546,11 @@ dsExpr (HsBinTick ixT ixF e) = do
 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}
 
 %--------------------------------------------------------------------
@@ -602,30 +568,26 @@ dsDo      :: [LStmt Id]
 dsDo stmts body result_ty
   = go (map unLoc stmts)
   where
-    go [] = dsAndThenMaybeInsertBreakpoint body
+    go [] = dsLExpr body
     
     go (ExprStmt rhs then_expr _ : stmts)
-      = do { rhs2 <- dsAndThenMaybeInsertBreakpoint rhs
+      = do { rhs2 <- dsLExpr rhs
           ; then_expr2 <- dsExpr then_expr
           ; rest <- go stmts
           ; returnDs (mkApps then_expr2 [rhs2, rest]) }
     
     go (LetStmt binds : stmts)
-      = do { rest <- bindLocalsDs (map unLoc$ collectLocalBinders binds) $ 
-                      go stmts
+      = do { rest <- go stmts
           ; dsLocalBinds binds rest }
 
-    -- Notice how due to the placement of bindLocals, binders in this stmt
-    -- are available in posterior stmts but Not in this one rhs.
-    -- This is to avoid silliness in breakpoints
     go (BindStmt pat rhs bind_op fail_op : stmts)
       = 
-       do { body  <- bindLocalsDs (collectPatBinders pat) $ go stmts
+       do { body  <- go stmts
           ; var   <- selectSimpleMatchVarL pat
           ; match <- matchSinglePat (Var var) (StmtCtxt DoExpr) pat
                                  result_ty (cantFailMatchResult body)
           ; match_code <- handle_failure pat match fail_op
-           ; rhs'       <- dsAndThenMaybeInsertBreakpoint rhs
+           ; rhs'       <- dsLExpr rhs
           ; bind_op'   <- dsExpr bind_op
           ; returnDs (mkApps bind_op' [rhs', Lam var match_code]) }
     
@@ -675,12 +637,12 @@ dsMDo tbl stmts body result_ty
           ; dsLocalBinds binds rest }
 
     go (ExprStmt rhs _ rhs_ty : stmts)
-      = do { rhs2 <- dsAndThenMaybeInsertBreakpoint rhs
+      = do { rhs2 <- dsLExpr rhs
           ; rest <- go stmts
           ; returnDs (mkApps (Var then_id) [Type rhs_ty, Type b_ty, rhs2, rest]) }
     
     go (BindStmt pat rhs _ _ : stmts)
-      = do { body  <- bindLocalsDs (collectPatBinders pat) $ go stmts
+      = do { body  <- go stmts
           ; var   <- selectSimpleMatchVarL pat
           ; match <- matchSinglePat (Var var) (StmtCtxt ctxt) pat
                                  result_ty (cantFailMatchResult body)
@@ -688,7 +650,7 @@ dsMDo tbl stmts body result_ty
           ; let fail_expr = mkApps (Var fail_id) [Type b_ty, fail_msg]
           ; match_code <- extractMatchResult match fail_expr
 
-          ; rhs'       <- dsAndThenMaybeInsertBreakpoint rhs
+          ; rhs'       <- dsLExpr rhs
           ; returnDs (mkApps (Var bind_id) [Type (hsLPatType pat), Type b_ty, 
                                             rhs', Lam var match_code]) }