X-Git-Url: http://git.megacz.com/?a=blobdiff_plain;f=compiler%2Ftypecheck%2FTcArrows.lhs;h=231901c068484494c8249f13e9bc285708765258;hb=6ee15d3170297b3f7e4f5aaeba90d7fd0e19367c;hp=11daed77dae22f7c89997e2afd6adaaa832b75ae;hpb=30c122df62ec75f9ed7f392f24c2925675bf1d06;p=ghc-hetmet.git diff --git a/compiler/typecheck/TcArrows.lhs b/compiler/typecheck/TcArrows.lhs index 11daed7..231901c 100644 --- a/compiler/typecheck/TcArrows.lhs +++ b/compiler/typecheck/TcArrows.lhs @@ -5,17 +5,8 @@ Typecheck arrow notation \begin{code} -{-# OPTIONS -w #-} --- The above warning supression flag is a temporary kludge. --- While working on this module you are encouraged to remove it and fix --- any warnings in the module. See --- http://hackage.haskell.org/trac/ghc/wiki/Commentary/CodingStyle#Warnings --- for details - module TcArrows ( tcProc ) where -#include "HsVersions.h" - import {-# SOURCE #-} TcExpr( tcMonoExpr, tcInferRho ) import HsSyn @@ -36,7 +27,6 @@ import Name import TysWiredIn import VarSet import TysPrim -import Type import SrcLoc import Outputable @@ -62,7 +52,7 @@ tcProc pat cmd exp_ty do { ((exp_ty1, res_ty), coi) <- boxySplitAppTy exp_ty ; ((arr_ty, arg_ty), coi1) <- boxySplitAppTy exp_ty1 ; let cmd_env = CmdEnv { cmd_arr = arr_ty } - ; (pat', cmd') <- tcProcPat pat arg_ty res_ty $ + ; (pat', cmd') <- tcPat ProcExpr pat arg_ty res_ty $ tcCmdTop cmd_env cmd [] ; let res_coi = mkTransCoI coi (mkAppTyCoI exp_ty1 coi1 res_ty IdCo) ; return (pat', cmd', res_coi) @@ -119,6 +109,7 @@ tcCmd env (L loc expr) res_ty { expr' <- tc_cmd env expr res_ty ; return (L loc expr') } +tc_cmd :: CmdEnv -> HsExpr Name -> (CmdStack, TcTauType) -> TcM (HsExpr TcId) tc_cmd env (HsPar cmd) res_ty = do { cmd' <- tcCmd env cmd res_ty ; return (HsPar cmd') } @@ -131,8 +122,7 @@ tc_cmd env (HsLet binds (L body_loc body)) res_ty tc_cmd env in_cmd@(HsCase scrut matches) (stk, res_ty) = addErrCtxt (cmdCtxt in_cmd) $ do - (scrut', scrut_ty) <- addErrCtxt (caseScrutCtxt scrut) $ - tcInferRho scrut + (scrut', scrut_ty) <- tcInferRho scrut matches' <- tcMatchesCase match_ctxt scrut_ty matches res_ty return (HsCase scrut' matches') where @@ -186,17 +176,17 @@ tc_cmd env cmd@(HsApp fun arg) (cmd_stk, res_ty) ------------------------------------------- -- Lambda -tc_cmd env cmd@(HsLam (MatchGroup [L mtch_loc (match@(Match pats maybe_rhs_sig grhss))] _)) +tc_cmd env cmd@(HsLam (MatchGroup [L mtch_loc (match@(Match pats _maybe_rhs_sig grhss))] _)) (cmd_stk, res_ty) - = addErrCtxt (matchCtxt match_ctxt match) $ + = addErrCtxt (pprMatchInCtxt match_ctxt match) $ do { -- Check the cmd stack is big enough ; checkTc (lengthAtLeast cmd_stk n_pats) (kappaUnderflow cmd) -- Check the patterns, and the GRHSs inside - ; (pats', grhss') <- setSrcSpan mtch_loc $ - tcLamPats pats cmd_stk res_ty $ + ; (pats', grhss') <- setSrcSpan mtch_loc $ + tcPats LambdaExpr pats cmd_stk res_ty $ tc_grhss grhss ; let match' = L mtch_loc (Match pats' Nothing grhss') @@ -222,7 +212,7 @@ tc_cmd env cmd@(HsLam (MatchGroup [L mtch_loc (match@(Match pats maybe_rhs_sig g ------------------------------------------- -- Do notation -tc_cmd env cmd@(HsDo do_or_lc stmts body ty) (cmd_stk, res_ty) +tc_cmd env cmd@(HsDo do_or_lc stmts body _ty) (cmd_stk, res_ty) = do { checkTc (null cmd_stk) (nonEmptyCmdStkErr cmd) ; (stmts', body') <- tcStmts do_or_lc tc_stmt stmts res_ty $ tcGuardedCmd env body [] @@ -247,7 +237,6 @@ tc_cmd env cmd@(HsDo do_or_lc stmts body ty) (cmd_stk, res_ty) tc_cmd env cmd@(HsArrForm expr fixity cmd_args) (cmd_stk, res_ty) = addErrCtxt (cmdCtxt cmd) $ do { cmds_w_tys <- zipWithM new_cmd_ty cmd_args [1..] - ; span <- getSrcSpanM ; [w_tv] <- tcInstSkolTyVars ArrowSkol [alphaTyVar] ; let w_ty = mkTyVarTy w_tv -- Just a convenient starting point @@ -305,22 +294,21 @@ tc_cmd env cmd@(HsArrForm expr fixity cmd_args) (cmd_stk, res_ty) unscramble :: TcType -> (TcType, [TcType]) -- unscramble ((w,s1) .. sn) = (w, [s1..sn]) - unscramble ty + unscramble ty = unscramble' ty [] + + unscramble' ty ss = case tcSplitTyConApp_maybe ty of Just (tc, [t,s]) | tc == pairTyCon - -> let - (w,ss) = unscramble t - in (w, s:ss) - - other -> (ty, []) + -> unscramble' t (s:ss) + _ -> (ty, ss) ----------------------------------------------------------------- -- Base case for illegal commands -- This is where expressions that aren't commands get rejected -tc_cmd env cmd _ - = failWithTc (vcat [ptext SLIT("The expression"), nest 2 (ppr cmd), - ptext SLIT("was found where an arrow command was expected")]) +tc_cmd _ cmd _ + = failWithTc (vcat [ptext (sLit "The expression"), nest 2 (ppr cmd), + ptext (sLit "was found where an arrow command was expected")]) \end{code} @@ -332,6 +320,7 @@ tc_cmd env cmd _ \begin{code} +mkPairTy :: Type -> Type -> Type mkPairTy t1 t2 = mkTyConApp pairTyCon [t1,t2] arrowTyConKind :: Kind -- *->*->* @@ -346,20 +335,21 @@ arrowTyConKind = mkArrowKinds [liftedTypeKind, liftedTypeKind] liftedTypeKind %************************************************************************ \begin{code} -cmdCtxt cmd = ptext SLIT("In the command:") <+> ppr cmd - -caseScrutCtxt cmd - = hang (ptext SLIT("In the scrutinee of a case command:")) 4 (ppr cmd) +cmdCtxt :: HsExpr Name -> SDoc +cmdCtxt cmd = ptext (sLit "In the command:") <+> ppr cmd +nonEmptyCmdStkErr :: HsExpr Name -> SDoc nonEmptyCmdStkErr cmd - = hang (ptext SLIT("Non-empty command stack at command:")) + = hang (ptext (sLit "Non-empty command stack at command:")) 4 (ppr cmd) +kappaUnderflow :: HsExpr Name -> SDoc kappaUnderflow cmd - = hang (ptext SLIT("Command stack underflow at command:")) + = hang (ptext (sLit "Command stack underflow at command:")) 4 (ppr cmd) +badFormFun :: Int -> TcType -> SDoc badFormFun i tup_ty' - = hang (ptext SLIT("The type of the") <+> speakNth i <+> ptext SLIT("argument of a command form has the wrong shape")) - 4 (ptext SLIT("Argument type:") <+> ppr tup_ty') + = hang (ptext (sLit "The type of the") <+> speakNth i <+> ptext (sLit "argument of a command form has the wrong shape")) + 4 (ptext (sLit "Argument type:") <+> ppr tup_ty') \end{code}