Function definition in GHCi
[ghc.git] / ghc / GhciMonad.hs
index 7dd005b..6d068be 100644 (file)
@@ -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