1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
|
/***************************************************************************************************
Copyright (C) 2024 The Qt Company Ltd.
SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only WITH Qt-GPL-exception-1.0
***************************************************************************************************/
using System.Threading.Tasks;
using Microsoft.VisualStudio;
using Microsoft.VisualStudio.Debugger.Interop;
namespace QtVsTools.Qml.Debug.AD7
{
using V4;
sealed partial class Expression :
IDebugExpression2 // "This interface represents a parsed expression ready for binding
// and evaluating."
{
private string ExpressionString { get; set; }
private StackFrame StackFrame { get; set; }
public QmlEngine Engine { get; private set; }
public Program Program { get; private set; }
private QmlDebugger Debugger { get; set; }
private CodeContext CodeContext { get; set; }
public static Expression Create(StackFrame frame, string expr)
{
return new Expression
{
ExpressionString = expr,
StackFrame = frame,
Engine = frame.Engine,
Program = frame.Program,
Debugger = frame.Debugger,
CodeContext = frame.Context
};
}
private Expression()
{ }
int IDebugExpression2.EvaluateSync(
enum_EVALFLAGS dwFlags,
uint dwTimeout,
IDebugEventCallback2 pExprCallback,
out IDebugProperty2 ppResult)
{
ppResult = null;
var value = Debugger.Evaluate(StackFrame.FrameNumber, ExpressionString);
if (value is null or JsError)
return VSConstants.S_FALSE;
Program.Refresh();
value.Name = ExpressionString;
ppResult = Property.Create(StackFrame, 0, value);
return VSConstants.S_OK;
}
int IDebugExpression2.EvaluateAsync(
enum_EVALFLAGS dwFlags,
IDebugEventCallback2 pExprCallback)
{
_ = Task.Run(() =>
{
var value = Debugger.Evaluate(StackFrame.FrameNumber, ExpressionString);
if (value != null)
value.Name = ExpressionString;
Program.Refresh();
DebugEvent.Send(new ExpressionEvaluationCompleteEvent(
pExprCallback, this, Property.Create(StackFrame, 0, value)));
});
return VSConstants.S_OK;
}
}
}
|