diff options
Diffstat (limited to 'ghc/GhciMonad.hs')
-rw-r--r-- | ghc/GhciMonad.hs | 19 |
1 files changed, 18 insertions, 1 deletions
diff --git a/ghc/GhciMonad.hs b/ghc/GhciMonad.hs index 7dd005b99e..6d068be485 100644 --- a/ghc/GhciMonad.hs +++ b/ghc/GhciMonad.hs @@ -19,7 +19,7 @@ module GhciMonad ( TickArray, getDynFlags, - runStmt, runDecls, resume, timeIt, recordBreak, revertCAFs, + isStmt, runStmt, runDecls, resume, timeIt, recordBreak, revertCAFs, printForUser, printForUserPartWay, prettyLocations, initInterpBuffering, turnOffBuffering, flushInterpBuffers, @@ -50,6 +50,10 @@ import System.IO import Control.Monad import GHC.Exts +import qualified Lexer (ParseResult(..), unP, mkPState) +import qualified Parser (parseStmt) +import StringBuffer (stringToStringBuffer) + import System.Console.Haskeline (CompletionFunc, InputT) import qualified System.Console.Haskeline as Haskeline import Control.Monad.Trans.Class @@ -262,6 +266,19 @@ printForUserPartWay doc = do dflags <- getDynFlags liftIO $ Outputable.printForUserPartWay dflags stdout (pprUserLength dflags) unqual doc +isStmt :: String -> GHCi Bool +isStmt stmt = do + st <- getGHCiState + dflags <- GHC.getInteractiveDynFlags + + let buf = stringToStringBuffer stmt + loc = mkRealSrcLoc (fsLit "<interactive>") (line_number st) 1 + parser = Parser.parseStmt + + case Lexer.unP parser (Lexer.mkPState dflags buf loc) of + Lexer.POk _ _ -> return True + Lexer.PFailed _ _ -> return False + -- | Run a single Haskell expression runStmt :: String -> GHC.SingleStep -> GHCi (Maybe GHC.ExecResult) runStmt expr step = do |