11{-# LANGUAGE RecordWildCards, OverloadedRecordDot, DuplicateRecordFields #-}
22module Development.Debug.Adapter.Evaluation where
33
4- import Control.Monad
54import qualified Data.Text as T
65import qualified Data.Map as M
76import qualified Data.IntSet as IS
@@ -38,10 +37,8 @@ startExecution = do
3837commandEvaluate :: DebugAdaptor ()
3938commandEvaluate = do
4039 EvaluateArguments {evaluateArgumentsFrameId= _todo, .. } <- getArguments
41- -- TODO: Proper support for threads/stack frames/scopes id.
42- -- Currently: ignore `evaluateArgumentsFrameId` and always use instead:
4340
44- let notAVarResp res ty = EvaluateResponse
41+ let simpleEvalResp res ty = EvaluateResponse
4542 { evaluateResponseResult = res
4643 , evaluateResponseType = ty
4744 , evaluateResponsePresentationHint = Nothing
@@ -51,38 +48,24 @@ commandEvaluate = do
5148 , evaluateResponseMemoryReference = Nothing
5249 }
5350
54- -- Only evaluate expression if it is not a variable found in the given `evaluateArgumentsFrameId`
55- let doEvaluate = do
56- DidEval er <- sendSync (DoEval (T. unpack evaluateArgumentsExpression))
57- case er of
58- EvalStopped {} -> error " impossible, execution is resumed automatically for 'DoEval'"
59- EvalAbortedWith e -> do
60- -- Evaluation failed, we report it but don't terminate.
61- sendEvaluateResponse (notAVarResp (T. pack e) (T. pack " " ))
62- _ -> do
63- sendEvaluateResponse (notAVarResp (T. pack $ resultVal er) (T. pack $ resultType er))
64-
65- -- Shortcut. Single word expression may be variable in scope (#116)
66- case T. words evaluateArgumentsExpression of
67- [possiblyVar] -> do
68- GotScopes scopes <- sendSync (GetScopes {- todo: use evaluateArgumentsFrameId-} )
69- foundVars <- forM (filter (not . expensive) scopes) $ \ scope -> do
70- GotVariables vars <- sendSync (GetVariables (scopeToVarRef scope. kind))
71- return (either (: [] ) id vars)
72- case filter ((== possiblyVar) . T. pack . (. varName)) (concat foundVars) of
73- foundOne: _ -> -- found it!
74- sendEvaluateResponse EvaluateResponse
75- { evaluateResponseResult = T. pack foundOne. varValue
76- , evaluateResponseType = T. pack foundOne. varType
77- , evaluateResponsePresentationHint = Nothing
78- , evaluateResponseVariablesReference = fromEnum foundOne. varRef
79- , evaluateResponseNamedVariables = Nothing
80- , evaluateResponseIndexedVariables = Nothing
81- , evaluateResponseMemoryReference = Nothing
82- }
83- [] -> doEvaluate
84- _ -> doEvaluate
85-
51+ DidEval er <- sendSync (DoEval (T. unpack evaluateArgumentsExpression))
52+ case er of
53+ EvalStopped {} -> error " impossible, execution is resumed automatically for 'DoEval'"
54+ EvalAbortedWith e ->
55+ -- Evaluation failed, we report it but don't terminate.
56+ sendEvaluateResponse (simpleEvalResp (T. pack e) (T. pack " " ))
57+ EvalException {resultVal, resultType} ->
58+ sendEvaluateResponse (simpleEvalResp (T. pack resultVal) (T. pack resultType))
59+ EvalCompleted {resultVal, resultType, resultStructureRef} -> do
60+ sendEvaluateResponse EvaluateResponse
61+ { evaluateResponseResult = T. pack resultVal
62+ , evaluateResponseType = T. pack resultType
63+ , evaluateResponsePresentationHint = Nothing
64+ , evaluateResponseVariablesReference = fromEnum resultStructureRef
65+ , evaluateResponseNamedVariables = Nothing
66+ , evaluateResponseIndexedVariables = Nothing
67+ , evaluateResponseMemoryReference = Nothing
68+ }
8669
8770--------------------------------------------------------------------------------
8871-- * Utils
0 commit comments