\begin{code}
module CompManager ( cmInit, cmLoadModule,
#ifdef GHCI
- cmGetExpr, cmRunExpr,
+ cmGetExpr, cmTypeExpr, cmRunExpr,
#endif
CmState, emptyCmState -- abstract
)
import GetImports
import HscTypes ( HomeSymbolTable, HomeIfaceTable,
PersistentCompilerState, ModDetails(..) )
+import Type ( Type )
import Name ( lookupNameEnv )
import Module
import PrelNames ( mainName )
#ifdef GHCI
import CmdLineOpts ( DynFlags(..) )
import Interpreter ( HValue )
-import HscMain ( hscExpr )
+import HscMain ( hscExpr, hscTypeExpr )
import RdrName
import PrelGHC ( unsafeCoerce# )
#endif
CmState{ pcs=pcs, pcms=pcms, pls=pls } = cmstate
PersistentCMState{ hst=hst, hit=hit } = pcms
+cmTypeExpr :: CmState
+ -> DynFlags
+ -> ModuleName
+ -> String
+ -> IO (CmState, Maybe Type)
+cmTypeExpr cmstate dflags modname expr
+ = do (new_pcs, expr_type) <-
+ hscTypeExpr dflags hst hit pcs (mkHomeModule modname) expr
+ return (cmstate{ pcs=new_pcs }, expr_type)
+ where
+ CmState{ pcs=pcs, pcms=pcms, pls=pls } = cmstate
+ PersistentCMState{ hst=hst, hit=hit } = pcms
+
-- The HValue should represent a value of type IO () (Perhaps IO a?)
cmRunExpr :: HValue -> IO ()
cmRunExpr hval
-----------------------------------------------------------------------------
--- $Id: InteractiveUI.hs,v 1.8 2000/11/21 14:32:44 simonmar Exp $
+-- $Id: InteractiveUI.hs,v 1.9 2000/11/21 15:00:58 simonmar Exp $
--
-- GHC Interactive User Interface
--
doCommand (':' : command) = specialCommand command
doCommand expr
= do st <- getGHCiState
- dflags <- io (readIORef v_DynFlags)
+ dflags <- io (getDynFlags)
(new_cmstate, maybe_hvalue) <-
io (cmGetExpr (cmstate st) dflags (current_module st) expr)
setGHCiState st{cmstate = new_cmstate}
)
typeOfExpr :: String -> GHCi ()
-typeOfExpr = panic "typeOfExpr"
+typeOfExpr str
+ = do st <- getGHCiState
+ dflags <- io (getDynFlags)
+ (st, maybe_ty) <- io (cmTypeExpr (cmstate st) dflags
+ (current_module st) str)
+ case maybe_ty of
+ Nothing -> return ()
+ Just ty -> io (putStrLn (showSDoc (ppr ty)))
quit :: String -> GHCi ()
quit _ = return ()
\section[GHC_Main]{Main driver for Glasgow Haskell compiler}
\begin{code}
-module HscMain ( HscResult(..), hscMain, hscExpr,
+module HscMain ( HscResult(..), hscMain, hscExpr, hscTypeExpr,
initPersistentCompilerState ) where
#include "HsVersions.h"
import MkIface ( completeIface, mkModDetailsFromIface, mkModDetails,
writeIface, pprIface )
import TcModule
+import Type
+import TcHsSyn
import InstEnv ( emptyInstEnv )
import Desugar
import SimplCore
#else
hscExpr dflags hst hit pcs0 this_module expr
- = do { -- Parse it
- maybe_parsed <- hscParseExpr dflags expr;
- case maybe_parsed of
- Nothing -> return (pcs0, Nothing)
- Just parsed_expr -> do {
+ = do {
+ -- parse, rename & typecheck the expression
+ (pcs1, maybe_tc_result)
+ <- hscExprFrontEnd dflags hst hit pcs0 this_module expr;
- -- Rename it
- (pcs1, maybe_renamed_expr) <-
- renameExpr dflags hit hst pcs0 this_module parsed_expr;
- case maybe_renamed_expr of
- Nothing -> return (pcs1, Nothing)
- Just (print_unqual, rn_expr) -> do {
-
- -- Typecheck it
- maybe_tc_return
- <- typecheckExpr dflags pcs1 hst print_unqual this_module rn_expr;
- case maybe_tc_return of
- Nothing -> return (pcs1, Nothing)
- Just (pcs2, tc_expr, ty) -> do {
+ case maybe_tc_result of {
+ Nothing -> return (pcs1, Nothing);
+ Just (print_unqual, tc_expr, ty) -> do {
+ -- if it isn't an IO-typed expression,
+ -- wrap "print" around it & recompile...
let { is_IO_type = case splitTyConApp_maybe ty of {
Just (tycon, _) -> getUnique tycon == ioTyConKey;
Nothing -> False }
};
if (not is_IO_type)
- then hscExpr dflags hst hit pcs2 this_module
+ then hscExpr dflags hst hit pcs1 this_module
("print (" ++ expr ++ ")")
else do
-- Desugar it
- ds_expr <- deSugarExpr dflags pcs2 hst this_module
+ ds_expr <- deSugarExpr dflags pcs1 hst this_module
print_unqual tc_expr;
-- Simplify it
- simpl_expr <- simplifyExpr dflags pcs2 hst ds_expr;
+ simpl_expr <- simplifyExpr dflags pcs1 hst ds_expr;
-- Convert to STG
stg_expr <- coreToStgExpr dflags simpl_expr;
-- Convert to InterpSyn
unlinked_iexpr <- stgExprToInterpSyn dflags stg_expr;
- return (pcs2, Just unlinked_iexpr);
- }}}}
+ return (pcs1, Just unlinked_iexpr);
+ }}}
+
+hscExprFrontEnd
+ :: DynFlags
+ -> HomeSymbolTable
+ -> HomeIfaceTable
+ -> PersistentCompilerState -- IN: persistent compiler state
+ -> Module -- Context for compiling
+ -> String -- The expression
+ -> IO ( PersistentCompilerState,
+ Maybe (PrintUnqualified,TypecheckedHsExpr,Type)
+ )
+hscExprFrontEnd dflags hst hit pcs0 this_module expr
+ = do { -- Parse it
+ maybe_parsed <- hscParseExpr dflags expr;
+ case maybe_parsed of
+ Nothing -> return (pcs0, Nothing)
+ Just parsed_expr -> do {
+
+ -- Rename it
+ (pcs1, maybe_renamed_expr) <-
+ renameExpr dflags hit hst pcs0 this_module parsed_expr;
+ case maybe_renamed_expr of
+ Nothing -> return (pcs1, Nothing)
+ Just (print_unqual, rn_expr) -> do {
+
+ -- Typecheck it
+ maybe_tc_return
+ <- typecheckExpr dflags pcs1 hst print_unqual this_module rn_expr;
+ case maybe_tc_return of
+ Nothing -> return (pcs1, Nothing)
+ Just (pcs2, tc_expr, ty) ->
+ return (pcs2, Just (print_unqual, tc_expr, ty))
+ }}}
+
+hscTypeExpr
+ :: DynFlags
+ -> HomeSymbolTable
+ -> HomeIfaceTable
+ -> PersistentCompilerState -- IN: persistent compiler state
+ -> Module -- Context for compiling
+ -> String -- The expression
+ -> IO (PersistentCompilerState, Maybe Type)
+hscTypeExpr dflags hst hit pcs0 this_module expr
+ = do (pcs1, maybe_tc_result)
+ <- hscExprFrontEnd dflags hst hit pcs0 this_module expr
+ case maybe_tc_result of
+ Nothing -> return (pcs1, Nothing)
+ Just (_,_,ty) -> return (pcs1, Just ty)
hscParseExpr :: DynFlags -> String -> IO (Maybe RdrNameHsExpr)
hscParseExpr dflags str