import RdrHsSyn ( RdrNameHsModule, RdrNameHsDecl, RdrNameStmt, RdrNameHsExpr,
emptyGroup, mkGroup, findSplice, addImpDecls, main_RDR_Unqual )
-import PrelNames ( iNTERACTIVE, ioTyConName, printName,
- returnIOName, bindIOName, failIOName, thenIOName, runIOName,
+import PrelNames ( iNTERACTIVE, ioTyConName, printName, monadNames,
+ returnIOName, runIOName,
dollarMainName, itName, mAIN_Name, unsafeCoerceName
)
import MkId ( unsafeCoerceId )
mkForAllTys, mkFunTys, mkTyConApp, tcSplitForAllTys
)
import TcMatches ( tcStmtsAndThen, TcStmtCtxt(..) )
-import Inst ( showLIE )
+import Inst ( showLIE, tcStdSyntaxName )
import TcBinds ( tcTopBinds )
import TcClassDcl ( tcClassDecls2 )
import TcDefaults ( tcDefaults )
setGblEnv tcg_env $ do {
-- The real work is done here
- ((bound_ids, tc_expr), lie) <- getLIE (tcUserStmt rn_stmt) ;
+ (bound_ids, tc_expr) <- tcUserStmt rn_stmt ;
traceTc (text "tcs 1") ;
let { -- Make all the bound ids "global" ids, now that
(ExplicitList placeHolderType (map mk_item names)) ;
mk_item name = HsApp (HsVar unsafeCoerceName) (HsVar name) ;
- all_stmts = stmts ++ [ret_stmt]
+ all_stmts = stmts ++ [ret_stmt] ;
+
+ io_ty = mkTyConApp ioTyCon []
} ;
-- OK, we're ready to typecheck the stmts
traceTc (text "tcs 2") ;
- ((ids, tc_stmts), lie) <-
- getLIE $
- tcStmtsAndThen combine stmt_ctxt stmts $
- do {
- -- Look up the names right in the middle,
- -- where they will all be in scope
- ids <- mappM tcLookupId names ;
- return (ids, [])
- } ;
+ ((ids, tc_expr), lie) <- getLIE $ do {
+ (ids, tc_stmts) <- tcStmtsAndThen combine stmt_ctxt all_stmts $
+ do {
+ -- Look up the names right in the middle,
+ -- where they will all be in scope
+ ids <- mappM tcLookupId names ;
+ return (ids, []) } ;
+ io_ids <- mappM (tcStdSyntaxName DoOrigin io_ty) monadNames ;
+ return (ids, HsDo DoExpr tc_stmts io_ids
+ (mkTyConApp ioTyCon [ret_ty]) noSrcLoc)
+ } ;
-- Simplify the context right here, so that we fail
-- if there aren't enough instances. Notably, when we see
const_binds <- tcSimplifyTop lie ;
-- Build result expression and zonk it
- io_ids <- mappM mk_rebound
- [returnIOName, failIOName, bindIOName, thenIOName] ;
- let { expr = mkHsLet const_binds $
- HsDo DoExpr tc_stmts io_ids
- (mkTyConApp ioTyCon [ret_ty]) noSrcLoc } ;
+ let { expr = mkHsLet const_binds tc_expr } ;
zonked_expr <- zonkTopExpr expr ;
zonked_ids <- zonkTopBndrs ids ;
}
where
combine stmt (ids, stmts) = (ids, stmt:stmts)
- mk_rebound n = do { id <- tcLookupId n; return (n, HsVar id) }
- -- A bit hackoid
\end{code}