X-Git-Url: http://git.megacz.com/?a=blobdiff_plain;f=compiler%2Ftypecheck%2FTcHsSyn.lhs;h=4c76b428fcaf80de0fafbaca4aea4cecd675abe0;hb=25f84fa7e4b84c3db5ba745a7881c009b778e0b1;hp=56c98dc13990e0a7205c2217cd79a18c7963b53b;hpb=b1ab4b8a607addc4d097588db5761313c996a41f;p=ghc-hetmet.git diff --git a/compiler/typecheck/TcHsSyn.lhs b/compiler/typecheck/TcHsSyn.lhs index 56c98dc..4c76b42 100644 --- a/compiler/typecheck/TcHsSyn.lhs +++ b/compiler/typecheck/TcHsSyn.lhs @@ -9,6 +9,13 @@ This module is an extension of @HsSyn@ syntax, for use in the type checker. \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 TcHsSyn ( mkHsConApp, mkHsDictLet, mkHsApp, hsLitType, hsLPatType, hsPatType, @@ -86,11 +93,6 @@ hsPatType (SigPatOut pat ty) = ty hsPatType (NPat lit _ _ ty) = ty hsPatType (NPlusKPat id _ _ _) = idType (unLoc id) hsPatType (CoPat _ _ ty) = ty -hsPatType (DictPat ds ms) = case (ds ++ ms) of - [] -> unitTy - [d] -> idType d - ds -> mkTupleTy Boxed (length ds) (map idType ds) - hsLitType :: HsLit -> TcType hsLitType (HsChar c) = charTy @@ -457,16 +459,16 @@ zonkExpr env (ExplicitTuple exprs boxed) returnM (ExplicitTuple new_exprs boxed) zonkExpr env (RecordCon data_con con_expr rbinds) - = zonkExpr env con_expr `thenM` \ new_con_expr -> - zonkRbinds env rbinds `thenM` \ new_rbinds -> - returnM (RecordCon data_con new_con_expr new_rbinds) + = do { new_con_expr <- zonkExpr env con_expr + ; new_rbinds <- zonkRecFields env rbinds + ; return (RecordCon data_con new_con_expr new_rbinds) } zonkExpr env (RecordUpd expr rbinds cons in_tys out_tys) - = zonkLExpr env expr `thenM` \ new_expr -> - mapM (zonkTcTypeToType env) in_tys `thenM` \ new_in_tys -> - mapM (zonkTcTypeToType env) out_tys `thenM` \ new_out_tys -> - zonkRbinds env rbinds `thenM` \ new_rbinds -> - returnM (RecordUpd new_expr new_rbinds cons new_in_tys new_out_tys) + = do { new_expr <- zonkLExpr env expr + ; new_in_tys <- mapM (zonkTcTypeToType env) in_tys + ; new_out_tys <- mapM (zonkTcTypeToType env) out_tys + ; new_rbinds <- zonkRecFields env rbinds + ; return (RecordUpd new_expr new_rbinds cons new_in_tys new_out_tys) } zonkExpr env (ExprWithTySigOut e ty) = do { e' <- zonkLExpr env e @@ -644,14 +646,15 @@ zonkStmt env (BindStmt pat expr bind_op fail_op) ------------------------------------------------------------------------- -zonkRbinds :: ZonkEnv -> HsRecordBinds TcId -> TcM (HsRecordBinds Id) - -zonkRbinds env (HsRecordBinds rbinds) - = mappM zonk_rbind rbinds >>= return . HsRecordBinds +zonkRecFields :: ZonkEnv -> HsRecordBinds TcId -> TcM (HsRecordBinds TcId) +zonkRecFields env (HsRecFields flds dd) + = do { flds' <- mappM zonk_rbind flds + ; return (HsRecFields flds' dd) } where - zonk_rbind (field, expr) - = zonkLExpr env expr `thenM` \ new_expr -> - returnM (fmap (zonkIdOcc env) field, new_expr) + zonk_rbind fld + = do { new_expr <- zonkLExpr env (hsRecFieldArg fld) + ; return (fld { hsRecFieldArg = new_expr }) } + -- Field selectors have declared types; hence no zonking ------------------------------------------------------------------------- mapIPNameTc :: (a -> TcM b) -> IPName a -> TcM (IPName b) @@ -751,11 +754,6 @@ zonk_pat env (NPlusKPat (L loc n) lit e1 e2) ; e2' <- zonkExpr env e2 ; return (extendZonkEnv1 env n', NPlusKPat (L loc n') lit' e1' e2') } -zonk_pat env (DictPat ds ms) - = do { ds' <- zonkIdBndrs env ds - ; ms' <- zonkIdBndrs env ms - ; return (extendZonkEnv env (ds' ++ ms'), DictPat ds' ms') } - zonk_pat env (CoPat co_fn pat ty) = do { (env', co_fn') <- zonkCoFn env co_fn ; (env'', pat') <- zonkPat env' (noLoc pat) @@ -774,11 +772,11 @@ zonkConStuff env (InfixCon p1 p2) ; (env', p2') <- zonkPat env1 p2 ; return (env', InfixCon p1' p2') } -zonkConStuff env (RecCon rpats) - = do { let (fields, pats) = unzip [ (f, p) | HsRecField f p _ <- rpats ] - ; (env', pats') <- zonkPats env pats - ; let recCon = RecCon [ mkRecField f p | (f, p) <- zip fields pats' ] - ; returnM (env', recCon) } +zonkConStuff env (RecCon (HsRecFields rpats dd)) + = do { (env', pats') <- zonkPats env (map hsRecFieldArg rpats) + ; let rpats' = zipWith (\rp p' -> rp { hsRecFieldArg = p' }) rpats pats' + ; returnM (env', RecCon (HsRecFields rpats' dd)) } + -- Field selectors have declared types; hence no zonking --------------------------- zonkPats env [] = return (env, [])