summaryrefslogtreecommitdiff
path: root/ghc/GhciMonad.hs
diff options
context:
space:
mode:
authorRoman Shatsov <roshats@gmail.com>2015-11-21 15:58:34 +0100
committerBen Gamari <ben@smart-cactus.org>2015-11-21 11:15:09 -0500
commitb98ff3ccb14e36145404f075349c8689762a2913 (patch)
tree06eb4336d7637d5ecaa0bc68ae047eb524a3b03d /ghc/GhciMonad.hs
parent2325bd4e0fad0e5872556c5a78d1a6a1873e7201 (diff)
downloadhaskell-b98ff3ccb14e36145404f075349c8689762a2913.tar.gz
Function definition in GHCi
This patch allows define and re-define functions in ghci. `let` is not required anymore (but can be used). Idea: If ghci input string can be parsed as statement then run it as statement else run it as declaration. Reviewers: mpickering, bgamari, austin Reviewed By: mpickering, bgamari, austin Subscribers: hvr, mpickering, dterei, thomie Differential Revision: https://phabricator.haskell.org/D1299 GHC Trac Issues: #7253
Diffstat (limited to 'ghc/GhciMonad.hs')
-rw-r--r--ghc/GhciMonad.hs19
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