\begin{code}
module HscMain (
- HscResult(..), hscMain, newHscEnv, hscCmmFile, hscBufferFrontEnd
+ HscResult(..),
+ hscMain, newHscEnv, hscCmmFile, hscBufferFrontEnd
#ifdef GHCI
, hscStmt, hscTcExpr, hscKcType
, hscGetInfo, GetInfoResult
import CoreLint ( lintUnfolding )
import DsMeta ( templateHaskellNames )
import BasicTypes ( Fixity )
+import SrcLoc ( SrcLoc, noSrcLoc )
#endif
import RdrName ( RdrName )
import HsSyn ( HsModule )
-import SrcLoc ( SrcLoc, noSrcLoc, Located(..) )
+import SrcLoc ( Located(..) )
import StringBuffer ( hGetStringBuffer )
import Parser
import Lexer ( P(..), ParseResult(..), mkPState )
import SrcLoc ( mkSrcLoc )
import TcRnDriver ( tcRnModule, tcRnExtCore )
+import TcRnTypes ( TcGblEnv )
import TcIface ( typecheckIface )
import IfaceEnv ( initNameCache )
import LoadIface ( ifaceStats, initExternalPackageState )
= HscFail
-- In IDE mode: we just do the static/dynamic checks
- | HscChecked (Located (HsModule RdrName))
+ | HscChecked
+ (Located (HsModule RdrName)) -- parse tree
+ (Maybe TcGblEnv) -- typechecker output, if succeeded
-- Concluded that it wasn't necessary
| HscNoRecomp ModDetails -- new details (HomeSymbolTable additions)
showPass (hsc_dflags hsc_env) "Parser"
case unP parseModule (mkPState buffer loc (hsc_dflags hsc_env)) of
PFailed span err -> do
- msg_act (emptyBag, unitBag (mkPlainErrMsg span err))
- return HscFail
- POk _ rdr_module -> do
- r <- hscFrontEnd hsc_env msg_act rdr_module
- case r of
- Left r -> return r
- Right _ -> return (HscChecked rdr_module)
-
+ msg_act (emptyBag, unitBag (mkPlainErrMsg span err))
+ return HscFail
+ POk _ rdr_module -> do
+ hscBufferTypecheck hsc_env rdr_module msg_act
+
+hscBufferTypecheck hsc_env rdr_module msg_act = do
+ (tc_msgs, maybe_tc_result) <- _scc_ "Typecheck-Rename"
+ tcRnModule hsc_env rdr_module
+ msg_act tc_msgs
+ case maybe_tc_result of
+ Nothing -> return (HscChecked rdr_module Nothing)
+ Just r -> return (HscChecked rdr_module (Just r))
+ -- space leak on rdr_module!
hscFrontEnd hsc_env msg_act rdr_module = do {