+ (pcs1, print_unqual, maybe_renamed_stmt)
+ <- renameStmt dflags hit hst pcs0 scope_mod
+ iNTERACTIVE rn_env parsed_stmt
+
+ ; case maybe_renamed_stmt of
+ Nothing -> return (pcs0, Nothing)
+ Just (bound_names, rn_stmt) -> do {
+
+ -- Typecheck it
+ maybe_tc_return <-
+ if just_expr
+ then case rn_stmt of { (ExprStmt e _ _, decls) ->
+ typecheckExpr dflags pcs1 hst type_env
+ print_unqual iNTERACTIVE (e,decls) }
+ else typecheckStmt dflags pcs1 hst type_env
+ print_unqual iNTERACTIVE bound_names rn_stmt
+
+ ; case maybe_tc_return of
+ Nothing -> return (pcs0, Nothing)
+ Just (pcs2, tc_expr, bound_ids, ty) -> do {
+
+ -- Desugar it
+ ds_expr <- deSugarExpr dflags pcs2 hst iNTERACTIVE print_unqual tc_expr
+
+ -- Simplify it
+ ; simpl_expr <- simplifyExpr dflags pcs2 hst ds_expr
+
+ -- Tidy it (temporary, until coreSat does cloning)
+ ; tidy_expr <- tidyCoreExpr simpl_expr
+
+ -- Prepare for codegen
+ ; prepd_expr <- corePrepExpr dflags tidy_expr
+
+ -- Convert to BCOs
+ ; bcos <- coreExprToBCOs dflags prepd_expr
+
+ ; let
+ -- Make all the bound ids "global" ids, now that
+ -- they're notionally top-level bindings. This is
+ -- important: otherwise when we come to compile an expression
+ -- using these ids later, the byte code generator will consider
+ -- the occurrences to be free rather than global.
+ global_bound_ids = map globaliseId bound_ids;
+ globaliseId id = setGlobalIdDetails id VanillaGlobal
+
+ ; return (pcs2, Just (global_bound_ids, ty, bcos))
+
+ }}}}}
+
+hscThing -- like hscStmt, but deals with a single identifier
+ :: DynFlags
+ -> HomeSymbolTable
+ -> HomeIfaceTable
+ -> PersistentCompilerState -- IN: persistent compiler state
+ -> InteractiveContext -- Context for compiling
+ -> String -- The identifier
+ -> IO ( PersistentCompilerState,
+ Maybe TyThing )
+hscThing dflags hst hit pcs0 icontext id
+ = let
+ InteractiveContext {
+ ic_rn_env = rn_env,
+ ic_type_env = type_env,
+ ic_module = scope_mod } = icontext
+ fname = mkFastString id
+ rn = mkUnqual dataName fname -- need to guess correct namespace
+ stmt = ResultStmt (HsVar rn) noSrcLoc
+ in
+ do { (pcs, err, maybe_stmt) <- renameStmt dflags hit hst pcs0 scope_mod scope_mod rn_env stmt
+ ; case maybe_stmt of
+ Nothing -> return (pcs, Nothing)
+ Just (n:ns, _) -> return (pcs, lookupType hst type_env n)
+ }
+
+hscParseStmt :: DynFlags -> String -> IO (Maybe RdrNameStmt)
+hscParseStmt dflags str
+ = do -------------------------- Parser ----------------
+ showPass dflags "Parser"
+ _scc_ "Parser" do