X-Git-Url: http://git.megacz.com/?a=blobdiff_plain;f=ghc%2Fcompiler%2FdeSugar%2FDsGRHSs.lhs;h=b36632699daa4914d1480ca806ccfefc8ce367df;hb=3721dd37a707d2aacb5cac814410a78096e28a2c;hp=3f79cf801e16dced9914dd0bcf275cac9ead7b86;hpb=d069cec2bd92d4156aeab80f7eb1f222a82e4103;p=ghc-hetmet.git diff --git a/ghc/compiler/deSugar/DsGRHSs.lhs b/ghc/compiler/deSugar/DsGRHSs.lhs index 3f79cf8..b366326 100644 --- a/ghc/compiler/deSugar/DsGRHSs.lhs +++ b/ghc/compiler/deSugar/DsGRHSs.lhs @@ -8,18 +8,23 @@ module DsGRHSs ( dsGuarded, dsGRHSs ) where #include "HsVersions.h" -import {-# SOURCE #-} DsExpr ( dsExpr, dsLet ) +import {-# SOURCE #-} DsExpr ( dsLExpr, dsLet ) import {-# SOURCE #-} Match ( matchSinglePat ) -import HsSyn ( Stmt(..), HsExpr(..), GRHSs(..), GRHS(..), HsMatchContext(..) ) -import TcHsSyn ( TypecheckedGRHSs, TypecheckedPat, TypecheckedStmt, TypecheckedMatchContext ) +import HsSyn ( Stmt(..), HsExpr(..), GRHSs(..), GRHS(..), + HsMatchContext(..), Pat(..) ) import CoreSyn ( CoreExpr ) -import TcType ( Type ) +import Type ( Type ) +import Var ( Id ) import DsMonad import DsUtils +import Unique ( Uniquable(..) ) import PrelInfo ( nON_EXHAUSTIVE_GUARDS_ERROR_ID ) -import PrelNames ( otherwiseIdKey, trueDataConKey, hasKey ) +import TysWiredIn ( trueDataConId ) +import PrelNames ( otherwiseIdKey, hasKey ) +import Name ( Name ) +import SrcLoc ( unLoc, Located(..) ) \end{code} @dsGuarded@ is used for both @case@ expressions and pattern bindings. @@ -34,7 +39,7 @@ producing an expression with a runtime error in the corner if necessary. The type argument gives the type of the @ei@. \begin{code} -dsGuarded :: TypecheckedGRHSs -> DsM CoreExpr +dsGuarded :: GRHSs Id -> DsM CoreExpr dsGuarded grhss = dsGRHSs PatBindRhs [] grhss `thenDs` \ (err_ty, match_result) -> @@ -45,12 +50,12 @@ dsGuarded grhss In contrast, @dsGRHSs@ produces a @MatchResult@. \begin{code} -dsGRHSs :: TypecheckedMatchContext -> [TypecheckedPat] -- These are to build a MatchContext from - -> TypecheckedGRHSs -- Guarded RHSs +dsGRHSs :: HsMatchContext Name -> [Pat Id] -- These are to build a MatchContext from + -> GRHSs Id -- Guarded RHSs -> DsM (Type, MatchResult) -dsGRHSs kind pats (GRHSs grhss binds (Just ty)) - = mapDs (dsGRHS kind pats) grhss `thenDs` \ match_results -> +dsGRHSs kind pats (GRHSs grhss binds ty) + = mappM (dsGRHS kind pats) grhss `thenDs` \ match_results -> let match_result1 = foldr1 combineMatchResults match_results match_result2 = adjustMatchResultDs (dsLet binds) match_result1 @@ -58,8 +63,8 @@ dsGRHSs kind pats (GRHSs grhss binds (Just ty)) in returnDs (ty, match_result2) -dsGRHS kind pats (GRHS guard locn) - = matchGuard guard (DsMatchContext kind pats locn) +dsGRHS kind pats (L loc (GRHS guard)) + = matchGuard (map unLoc guard) (DsMatchContext kind pats loc) \end{code} @@ -70,27 +75,29 @@ dsGRHS kind pats (GRHS guard locn) %************************************************************************ \begin{code} -matchGuard :: [TypecheckedStmt] -- Guard +matchGuard :: [Stmt Id] -- Guard -> DsMatchContext -- Context -> DsM MatchResult --- See comments with HsExpr.HsStmt re what an ExprStmt means +-- See comments with HsExpr.Stmt re what an ExprStmt means -- Here we must be in a guard context (not do-expression, nor list-comp) -matchGuard [ResultStmt expr locn] ctx - = putSrcLocDs locn (dsExpr expr) `thenDs` \ core_expr -> +matchGuard [ResultStmt expr] ctx + = dsLExpr expr `thenDs` \ core_expr -> returnDs (cantFailMatchResult core_expr) -- ExprStmts must be guards -- Turn an "otherwise" guard is a no-op -matchGuard (ExprStmt (HsVar v) _ : stmts) ctx +matchGuard (ExprStmt (L _ (HsVar v)) _ : stmts) ctx | v `hasKey` otherwiseIdKey - || v `hasKey` trueDataConKey + || v `hasKey` getUnique trueDataConId + -- trueDataConId doesn't have the same + -- unique as trueDataCon = matchGuard stmts ctx -matchGuard (ExprStmt expr locn : stmts) ctx - = matchGuard stmts ctx `thenDs` \ match_result -> - putSrcLocDs locn (dsExpr expr) `thenDs` \ pred_expr -> +matchGuard (ExprStmt expr _ : stmts) ctx + = matchGuard stmts ctx `thenDs` \ match_result -> + dsLExpr expr `thenDs` \ pred_expr -> returnDs (mkGuardedMatchResult pred_expr match_result) matchGuard (LetStmt binds : stmts) ctx @@ -98,9 +105,9 @@ matchGuard (LetStmt binds : stmts) ctx returnDs (adjustMatchResultDs (dsLet binds) match_result) -- NB the dsLet occurs inside the match_result -matchGuard (BindStmt pat rhs locn : stmts) ctx +matchGuard (BindStmt pat rhs : stmts) ctx = matchGuard stmts ctx `thenDs` \ match_result -> - putSrcLocDs locn (dsExpr rhs) `thenDs` \ core_rhs -> + dsLExpr rhs `thenDs` \ core_rhs -> matchSinglePat core_rhs ctx pat match_result \end{code}