{-# LANGUAGE GADTs #-}
{-# OPTIONS_GHC -fno-warn-orphans #-}

module Haskell.Debug.Adapter.State.DebugRun where

import Control.Monad.IO.Class
import qualified System.Log.Logger as L
import Control.Monad.State.Lazy
import Control.Monad.Except
import Control.Lens
import qualified Text.Read as R

import qualified Haskell.DAP as DAP
import Haskell.Debug.Adapter.Constant
import qualified Haskell.Debug.Adapter.Utility as U
import Haskell.Debug.Adapter.Type
import qualified Haskell.Debug.Adapter.GHCi as P
import Haskell.Debug.Adapter.State.DebugRun.Threads()
import Haskell.Debug.Adapter.State.DebugRun.StackTrace()
import Haskell.Debug.Adapter.State.DebugRun.Scopes()
import Haskell.Debug.Adapter.State.DebugRun.Variables()
import Haskell.Debug.Adapter.State.DebugRun.Continue()
import Haskell.Debug.Adapter.State.DebugRun.Next()
import Haskell.Debug.Adapter.State.DebugRun.StepIn()
import Haskell.Debug.Adapter.State.DebugRun.Terminate()
import Haskell.Debug.Adapter.State.DebugRun.InternalTerminate()
import qualified Haskell.Debug.Adapter.State.Utility as SU


instance AppStateIF DebugRunStateData where
  -- |
  --
  entryAction :: AppState DebugRunStateData -> AppContext ()
entryAction AppState DebugRunStateData
DebugRunState = do
    IO () -> AppContext ()
forall (m :: * -> *) a. MonadIO m => IO a -> m a
liftIO (IO () -> AppContext ()) -> IO () -> AppContext ()
forall a b. (a -> b) -> a -> b
$ String -> String -> IO ()
L.debugM String
_LOG_APP String
"DebugRunState entryAction called."
    AppContext ()
goEntry

  -- |
  --
  exitAction :: AppState DebugRunStateData -> AppContext ()
exitAction AppState DebugRunStateData
DebugRunState = do
    IO () -> AppContext ()
forall (m :: * -> *) a. MonadIO m => IO a -> m a
liftIO (IO () -> AppContext ()) -> IO () -> AppContext ()
forall a b. (a -> b) -> a -> b
$ String -> String -> IO ()
L.debugM String
_LOG_APP String
"DebugRunState exitAction called."
    () -> AppContext ()
forall (m :: * -> *) a. Monad m => a -> m a
return ()


  -- |
  --
  doActivity :: AppState DebugRunStateData
-> WrapRequest -> AppContext (Maybe StateTransit)
doActivity AppState DebugRunStateData
s (WrapRequest r :: Request a
r@InitializeRequest{})              = AppState DebugRunStateData
-> Request a -> AppContext (Maybe StateTransit)
forall s r.
StateActivityIF s r =>
AppState s -> Request r -> AppContext (Maybe StateTransit)
action AppState DebugRunStateData
s Request a
r
  doActivity AppState DebugRunStateData
s (WrapRequest r :: Request a
r@LaunchRequest{})                  = AppState DebugRunStateData
-> Request a -> AppContext (Maybe StateTransit)
forall s r.
StateActivityIF s r =>
AppState s -> Request r -> AppContext (Maybe StateTransit)
action AppState DebugRunStateData
s Request a
r
  doActivity AppState DebugRunStateData
s (WrapRequest r :: Request a
r@DisconnectRequest{})              = AppState DebugRunStateData
-> Request a -> AppContext (Maybe StateTransit)
forall s r.
StateActivityIF s r =>
AppState s -> Request r -> AppContext (Maybe StateTransit)
action AppState DebugRunStateData
s Request a
r
  doActivity AppState DebugRunStateData
s (WrapRequest r :: Request a
r@PauseRequest{})                   = AppState DebugRunStateData
-> Request a -> AppContext (Maybe StateTransit)
forall s r.
StateActivityIF s r =>
AppState s -> Request r -> AppContext (Maybe StateTransit)
action AppState DebugRunStateData
s Request a
r
  doActivity AppState DebugRunStateData
s (WrapRequest r :: Request a
r@TerminateRequest{})               = AppState DebugRunStateData
-> Request a -> AppContext (Maybe StateTransit)
forall s r.
StateActivityIF s r =>
AppState s -> Request r -> AppContext (Maybe StateTransit)
action AppState DebugRunStateData
s Request a
r
  doActivity AppState DebugRunStateData
s (WrapRequest r :: Request a
r@SetBreakpointsRequest{})          = AppState DebugRunStateData
-> Request a -> AppContext (Maybe StateTransit)
forall s r.
StateActivityIF s r =>
AppState s -> Request r -> AppContext (Maybe StateTransit)
action AppState DebugRunStateData
s Request a
r
  doActivity AppState DebugRunStateData
s (WrapRequest r :: Request a
r@SetFunctionBreakpointsRequest{})  = AppState DebugRunStateData
-> Request a -> AppContext (Maybe StateTransit)
forall s r.
StateActivityIF s r =>
AppState s -> Request r -> AppContext (Maybe StateTransit)
action AppState DebugRunStateData
s Request a
r
  doActivity AppState DebugRunStateData
s (WrapRequest r :: Request a
r@SetExceptionBreakpointsRequest{}) = AppState DebugRunStateData
-> Request a -> AppContext (Maybe StateTransit)
forall s r.
StateActivityIF s r =>
AppState s -> Request r -> AppContext (Maybe StateTransit)
action AppState DebugRunStateData
s Request a
r
  doActivity AppState DebugRunStateData
s (WrapRequest r :: Request a
r@ConfigurationDoneRequest{})       = AppState DebugRunStateData
-> Request a -> AppContext (Maybe StateTransit)
forall s r.
StateActivityIF s r =>
AppState s -> Request r -> AppContext (Maybe StateTransit)
action AppState DebugRunStateData
s Request a
r
  doActivity AppState DebugRunStateData
s (WrapRequest r :: Request a
r@ThreadsRequest{})                 = AppState DebugRunStateData
-> Request a -> AppContext (Maybe StateTransit)
forall s r.
StateActivityIF s r =>
AppState s -> Request r -> AppContext (Maybe StateTransit)
action AppState DebugRunStateData
s Request a
r
  doActivity AppState DebugRunStateData
s (WrapRequest r :: Request a
r@StackTraceRequest{})              = AppState DebugRunStateData
-> Request a -> AppContext (Maybe StateTransit)
forall s r.
StateActivityIF s r =>
AppState s -> Request r -> AppContext (Maybe StateTransit)
action AppState DebugRunStateData
s Request a
r
  doActivity AppState DebugRunStateData
s (WrapRequest r :: Request a
r@ScopesRequest{})                  = AppState DebugRunStateData
-> Request a -> AppContext (Maybe StateTransit)
forall s r.
StateActivityIF s r =>
AppState s -> Request r -> AppContext (Maybe StateTransit)
action AppState DebugRunStateData
s Request a
r
  doActivity AppState DebugRunStateData
s (WrapRequest r :: Request a
r@VariablesRequest{})               = AppState DebugRunStateData
-> Request a -> AppContext (Maybe StateTransit)
forall s r.
StateActivityIF s r =>
AppState s -> Request r -> AppContext (Maybe StateTransit)
action AppState DebugRunStateData
s Request a
r
  doActivity AppState DebugRunStateData
s (WrapRequest r :: Request a
r@ContinueRequest{})                = AppState DebugRunStateData
-> Request a -> AppContext (Maybe StateTransit)
forall s r.
StateActivityIF s r =>
AppState s -> Request r -> AppContext (Maybe StateTransit)
action AppState DebugRunStateData
s Request a
r
  doActivity AppState DebugRunStateData
s (WrapRequest r :: Request a
r@NextRequest{})                    = AppState DebugRunStateData
-> Request a -> AppContext (Maybe StateTransit)
forall s r.
StateActivityIF s r =>
AppState s -> Request r -> AppContext (Maybe StateTransit)
action AppState DebugRunStateData
s Request a
r
  doActivity AppState DebugRunStateData
s (WrapRequest r :: Request a
r@StepInRequest{})                  = AppState DebugRunStateData
-> Request a -> AppContext (Maybe StateTransit)
forall s r.
StateActivityIF s r =>
AppState s -> Request r -> AppContext (Maybe StateTransit)
action AppState DebugRunStateData
s Request a
r
  doActivity AppState DebugRunStateData
s (WrapRequest r :: Request a
r@EvaluateRequest{})                = AppState DebugRunStateData
-> Request a -> AppContext (Maybe StateTransit)
forall s r.
StateActivityIF s r =>
AppState s -> Request r -> AppContext (Maybe StateTransit)
action AppState DebugRunStateData
s Request a
r
  doActivity AppState DebugRunStateData
s (WrapRequest r :: Request a
r@CompletionsRequest{})             = AppState DebugRunStateData
-> Request a -> AppContext (Maybe StateTransit)
forall s r.
StateActivityIF s r =>
AppState s -> Request r -> AppContext (Maybe StateTransit)
action AppState DebugRunStateData
s Request a
r
  doActivity AppState DebugRunStateData
s (WrapRequest r :: Request a
r@InternalTransitRequest{})         = AppState DebugRunStateData
-> Request a -> AppContext (Maybe StateTransit)
forall s r.
StateActivityIF s r =>
AppState s -> Request r -> AppContext (Maybe StateTransit)
action AppState DebugRunStateData
s Request a
r
  doActivity AppState DebugRunStateData
s (WrapRequest r :: Request a
r@InternalTerminateRequest{})       = AppState DebugRunStateData
-> Request a -> AppContext (Maybe StateTransit)
forall s r.
StateActivityIF s r =>
AppState s -> Request r -> AppContext (Maybe StateTransit)
action AppState DebugRunStateData
s Request a
r
  doActivity AppState DebugRunStateData
s (WrapRequest r :: Request a
r@InternalLoadRequest{})            = AppState DebugRunStateData
-> Request a -> AppContext (Maybe StateTransit)
forall s r.
StateActivityIF s r =>
AppState s -> Request r -> AppContext (Maybe StateTransit)
action AppState DebugRunStateData
s Request a
r

-- |
--   default nop.
--
instance StateActivityIF DebugRunStateData DAP.InitializeRequest

-- |
--   default nop.
--
instance StateActivityIF DebugRunStateData DAP.LaunchRequest

-- |
--   default nop.
--
instance StateActivityIF DebugRunStateData DAP.DisconnectRequest

-- |
--   default nop.
--
instance StateActivityIF DebugRunStateData DAP.PauseRequest

-- |
--
goEntry :: AppContext ()
goEntry :: AppContext ()
goEntry = Getting Bool AppStores Bool -> AppStores -> Bool
forall s (m :: * -> *) a. MonadReader s m => Getting a s a -> m a
view Getting Bool AppStores Bool
Lens' AppStores Bool
stopOnEntryAppStores (AppStores -> Bool)
-> StateT AppStores (ExceptT String IO) AppStores
-> StateT AppStores (ExceptT String IO) Bool
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> StateT AppStores (ExceptT String IO) AppStores
forall s (m :: * -> *). MonadState s m => m s
get StateT AppStores (ExceptT String IO) Bool
-> (Bool -> AppContext ()) -> AppContext ()
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= \case
  Bool
True  -> AppContext ()
stopOnEntry
  Bool
False -> AppContext ()
startDebug

-- |
--
stopOnEntry :: AppContext ()
stopOnEntry :: AppContext ()
stopOnEntry = do
  String
startupFile <- Getting String AppStores String -> AppStores -> String
forall s (m :: * -> *) a. MonadReader s m => Getting a s a -> m a
view Getting String AppStores String
Lens' AppStores String
startupAppStores (AppStores -> String)
-> StateT AppStores (ExceptT String IO) AppStores
-> StateT AppStores (ExceptT String IO) String
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> StateT AppStores (ExceptT String IO) AppStores
forall s (m :: * -> *). MonadState s m => m s
get
  String
startupFunc <- Getting String AppStores String -> AppStores -> String
forall s (m :: * -> *) a. MonadReader s m => Getting a s a -> m a
view Getting String AppStores String
Lens' AppStores String
startupFuncAppStores (AppStores -> String)
-> StateT AppStores (ExceptT String IO) AppStores
-> StateT AppStores (ExceptT String IO) String
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> StateT AppStores (ExceptT String IO) AppStores
forall s (m :: * -> *). MonadState s m => m s
get

  let funcName :: String
funcName = if String -> Bool
forall (t :: * -> *) a. Foldable t => t a -> Bool
null String
startupFunc then String
"main" else String
startupFunc
      funcBp :: (String, FunctionBreakpoint)
funcBp   = (String
startupFile, String -> Maybe String -> Maybe String -> FunctionBreakpoint
DAP.FunctionBreakpoint String
funcName Maybe String
forall a. Maybe a
Nothing Maybe String
forall a. Maybe a
Nothing)
      cmd :: String
cmd = String
":dap-set-function-breakpoint " String -> String -> String
forall a. [a] -> [a] -> [a]
++ (String, FunctionBreakpoint) -> String
forall a. Show a => a -> String
U.showDAP (String, FunctionBreakpoint)
funcBp

  String -> AppContext ()
P.command String
cmd
  [String]
res <- AppContext [String]
P.expectPmpt

  [String] -> AppContext ()
withAdhocAddDapHeader ([String] -> AppContext ()) -> [String] -> AppContext ()
forall a b. (a -> b) -> a -> b
$ (String -> Bool) -> [String] -> [String]
forall a. (a -> Bool) -> [a] -> [a]
filter (String -> String -> Bool
U.startswith String
_DAP_HEADER) [String]
res

  where
    -- |
    --
    withAdhocAddDapHeader :: [String] -> AppContext ()
    withAdhocAddDapHeader :: [String] -> AppContext ()
withAdhocAddDapHeader [] = do
      String -> String -> AppContext ()
U.warnEV String
_LOG_APP (String -> AppContext ()) -> String -> AppContext ()
forall a b. (a -> b) -> a -> b
$ String
"can not set func breakpoint. no dap header found."
      AppContext ()
startDebug
    withAdhocAddDapHeader (String
str:[]) = case String -> Either String (Either String Breakpoint)
forall a. Read a => String -> Either String a
R.readEither (Int -> String -> String
forall a. Int -> [a] -> [a]
drop (String -> Int
forall (t :: * -> *) a. Foldable t => t a -> Int
length String
_DAP_HEADER) String
str) of
      Left String
err -> do
        String -> String -> AppContext ()
U.warnEV String
_LOG_APP (String -> AppContext ()) -> String -> AppContext ()
forall a b. (a -> b) -> a -> b
$ String
"read response body failed. " String -> String -> String
forall a. [a] -> [a] -> [a]
++ String
err String -> String -> String
forall a. [a] -> [a] -> [a]
++ String
" : " String -> String -> String
forall a. [a] -> [a] -> [a]
++ String
str
        AppContext ()
startDebug
      Right (Left String
err) -> do
        String -> String -> AppContext ()
U.warnEV String
_LOG_APP (String -> AppContext ()) -> String -> AppContext ()
forall a b. (a -> b) -> a -> b
$ String
"set adhoc breakpoint failed. " String -> String -> String
forall a. [a] -> [a] -> [a]
++ String
err String -> String -> String
forall a. [a] -> [a] -> [a]
++ String
" : " String -> String -> String
forall a. [a] -> [a] -> [a]
++ String
str
        AppContext ()
startDebug
      Right (Right Breakpoint
bp) -> do
        AppContext ()
startDebug
        Breakpoint -> AppContext ()
adhocDelBreakpoint Breakpoint
bp
    withAdhocAddDapHeader [String]
_ = do
      String -> String -> AppContext ()
U.warnEV String
_LOG_APP (String -> AppContext ()) -> String -> AppContext ()
forall a b. (a -> b) -> a -> b
$ String
"can not set func breakpoint. ambiguous dap header found."
      AppContext ()
startDebug

    -- |
    --
    adhocDelBreakpoint :: DAP.Breakpoint -> AppContext ()
    adhocDelBreakpoint :: Breakpoint -> AppContext ()
adhocDelBreakpoint Breakpoint
bp = do
      let cmd :: String
cmd = String
":dap-delete-breakpoint " String -> String -> String
forall a. [a] -> [a] -> [a]
++ Breakpoint -> String
forall a. Show a => a -> String
U.showDAP Breakpoint
bp

      String -> AppContext ()
P.command String
cmd
      [String]
res <- AppContext [String]
P.expectPmpt

      [String] -> AppContext ()
withAdhocDelDapHeader ([String] -> AppContext ()) -> [String] -> AppContext ()
forall a b. (a -> b) -> a -> b
$ (String -> Bool) -> [String] -> [String]
forall a. (a -> Bool) -> [a] -> [a]
filter (String -> String -> Bool
U.startswith String
_DAP_HEADER) [String]
res

    -- |
    --
    withAdhocDelDapHeader :: [String] -> AppContext ()
    withAdhocDelDapHeader :: [String] -> AppContext ()
withAdhocDelDapHeader [] = String -> AppContext ()
forall e (m :: * -> *) a. MonadError e m => e -> m a
throwError (String -> AppContext ()) -> String -> AppContext ()
forall a b. (a -> b) -> a -> b
$ String
"can not del func breakpoint. no dap header found."
    withAdhocDelDapHeader (String
str:[]) = case String -> Either String (Either String ())
forall a. Read a => String -> Either String a
R.readEither (Int -> String -> String
forall a. Int -> [a] -> [a]
drop (String -> Int
forall (t :: * -> *) a. Foldable t => t a -> Int
length String
_DAP_HEADER) String
str) of
      Left String
err -> String -> AppContext ()
forall e (m :: * -> *) a. MonadError e m => e -> m a
throwError (String -> AppContext ()) -> String -> AppContext ()
forall a b. (a -> b) -> a -> b
$ String
"read response body failed. " String -> String -> String
forall a. [a] -> [a] -> [a]
++ String
err String -> String -> String
forall a. [a] -> [a] -> [a]
++ String
" : " String -> String -> String
forall a. [a] -> [a] -> [a]
++ String
str
      Right (Left String
err) -> String -> AppContext ()
forall e (m :: * -> *) a. MonadError e m => e -> m a
throwError (String -> AppContext ()) -> String -> AppContext ()
forall a b. (a -> b) -> a -> b
$ String
"del adhoc breakpoint failed. " String -> String -> String
forall a. [a] -> [a] -> [a]
++ String
err String -> String -> String
forall a. [a] -> [a] -> [a]
++ String
" : " String -> String -> String
forall a. [a] -> [a] -> [a]
++ String
str
      Right (Right ()
res) -> () -> AppContext ()
forall (m :: * -> *) a. Monad m => a -> m a
return ()
res
    withAdhocDelDapHeader [String]
_ = String -> AppContext ()
forall e (m :: * -> *) a. MonadError e m => e -> m a
throwError (String -> AppContext ()) -> String -> AppContext ()
forall a b. (a -> b) -> a -> b
$ String
"can not del func breakpoint. ambiguous dap header found."


-- |
--
startDebug :: AppContext ()
startDebug :: AppContext ()
startDebug = do
  String
expr <- StateT AppStores (ExceptT String IO) String
getTraceExpr
  let args :: ContinueRequestArguments
args = ContinueRequestArguments
DAP.defaultContinueRequestArguments {
             exprContinueRequestArguments :: Maybe String
DAP.exprContinueRequestArguments = String -> Maybe String
forall a. a -> Maybe a
Just String
expr
           }

  ContinueRequestArguments -> AppContext ()
forall a. Show a => a -> AppContext ()
startDebugDAP ContinueRequestArguments
args

  where
    getTraceExpr :: StateT AppStores (ExceptT String IO) String
getTraceExpr = Getting String AppStores String -> AppStores -> String
forall s (m :: * -> *) a. MonadReader s m => Getting a s a -> m a
view Getting String AppStores String
Lens' AppStores String
startupFuncAppStores (AppStores -> String)
-> StateT AppStores (ExceptT String IO) AppStores
-> StateT AppStores (ExceptT String IO) String
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> StateT AppStores (ExceptT String IO) AppStores
forall s (m :: * -> *). MonadState s m => m s
get StateT AppStores (ExceptT String IO) String
-> (String -> StateT AppStores (ExceptT String IO) String)
-> StateT AppStores (ExceptT String IO) String
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= \case
      [] -> String -> StateT AppStores (ExceptT String IO) String
forall (m :: * -> *) a. Monad m => a -> m a
return String
"main"
      String
func -> do
        String
funcArgs <- Getting String AppStores String -> AppStores -> String
forall s (m :: * -> *) a. MonadReader s m => Getting a s a -> m a
view Getting String AppStores String
Lens' AppStores String
startupArgsAppStores (AppStores -> String)
-> StateT AppStores (ExceptT String IO) AppStores
-> StateT AppStores (ExceptT String IO) String
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> StateT AppStores (ExceptT String IO) AppStores
forall s (m :: * -> *). MonadState s m => m s
get
        String -> StateT AppStores (ExceptT String IO) String
forall (m :: * -> *) a. Monad m => a -> m a
return (String -> StateT AppStores (ExceptT String IO) String)
-> String -> StateT AppStores (ExceptT String IO) String
forall a b. (a -> b) -> a -> b
$ String -> String
U.strip (String -> String) -> String -> String
forall a b. (a -> b) -> a -> b
$ String
func String -> String -> String
forall a. [a] -> [a] -> [a]
++ String
" " String -> String -> String
forall a. [a] -> [a] -> [a]
++ String
funcArgs

    startDebugDAP :: a -> AppContext ()
startDebugDAP a
args = do

      let dap :: String
dap = String
":dap-continue "
          cmd :: String
cmd = String
dap String -> String -> String
forall a. [a] -> [a] -> [a]
++ a -> String
forall a. Show a => a -> String
U.showDAP a
args
          dbg :: String
dbg = String
dap String -> String -> String
forall a. [a] -> [a] -> [a]
++ a -> String
forall a. Show a => a -> String
show a
args

      String -> AppContext ()
P.command String
cmd
      String -> String -> AppContext ()
U.debugEV String
_LOG_APP String
dbg
      AppContext [String]
P.expectPmpt AppContext [String]
-> ([String] -> StateT AppStores (ExceptT String IO) String)
-> StateT AppStores (ExceptT String IO) String
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= [String] -> StateT AppStores (ExceptT String IO) String
SU.takeDapResult StateT AppStores (ExceptT String IO) String
-> (String -> AppContext ()) -> AppContext ()
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= String -> AppContext ()
dapHdl

      () -> AppContext ()
forall (m :: * -> *) a. Monad m => a -> m a
return ()

    -- |
    --
    dapHdl :: String -> AppContext ()
    dapHdl :: String -> AppContext ()
dapHdl String
str = case String -> Either String (Either String StoppedEventBody)
forall a. Read a => String -> Either String a
R.readEither String
str of
      Left String
err -> String -> String -> AppContext ()
errHdl String
str String
err
      Right (Left String
err) -> String -> String -> AppContext ()
errHdl String
str String
err
      Right (Right StoppedEventBody
body) -> StoppedEventBody -> AppContext ()
U.handleStoppedEventBody StoppedEventBody
body

    -- |
    --
    errHdl :: String -> String -> AppContext()
    errHdl :: String -> String -> AppContext ()
errHdl String
str String
err = do
      let msg :: String
msg = String
"start debugging failed. " String -> String -> String
forall a. [a] -> [a] -> [a]
++ String
err String -> String -> String
forall a. [a] -> [a] -> [a]
++ String
" : " String -> String -> String
forall a. [a] -> [a] -> [a]
++ String
str
      IO () -> AppContext ()
forall (m :: * -> *) a. MonadIO m => IO a -> m a
liftIO (IO () -> AppContext ()) -> IO () -> AppContext ()
forall a b. (a -> b) -> a -> b
$ String -> String -> IO ()
L.errorM String
_LOG_APP String
msg
      String -> AppContext ()
U.sendErrorEventLF String
msg


-- |
--  Any errors should be sent back as False result Response
--
instance StateActivityIF DebugRunStateData DAP.SetBreakpointsRequest where
  action :: AppState DebugRunStateData
-> Request SetBreakpointsRequest -> AppContext (Maybe StateTransit)
action AppState DebugRunStateData
_ (SetBreakpointsRequest SetBreakpointsRequest
req) = do
    IO () -> AppContext ()
forall (m :: * -> *) a. MonadIO m => IO a -> m a
liftIO (IO () -> AppContext ()) -> IO () -> AppContext ()
forall a b. (a -> b) -> a -> b
$ String -> String -> IO ()
L.debugM String
_LOG_APP (String -> IO ()) -> String -> IO ()
forall a b. (a -> b) -> a -> b
$ String
"DebugRunState SetBreakpointsRequest called. " String -> String -> String
forall a. [a] -> [a] -> [a]
++ SetBreakpointsRequest -> String
forall a. Show a => a -> String
show SetBreakpointsRequest
req
    SetBreakpointsRequest -> AppContext (Maybe StateTransit)
SU.setBreakpointsRequest SetBreakpointsRequest
req

-- |
--  Any errors should be sent back as False result Response
--
instance StateActivityIF DebugRunStateData DAP.SetExceptionBreakpointsRequest where
  action :: AppState DebugRunStateData
-> Request SetExceptionBreakpointsRequest
-> AppContext (Maybe StateTransit)
action AppState DebugRunStateData
_ (SetExceptionBreakpointsRequest SetExceptionBreakpointsRequest
req) = do
    IO () -> AppContext ()
forall (m :: * -> *) a. MonadIO m => IO a -> m a
liftIO (IO () -> AppContext ()) -> IO () -> AppContext ()
forall a b. (a -> b) -> a -> b
$ String -> String -> IO ()
L.debugM String
_LOG_APP (String -> IO ()) -> String -> IO ()
forall a b. (a -> b) -> a -> b
$ String
"DebugRunState SetExceptionBreakpointsRequest called. " String -> String -> String
forall a. [a] -> [a] -> [a]
++ SetExceptionBreakpointsRequest -> String
forall a. Show a => a -> String
show SetExceptionBreakpointsRequest
req
    SetExceptionBreakpointsRequest -> AppContext (Maybe StateTransit)
SU.setExceptionBreakpointsRequest SetExceptionBreakpointsRequest
req

-- |
--  Any errors should be sent back as False result Response
--
instance StateActivityIF DebugRunStateData DAP.SetFunctionBreakpointsRequest where
  action :: AppState DebugRunStateData
-> Request SetFunctionBreakpointsRequest
-> AppContext (Maybe StateTransit)
action AppState DebugRunStateData
_ (SetFunctionBreakpointsRequest SetFunctionBreakpointsRequest
req) = do
    IO () -> AppContext ()
forall (m :: * -> *) a. MonadIO m => IO a -> m a
liftIO (IO () -> AppContext ()) -> IO () -> AppContext ()
forall a b. (a -> b) -> a -> b
$ String -> String -> IO ()
L.debugM String
_LOG_APP (String -> IO ()) -> String -> IO ()
forall a b. (a -> b) -> a -> b
$ String
"DebugRunState SetFunctionBreakpointsRequest called. " String -> String -> String
forall a. [a] -> [a] -> [a]
++ SetFunctionBreakpointsRequest -> String
forall a. Show a => a -> String
show SetFunctionBreakpointsRequest
req
    SetFunctionBreakpointsRequest -> AppContext (Maybe StateTransit)
SU.setFunctionBreakpointsRequest SetFunctionBreakpointsRequest
req

-- |
--   default nop.
--
instance StateActivityIF DebugRunStateData DAP.ConfigurationDoneRequest

-- |
--  Any errors should be sent back as False result Response
--
instance StateActivityIF DebugRunStateData DAP.EvaluateRequest where
  action :: AppState DebugRunStateData
-> Request EvaluateRequest -> AppContext (Maybe StateTransit)
action AppState DebugRunStateData
_ (EvaluateRequest EvaluateRequest
req) = do
    IO () -> AppContext ()
forall (m :: * -> *) a. MonadIO m => IO a -> m a
liftIO (IO () -> AppContext ()) -> IO () -> AppContext ()
forall a b. (a -> b) -> a -> b
$ String -> String -> IO ()
L.debugM String
_LOG_APP (String -> IO ()) -> String -> IO ()
forall a b. (a -> b) -> a -> b
$ String
"DebugRunState EvaluateRequest called. " String -> String -> String
forall a. [a] -> [a] -> [a]
++ EvaluateRequest -> String
forall a. Show a => a -> String
show EvaluateRequest
req
    EvaluateRequest -> AppContext (Maybe StateTransit)
SU.evaluateRequest EvaluateRequest
req

-- |
--  Any errors should be sent back as False result Response
--
instance StateActivityIF DebugRunStateData DAP.CompletionsRequest where
  action :: AppState DebugRunStateData
-> Request CompletionsRequest -> AppContext (Maybe StateTransit)
action AppState DebugRunStateData
_ (CompletionsRequest CompletionsRequest
req) = do
    IO () -> AppContext ()
forall (m :: * -> *) a. MonadIO m => IO a -> m a
liftIO (IO () -> AppContext ()) -> IO () -> AppContext ()
forall a b. (a -> b) -> a -> b
$ String -> String -> IO ()
L.debugM String
_LOG_APP (String -> IO ()) -> String -> IO ()
forall a b. (a -> b) -> a -> b
$ String
"DebugRunState CompletionsRequest called. " String -> String -> String
forall a. [a] -> [a] -> [a]
++ CompletionsRequest -> String
forall a. Show a => a -> String
show CompletionsRequest
req
    CompletionsRequest -> AppContext (Maybe StateTransit)
SU.completionsRequest CompletionsRequest
req

-- |
--   default nop.
--
instance StateActivityIF DebugRunStateData HdaInternalTransitRequest

-- |
--  Any errors should be sent back as False result Response
--
instance StateActivityIF DebugRunStateData HdaInternalLoadRequest where
  action :: AppState DebugRunStateData
-> Request HdaInternalLoadRequest
-> AppContext (Maybe StateTransit)
action AppState DebugRunStateData
_ (InternalLoadRequest HdaInternalLoadRequest
req) = do
    IO () -> AppContext ()
forall (m :: * -> *) a. MonadIO m => IO a -> m a
liftIO (IO () -> AppContext ()) -> IO () -> AppContext ()
forall a b. (a -> b) -> a -> b
$ String -> String -> IO ()
L.debugM String
_LOG_APP (String -> IO ()) -> String -> IO ()
forall a b. (a -> b) -> a -> b
$ String
"DebugRunState InternalLoadRequest called. " String -> String -> String
forall a. [a] -> [a] -> [a]
++ HdaInternalLoadRequest -> String
forall a. Show a => a -> String
show HdaInternalLoadRequest
req
    String -> AppContext ()
SU.loadHsFile (String -> AppContext ()) -> String -> AppContext ()
forall a b. (a -> b) -> a -> b
$ HdaInternalLoadRequest -> String
pathHdaInternalLoadRequest HdaInternalLoadRequest
req
    Maybe StateTransit -> AppContext (Maybe StateTransit)
forall (m :: * -> *) a. Monad m => a -> m a
return (Maybe StateTransit -> AppContext (Maybe StateTransit))
-> Maybe StateTransit -> AppContext (Maybe StateTransit)
forall a b. (a -> b) -> a -> b
$ StateTransit -> Maybe StateTransit
forall a. a -> Maybe a
Just StateTransit
DebugRun_Contaminated