From ca47896204482bf4a6979e3838bf7f09f61cebeb Mon Sep 17 00:00:00 2001
From: giy <giy@omp-system.ru>
Date: Fri, 02 Sep 2022 14:16:56 +0300
Subject: [PATCH] Обновление до версии 2.9.0
---
QtVsTools.Package/QML/Debugging/QmlDebugLauncher.cs | 63 ++++++++++++++++++-------------
1 files changed, 36 insertions(+), 27 deletions(-)
diff --git a/QtVsTools.Package/QML/Debugging/QmlDebugLauncher.cs b/QtVsTools.Package/QML/Debugging/QmlDebugLauncher.cs
index 025ee42..02fd242 100644
--- a/QtVsTools.Package/QML/Debugging/QmlDebugLauncher.cs
+++ b/QtVsTools.Package/QML/Debugging/QmlDebugLauncher.cs
@@ -35,39 +35,50 @@
using Microsoft.VisualStudio.Shell;
using Microsoft.VisualStudio.Shell.Interop;
using Microsoft.VisualStudio.VCProjectEngine;
-using QtVsTools.Core;
-using QtVsTools.Core.QtMsBuild;
-using QtVsTools.SyntaxAnalysis;
-using static QtVsTools.SyntaxAnalysis.RegExpr;
namespace QtVsTools.Qml.Debug
{
using AD7;
+ using Common;
+ using Core;
+ using Core.QtMsBuild;
+ using SyntaxAnalysis;
using VisualStudio;
+
+ using static SyntaxAnalysis.RegExpr;
class Launcher : Disposable, IDebugEventCallback2
{
- public static Launcher Instance { get; private set; }
+ LazyFactory Lazy { get; } = new LazyFactory();
+
+ private static Launcher Instance { get; set; }
IVsDebugger debugger;
IVsDebugger4 debugger4;
- HashSet<Guid> _ExcludedProcesses;
- HashSet<Guid> ExcludedProcesses => _ExcludedProcesses
- ?? (_ExcludedProcesses = new HashSet<Guid>());
+ HashSet<Guid> ExcludedProcesses => Lazy.Get(() =>
+ ExcludedProcesses, () => new HashSet<Guid>());
public static void Initialize()
{
+ ThreadHelper.ThrowIfNotOnUIThread();
+
Instance = new Launcher();
Instance.debugger = VsServiceProvider.GetService<IVsDebugger>();
Instance.debugger4 = VsServiceProvider.GetService<IVsDebugger, IVsDebugger4>();
+
if (Instance.debugger != null && Instance.debugger4 != null)
Instance.debugger.AdviseDebugEventCallback(Instance);
}
protected override void DisposeManaged()
{
- if (debugger != null)
- debugger.UnadviseDebugEventCallback(this);
+ if (debugger != null) {
+ ThreadHelper.JoinableTaskFactory.Run(async () =>
+ {
+ await ThreadHelper.JoinableTaskFactory.SwitchToMainThreadAsync();
+ debugger.UnadviseDebugEventCallback(this);
+ });
+ }
}
int IDebugEventCallback2.Event(
@@ -79,6 +90,8 @@
ref Guid riidEvent,
uint dwAttrib)
{
+ ThreadHelper.ThrowIfNotOnUIThread();
+
if (!QtVsToolsPackage.Instance.Options.QmlDebuggerEnabled)
return VSConstants.S_OK;
@@ -90,8 +103,7 @@
if (pProcess == null && pProgram.GetProcess(out pProcess) != VSConstants.S_OK)
return VSConstants.S_OK;
- Guid procGuid;
- if (pProcess.GetProcessId(out procGuid) != VSConstants.S_OK)
+ if (pProcess.GetProcessId(out Guid procGuid) != VSConstants.S_OK)
return VSConstants.S_OK;
// Run only once per process
@@ -119,14 +131,10 @@
else
return VSConstants.S_OK;
- string execPath;
- uint procId;
- if (!GetProcessInfo(pProcess, native, out execPath, out procId))
+ if (!GetProcessInfo(pProcess, native, out string execPath, out uint procId))
return VSConstants.S_OK;
- string execCmd;
- IEnumerable<string> rccItems;
- if (!GetProjectInfo(execPath, native, out execCmd, out rccItems))
+ if (!GetProjectInfo(execPath, native, out string execCmd, out IEnumerable<string> rccItems))
return VSConstants.S_OK;
LaunchDebug(execPath, execCmd, procId, rccItems);
@@ -135,9 +143,7 @@
Guid GetEngineId(IDebugProgram2 pProgram)
{
- string engineName;
- Guid engineGuid;
- if (pProgram.GetEngineInfo(out engineName, out engineGuid) != VSConstants.S_OK)
+ if (pProgram.GetEngineInfo(out _, out Guid engineGuid) != VSConstants.S_OK)
return Guid.Empty;
return engineGuid;
}
@@ -152,7 +158,7 @@
}
}
- static RegExpr wslPathRegex = new Token("WSLPATH", SkipWs_Disable, StartOfFile
+ static readonly RegExpr wslPathRegex = new Token("WSLPATH", SkipWs_Disable, StartOfFile
& "/mnt/" & new Token("DRIVE", CharWord) & "/" & new Token("PATH", AnyChar.Repeat()))
{
new Rule<WslPath>
@@ -161,15 +167,14 @@
Update("PATH", (WslPath wslPath, string path) => wslPath.Path = path),
}
};
- static RegExpr.Parser wslPathParser = wslPathRegex.Render();
+ static readonly RegExpr.Parser wslPathParser = wslPathRegex.Render();
bool GetProcessInfo(IDebugProcess2 pProcess, bool native, out string execPath, out uint procId)
{
execPath = "";
procId = 0;
- string fileName;
- if (pProcess.GetName(enum_GETNAME_TYPE.GN_FILENAME, out fileName) != VSConstants.S_OK)
+ if (pProcess.GetName(enum_GETNAME_TYPE.GN_FILENAME, out string fileName) != VSConstants.S_OK)
return false;
var pProcessId = new AD_PROCESS_ID[1];
@@ -193,6 +198,8 @@
bool GetProjectInfo(string execPath, bool native, out string execCmd, out IEnumerable<string> rccItems)
{
+ ThreadHelper.ThrowIfNotOnUIThread();
+
execCmd = "";
rccItems = null;
@@ -290,6 +297,8 @@
uint procId,
IEnumerable<string> rccItems)
{
+ ThreadHelper.ThrowIfNotOnUIThread();
+
var targets = new[] { new VsDebugTargetInfo4
{
dlo = (uint)DEBUG_LAUNCH_OPERATION.DLO_CreateProcess,
@@ -305,8 +314,8 @@
try {
debugger4.LaunchDebugTargets4((uint)targets.Length, targets, processInfo);
- } catch (System.Exception e) {
- OutputWriteLine(e.Message + "\r\n\r\nStacktrace:\r\n" + e.StackTrace);
+ } catch (Exception exception) {
+ exception.Log();
}
}
}
--
Gitblit v1.9.1