|
1 | 1 | {-# LANGUAGE RecordWildCards, OverloadedRecordDot, DuplicateRecordFields #-} |
2 | 2 | module Development.Debug.Adapter.Evaluation where |
3 | 3 |
|
| 4 | +import Control.Monad |
4 | 5 | import qualified Data.Text as T |
5 | 6 | import qualified Data.Map as M |
6 | 7 | import qualified Data.IntSet as IS |
@@ -36,32 +37,53 @@ startExecution = do |
36 | 37 | -- | Command for evaluation (includes evaluation-on-hover) |
37 | 38 | commandEvaluate :: DebugAdaptor () |
38 | 39 | commandEvaluate = do |
39 | | - EvaluateArguments {..} <- getArguments |
40 | | - DidEval er <- sendSync (DoEval (T.unpack evaluateArgumentsExpression)) |
41 | | - case er of |
42 | | - EvalStopped{} -> error "impossible, execution is resumed automatically for 'DoEval'" |
43 | | - EvalAbortedWith e -> do |
44 | | - -- Evaluation failed, we report it but don't terminate. |
45 | | - sendEvaluateResponse EvaluateResponse |
46 | | - { evaluateResponseResult = T.pack e |
47 | | - , evaluateResponseType = T.pack "" |
48 | | - , evaluateResponsePresentationHint = Nothing |
49 | | - , evaluateResponseVariablesReference = 0 |
50 | | - , evaluateResponseNamedVariables = Nothing |
51 | | - , evaluateResponseIndexedVariables = Nothing |
52 | | - , evaluateResponseMemoryReference = Nothing |
53 | | - } |
54 | | - _ -> do |
55 | | - sendEvaluateResponse EvaluateResponse |
56 | | - { evaluateResponseResult = T.pack $ resultVal er |
57 | | - , evaluateResponseType = T.pack $ resultType er |
58 | | - , evaluateResponsePresentationHint = Nothing |
59 | | - , evaluateResponseVariablesReference = 0 |
60 | | - , evaluateResponseNamedVariables = Nothing |
61 | | - , evaluateResponseIndexedVariables = Nothing |
62 | | - , evaluateResponseMemoryReference = Nothing |
| 40 | + EvaluateArguments {evaluateArgumentsFrameId=_todo, ..} <- getArguments |
| 41 | + -- TODO: Proper support for threads/stack frames/scopes id. |
| 42 | + -- Currently: ignore `evaluateArgumentsFrameId` and always use instead: |
| 43 | + |
| 44 | + let notAVarResp res ty = EvaluateResponse |
| 45 | + { evaluateResponseResult = res |
| 46 | + , evaluateResponseType = ty |
| 47 | + , evaluateResponsePresentationHint = Nothing |
| 48 | + , evaluateResponseVariablesReference = 0 |
| 49 | + , evaluateResponseNamedVariables = Nothing |
| 50 | + , evaluateResponseIndexedVariables = Nothing |
| 51 | + , evaluateResponseMemoryReference = Nothing |
63 | 52 | } |
64 | 53 |
|
| 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 | + |
| 86 | + |
65 | 87 | -------------------------------------------------------------------------------- |
66 | 88 | -- * Utils |
67 | 89 | -------------------------------------------------------------------------------- |
|
0 commit comments