/
githubmirror
/
roslyn
Обзор
Документация
Войти
/
githubmirror
/
roslyn
Код
Запросы
0
Пакеты
0
Релизы
0
Аналитика
Безопасность
main
src/LanguageServer/Microsoft.CodeAnalysis.LanguageServer/Testing/TestRunner.DebugTestHostLauncher.cs
68 строк
3 KB
Cyrus Najmabadi
Make sealed
26 мар 2025, 22:21
26 мар 2025, 22:21
d99b771
Код
Авторство
О чём код?
// Licensed to the .NET Foundation under one or more agreements. // The .NET Foundation licenses this file to you under the MIT license. // See the LICENSE file in the project root for more information. using Microsoft.CodeAnalysis.LanguageServer.Handler; using Microsoft.CodeAnalysis.LanguageServer.Handler.Testing; using Microsoft.VisualStudio.TestPlatform.ObjectModel; using Microsoft.VisualStudio.TestPlatform.ObjectModel.Client.Interfaces; using Roslyn.Utilities; namespace Microsoft.CodeAnalysis.LanguageServer.Testing; internal sealed partial class TestRunner { private sealed class DebugTestHostLauncher(BufferedProgress<RunTestsPartialResult> progress, IClientLanguageServerManager clientLanguageServerManager) : ITestHostLauncher2, ITestHostLauncher3 { public bool IsDebug => true; public bool AttachDebuggerToProcess(int pid) { return AttachDebugger(pid, CancellationToken.None); } public bool AttachDebuggerToProcess(int pid, CancellationToken cancellationToken) { return AttachDebugger(pid, cancellationToken); } public bool AttachDebuggerToProcess(AttachDebuggerInfo attachDebuggerInfo, CancellationToken cancellationToken) { return AttachDebugger(attachDebuggerInfo.ProcessId, cancellationToken); } public int LaunchTestHost(TestProcessStartInfo defaultTestHostStartInfo) { // This is not called anymore in modern client and vstest.console. throw new NotImplementedException(); } public int LaunchTestHost(TestProcessStartInfo defaultTestHostStartInfo, CancellationToken cancellationToken) { // This is not called anymore in modern client and vstest.console. throw new NotImplementedException(); } private bool AttachDebugger(int processId, CancellationToken cancellationToken) { progress.Report(new RunTestsPartialResult(LanguageServerResources.Debugging_tests, string.Format(LanguageServerResources.Attaching_debugger_to_process_0, processId), Progress: null)); // Send an explicit request to the client to tell it to attach to the debugger and wait for the response. // We want to wait for the attach to complete before we continue. var task = Task.Run(async () => await AttachDebuggerAsync(processId, cancellationToken), cancellationToken); return task.WaitAndGetResult_CanCallOnBackground(cancellationToken); } private async Task<bool> AttachDebuggerAsync(int processId, CancellationToken cancellationToken) { var request = new DebugAttachParams(processId); var result = await clientLanguageServerManager.SendRequestAsync<DebugAttachParams, DebugAttachResult>("workspace/attachDebugger", request, cancellationToken); if (!result.DidAttach) { progress.Report(new RunTestsPartialResult(LanguageServerResources.Debugging_tests, LanguageServerResources.Client_failed_to_attach_the_debugger, Progress: null)); } return result.DidAttach; } } }