diff --git a/docs/contributing/Building, Debugging, and Testing on Windows.md b/docs/contributing/Building, Debugging, and Testing on Windows.md
index 57e11f416e68f..657014134430f 100644
--- a/docs/contributing/Building, Debugging, and Testing on Windows.md
+++ b/docs/contributing/Building, Debugging, and Testing on Windows.md
@@ -15,9 +15,9 @@ The minimal required version of .NET Framework is 4.7.2.
## Developing with Visual Studio 2019
-1. [Visual Studio 2019 16.2](https://visualstudio.microsoft.com/downloads/)
+1. [Visual Studio 2019 16.4](https://visualstudio.microsoft.com/downloads/)
- Ensure C#, VB, MSBuild, .NET Core and Visual Studio Extensibility are included in the selected work loads
- - Ensure Visual Studio is on Version "16.2" or greater
+ - Ensure Visual Studio is on Version "16.4" or greater
- Ensure "Use Previews" is checked in Tools -> Options -> Projects and Solutions -> .NET Core
1. [.NET Core SDK 3.0 Preview 6](https://dotnet.microsoft.com/download/dotnet-core/3.0) [Windows x64 installer](https://dotnetcli.azureedge.net/dotnet/Sdk/3.0.100-preview6-012264/dotnet-sdk-3.0.100-preview6-012264-win-x64.exe )
1. [PowerShell 5.0 or newer](https://docs.microsoft.com/en-us/powershell/scripting/setup/installing-windows-powershell). If you are on Windows 10, you are fine; you'll only need to upgrade if you're on earlier versions of Windows. The download link is under the ["Upgrading existing Windows PowerShell"](https://docs.microsoft.com/en-us/powershell/scripting/install/installing-windows-powershell?view=powershell-6#upgrading-existing-windows-powershell) heading.
diff --git a/eng/Versions.props b/eng/Versions.props
index fddf5afdcd44b..de631009e4f17 100644
--- a/eng/Versions.props
+++ b/eng/Versions.props
@@ -78,6 +78,7 @@
2.1.1
3.13.8
15.8.27812-alpha
+ 16.4.29305.180
14.3.25407-alpha
1.0.0-beta1-63011-01
8.0.0.0-alpha
@@ -91,6 +92,7 @@
0.1.0
0.1.2-dev
2.0.48
+ 2.0.84
10.1.0
15.8.27812-alpha
15.8.27812-alpha
@@ -127,6 +129,7 @@
16.2.133-pre
2.3.6152103
14.1.10
+ 16.3.35-alpha
16.3.2
1.16.30
16.0.28226-pre
@@ -156,7 +159,7 @@
16.3.13
16.3.13
16.3.29212.169
- 15.3.23
+ 15.5.31
2.0.0-rc3-61304-01
4.3.0
2.0.61
@@ -164,7 +167,7 @@
4.4.0
4.10.1
1.0.1
- 12.0.1
+ 12.0.2
4.9.2
4.0.0-rc-2048
4.8.0
@@ -179,7 +182,7 @@
4.3.0
0.0.4
1.0.21
- 2.1.55
+ 2.1.74
4.5.0
1.5.0
0.1.0-alpha-63729-01
diff --git a/src/Setup/DevDivInsertionFiles/DevDivInsertionFiles.csproj b/src/Setup/DevDivInsertionFiles/DevDivInsertionFiles.csproj
index b16ea0fa66fdc..6d65f0470ce8b 100644
--- a/src/Setup/DevDivInsertionFiles/DevDivInsertionFiles.csproj
+++ b/src/Setup/DevDivInsertionFiles/DevDivInsertionFiles.csproj
@@ -108,6 +108,7 @@
<_Dependency Remove="Microsoft.Build"/>
<_Dependency Remove="Microsoft.Build.Framework"/>
<_Dependency Remove="Microsoft.MSXML"/>
+ <_Dependency Remove="Microsoft.ServiceHub.Framework" />
<_Dependency Remove="Newtonsoft.Json"/>
<_Dependency Remove="stdole"/>
<_Dependency Remove="StreamJsonRpc"/>
diff --git a/src/VisualStudio/Core/Def/Implementation/Workspace/WorkspaceFailureOutputPane.cs b/src/VisualStudio/Core/Def/Implementation/Workspace/WorkspaceFailureOutputPane.cs
deleted file mode 100644
index ffc4ff581476a..0000000000000
--- a/src/VisualStudio/Core/Def/Implementation/Workspace/WorkspaceFailureOutputPane.cs
+++ /dev/null
@@ -1,114 +0,0 @@
-// Copyright (c) Microsoft. All Rights Reserved. Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
-
-using System;
-using Microsoft.CodeAnalysis;
-using Microsoft.CodeAnalysis.Editor.Shared.Utilities;
-using Microsoft.VisualStudio.Shell.Interop;
-
-namespace Microsoft.VisualStudio.LanguageServices
-{
- using Workspace = Microsoft.CodeAnalysis.Workspace;
-
- internal class WorkspaceFailureOutputPane : ForegroundThreadAffinitizedObject
- {
- private static readonly Guid s_workspacePaneGuid = new Guid("53D7CABD-085E-46AF-ACCA-EF5A640641CA");
-
- private readonly IServiceProvider _serviceProvider;
- private readonly Workspace _workspace;
-
- public WorkspaceFailureOutputPane(IThreadingContext threadingContext, IServiceProvider serviceProvider, Workspace workspace)
- : base(threadingContext)
- {
- _serviceProvider = serviceProvider;
- _workspace = workspace;
- _workspace.WorkspaceFailed += OnWorkspaceFailed;
- }
-
- private void OnWorkspaceFailed(object sender, WorkspaceDiagnosticEventArgs e)
- {
- InvokeBelowInputPriorityAsync(() =>
- {
- this.OutputPaneOpt?.OutputString(e.Diagnostic.ToString() + Environment.NewLine);
- });
- }
-
- private IVsOutputWindowPane _doNotAccessDirectlyOutputPane;
-
- private IVsOutputWindowPane OutputPaneOpt
- {
- get
- {
- AssertIsForeground();
-
- if (_doNotAccessDirectlyOutputPane == null)
- {
- var outputWindow = (IVsOutputWindow)_serviceProvider.GetService(typeof(SVsOutputWindow));
-
- // This may run during the shutdown of Visual Studio and so we must be ready for the service
- // not being available.
- if (outputWindow == null)
- {
- return null;
- }
-
- // Output Window panes have two states; initialized and active. The former is used to indicate that the pane
- // can be made active ("selected") by the user, the latter indicates that the pane is currently active.
- // There's no way to only initialize a pane without also making it active so we remember the last active pane
- // and reactivate it after we've created ourselves to avoid stealing focus away from it.
- var lastActivePane = GetActivePane(outputWindow);
-
- _doNotAccessDirectlyOutputPane = CreateOutputPane(outputWindow);
-
- if (lastActivePane != Guid.Empty)
- {
- ActivatePane(outputWindow, lastActivePane);
- }
- }
-
- return _doNotAccessDirectlyOutputPane;
- }
- }
-
- private IVsOutputWindowPane CreateOutputPane(IVsOutputWindow outputWindow)
- {
- AssertIsForeground();
-
- // Try to get the workspace pane if it has already been registered
- var workspacePaneGuid = s_workspacePaneGuid;
-
- // If the pane has already been created, CreatePane returns it
- if (ErrorHandler.Succeeded(outputWindow.CreatePane(ref workspacePaneGuid, ServicesVSResources.IntelliSense, fInitVisible: 1, fClearWithSolution: 1)) &&
- ErrorHandler.Succeeded(outputWindow.GetPane(ref workspacePaneGuid, out var pane)))
- {
- return pane;
- }
-
- return null;
- }
-
- private Guid GetActivePane(IVsOutputWindow outputWindow)
- {
- AssertIsForeground();
-
- if (outputWindow is IVsOutputWindow2 outputWindow2)
- {
- if (ErrorHandler.Succeeded(outputWindow2.GetActivePaneGUID(out var activePaneGuid)))
- {
- return activePaneGuid;
- }
- }
-
- return Guid.Empty;
- }
-
- private void ActivatePane(IVsOutputWindow outputWindow, Guid paneGuid)
- {
- AssertIsForeground();
-
- if (ErrorHandler.Succeeded(outputWindow.GetPane(ref paneGuid, out var pane)))
- {
- pane.Activate();
- }
- }
- }
-}
diff --git a/src/VisualStudio/Core/Def/Microsoft.VisualStudio.LanguageServices.csproj b/src/VisualStudio/Core/Def/Microsoft.VisualStudio.LanguageServices.csproj
index 12167e805ba6b..7c0cf9882002c 100644
--- a/src/VisualStudio/Core/Def/Microsoft.VisualStudio.LanguageServices.csproj
+++ b/src/VisualStudio/Core/Def/Microsoft.VisualStudio.LanguageServices.csproj
@@ -163,7 +163,9 @@
+
+
@@ -186,6 +188,7 @@
+
diff --git a/src/VisualStudio/Core/Def/RoslynPackage.cs b/src/VisualStudio/Core/Def/RoslynPackage.cs
index 14a65e3c96749..4e453b5131350 100644
--- a/src/VisualStudio/Core/Def/RoslynPackage.cs
+++ b/src/VisualStudio/Core/Def/RoslynPackage.cs
@@ -16,7 +16,9 @@
using Microsoft.CodeAnalysis.Logging;
using Microsoft.CodeAnalysis.Notification;
using Microsoft.CodeAnalysis.Options;
+using Microsoft.CodeAnalysis.Shared.TestHooks;
using Microsoft.CodeAnalysis.Versions;
+using Microsoft.ServiceHub.Framework;
using Microsoft.VisualStudio.ComponentModelHost;
using Microsoft.VisualStudio.LanguageServices.Experimentation;
using Microsoft.VisualStudio.LanguageServices.Implementation;
@@ -28,6 +30,7 @@
using Microsoft.VisualStudio.LanguageServices.Implementation.TableDataSource;
using Microsoft.VisualStudio.LanguageServices.Telemetry;
using Microsoft.VisualStudio.PlatformUI;
+using Microsoft.VisualStudio.RpcContracts.OutputChannel;
using Microsoft.VisualStudio.Shell;
using Microsoft.VisualStudio.Shell.Interop;
using Microsoft.VisualStudio.TaskStatusCenter;
@@ -43,7 +46,6 @@ namespace Microsoft.VisualStudio.LanguageServices.Setup
internal class RoslynPackage : AbstractPackage
{
private VisualStudioWorkspace _workspace;
- private WorkspaceFailureOutputPane _outputPane;
private IComponentModel _componentModel;
private RuleSetEventHandler _ruleSetEventHandler;
private IDisposable _solutionEventMonitor;
@@ -78,7 +80,7 @@ protected override async Task InitializeAsync(CancellationToken cancellationToke
RoslynTelemetrySetup.Initialize(this);
// set workspace output pane
- _outputPane = new WorkspaceFailureOutputPane(_componentModel.GetService(), this, _workspace);
+ await InitializeWorkspaceFailureOutputWindowAsync().ConfigureAwait(true);
InitializeColors();
@@ -90,6 +92,28 @@ protected override async Task InitializeAsync(CancellationToken cancellationToke
TrackBulkFileOperations();
}
+ private async Task InitializeWorkspaceFailureOutputWindowAsync()
+ {
+ var threadingContext = _componentModel.GetService();
+ var asyncListenerProvider = _componentModel.GetService();
+ var asyncListener = asyncListenerProvider.GetListener(FeatureAttribute.WorkspaceFailureLogger);
+
+ var brokeredServiceContainer = await this.GetServiceAsync().ConfigureAwait(false);
+ Assumes.Present(brokeredServiceContainer);
+ var serviceBroker = brokeredServiceContainer.GetFullAccessServiceBroker();
+ var serviceBrokerClient = new ServiceBrokerClient(serviceBroker, threadingContext.JoinableTaskFactory);
+
+ _workspace.WorkspaceFailed += (sender, eventArgs) =>
+ {
+ var asyncToken = asyncListener.BeginAsyncOperation(nameof(InitializeWorkspaceFailureOutputWindowAsync));
+ Task.Run(async () =>
+ {
+ using var outputChannelStore = await serviceBrokerClient.GetProxyAsync(VisualStudioServices.VS2019_4.OutputChannelStore).ConfigureAwait(false);
+ await outputChannelStore.Proxy.WriteLineAsync(ServicesVSResources.IntelliSense, eventArgs.Diagnostic.ToString()).ConfigureAwait(false);
+ }).CompletesAsyncOperation(asyncToken);
+ };
+ }
+
private void InitializeColors()
{
// Use VS color keys in order to support theming.
diff --git a/src/VisualStudio/VisualStudioDiagnosticsToolWindow/Loggers/OutputWindowLogger.cs b/src/VisualStudio/VisualStudioDiagnosticsToolWindow/Loggers/OutputWindowLogger.cs
index a86d683dc09ef..055b387c80a78 100644
--- a/src/VisualStudio/VisualStudioDiagnosticsToolWindow/Loggers/OutputWindowLogger.cs
+++ b/src/VisualStudio/VisualStudioDiagnosticsToolWindow/Loggers/OutputWindowLogger.cs
@@ -2,13 +2,13 @@
using System;
using System.Threading;
-using Microsoft.CodeAnalysis.Editor.Shared.Extensions;
using Microsoft.CodeAnalysis.Editor.Shared.Utilities;
-using Microsoft.CodeAnalysis.Options;
+using Microsoft.CodeAnalysis.Shared.TestHooks;
+using Microsoft.ServiceHub.Framework;
using Microsoft.VisualStudio;
-using Microsoft.VisualStudio.ComponentModelHost;
+using Microsoft.VisualStudio.RpcContracts.OutputChannel;
using Microsoft.VisualStudio.Shell;
-using Microsoft.VisualStudio.Shell.Interop;
+using Task = System.Threading.Tasks.Task;
namespace Microsoft.CodeAnalysis.Internal.Log
{
@@ -19,19 +19,21 @@ internal sealed class OutputWindowLogger : ILogger
{
private readonly Func _loggingChecker;
- public OutputWindowLogger()
- : this((Func)null)
- {
- }
+ private readonly IAsynchronousOperationListener _asyncListener;
+ private readonly ServiceBrokerClient _serviceBrokerClient;
+ private readonly IThreadingContext _threadingContext;
- public OutputWindowLogger(IGlobalOptionService optionService)
- : this(Logger.GetLoggingChecker(optionService))
- {
- }
-
- public OutputWindowLogger(Func loggingChecker)
+ public OutputWindowLogger(Func loggingChecker, IAsynchronousOperationListenerProvider asyncListenerProvider,
+ IThreadingContext threadingContext, IBrokeredServiceContainer brokeredServiceContainer)
{
_loggingChecker = loggingChecker;
+
+ Assumes.Present(brokeredServiceContainer);
+ var serviceBroker = brokeredServiceContainer.GetFullAccessServiceBroker();
+
+ _asyncListener = asyncListenerProvider.GetListener(FeatureAttribute.OutputWindowLogger);
+ _threadingContext = threadingContext;
+ _serviceBrokerClient = new ServiceBrokerClient(serviceBroker, _threadingContext.JoinableTaskFactory);
}
public bool IsEnabled(FunctionId functionId)
@@ -41,97 +43,28 @@ public bool IsEnabled(FunctionId functionId)
public void Log(FunctionId functionId, LogMessage logMessage)
{
- OutputPane.WriteLine(string.Format("[{0}] {1} - {2}", Thread.CurrentThread.ManagedThreadId, functionId.ToString(), logMessage.GetMessage()));
+ WriteLine(string.Format("[{0}] {1} - {2}", Thread.CurrentThread.ManagedThreadId, functionId.ToString(), logMessage.GetMessage()));
}
public void LogBlockStart(FunctionId functionId, LogMessage logMessage, int uniquePairId, CancellationToken cancellationToken)
{
- OutputPane.WriteLine(string.Format("[{0}] Start({1}) : {2} - {3}", Thread.CurrentThread.ManagedThreadId, uniquePairId, functionId.ToString(), logMessage.GetMessage()));
+ WriteLine(string.Format("[{0}] Start({1}) : {2} - {3}", Thread.CurrentThread.ManagedThreadId, uniquePairId, functionId.ToString(), logMessage.GetMessage()));
}
public void LogBlockEnd(FunctionId functionId, LogMessage logMessage, int uniquePairId, int delta, CancellationToken cancellationToken)
{
var functionString = functionId.ToString() + (cancellationToken.IsCancellationRequested ? " Canceled" : string.Empty);
- OutputPane.WriteLine(string.Format("[{0}] End({1}) : [{2}ms] {3}", Thread.CurrentThread.ManagedThreadId, uniquePairId, delta, functionString));
+ WriteLine(string.Format("[{0}] End({1}) : [{2}ms] {3}", Thread.CurrentThread.ManagedThreadId, uniquePairId, delta, functionString));
}
- private class OutputPane
+ private void WriteLine(string value)
{
- private static readonly Guid s_outputPaneGuid = new Guid("BBAFF416-4AF5-41F2-9F93-91F283E43C3B");
-
- public static readonly OutputPane s_instance = new OutputPane();
-
- private readonly IServiceProvider _serviceProvider;
- private readonly IThreadingContext _threadingContext;
-
- public static void WriteLine(string value)
- {
- s_instance.WriteLineInternal(value);
- }
-
- public OutputPane()
- {
- _serviceProvider = ServiceProvider.GlobalProvider;
-
- var componentModel = (IComponentModel)_serviceProvider.GetService(typeof(SComponentModel));
- _threadingContext = componentModel.GetService();
- }
-
- private IVsOutputWindowPane _doNotAccessDirectlyOutputPane;
-
- private void WriteLineInternal(string value)
- {
- var pane = GetPane();
- if (pane == null)
- {
- return;
- }
-
- pane.OutputStringThreadSafe(value + Environment.NewLine);
- }
-
- private IVsOutputWindowPane GetPane()
- {
- if (_doNotAccessDirectlyOutputPane == null)
- {
- _threadingContext.JoinableTaskFactory.Run(async () =>
- {
- await _threadingContext.JoinableTaskFactory.SwitchToMainThreadAsync();
-
- if (_doNotAccessDirectlyOutputPane != null)
- {
- // check whether other one already initialized output window.
- // the output API already handle double initialization, so this is just quick bail
- // rather than any functional issue
- return;
- }
-
- var outputWindow = (IVsOutputWindow)_serviceProvider.GetService(typeof(SVsOutputWindow));
-
- // this should bring outout window to the front
- _doNotAccessDirectlyOutputPane = CreateOutputPane(outputWindow);
- });
- }
-
- return _doNotAccessDirectlyOutputPane;
- }
-
- private IVsOutputWindowPane CreateOutputPane(IVsOutputWindow outputWindow)
+ var asyncToken = _asyncListener.BeginAsyncOperation(nameof(WriteLine));
+ Task.Run(async () =>
{
- _threadingContext.ThrowIfNotOnUIThread();
-
- // Try to get the workspace pane if it has already been registered
- var workspacePaneGuid = s_outputPaneGuid;
-
- // If the pane has already been created, CreatePane returns it
- if (ErrorHandler.Succeeded(outputWindow.CreatePane(ref workspacePaneGuid, "Roslyn Logger Output", fInitVisible: 1, fClearWithSolution: 1)) &&
- ErrorHandler.Succeeded(outputWindow.GetPane(ref workspacePaneGuid, out var pane)))
- {
- return pane;
- }
-
- return null;
- }
+ using var outputChannelStore = await _serviceBrokerClient.GetProxyAsync(VisualStudioServices.VS2019_4.OutputChannelStore).ConfigureAwait(false);
+ await outputChannelStore.Proxy.WriteLineAsync("Roslyn Logger Output", value).ConfigureAwait(false);
+ }).CompletesAsyncOperation(asyncToken);
}
}
}
diff --git a/src/VisualStudio/VisualStudioDiagnosticsToolWindow/OptionPages/PerformanceLoggersPage.cs b/src/VisualStudio/VisualStudioDiagnosticsToolWindow/OptionPages/PerformanceLoggersPage.cs
index 1864bc1f63f96..ea5756ba914f0 100644
--- a/src/VisualStudio/VisualStudioDiagnosticsToolWindow/OptionPages/PerformanceLoggersPage.cs
+++ b/src/VisualStudio/VisualStudioDiagnosticsToolWindow/OptionPages/PerformanceLoggersPage.cs
@@ -9,25 +9,32 @@
using Microsoft.CodeAnalysis.Internal.Log;
using Microsoft.CodeAnalysis.Options;
using Microsoft.CodeAnalysis.Remote;
+using Microsoft.CodeAnalysis.Shared.TestHooks;
using Microsoft.VisualStudio.ComponentModelHost;
using Microsoft.VisualStudio.LanguageServices;
using Microsoft.VisualStudio.LanguageServices.Implementation;
using Microsoft.VisualStudio.LanguageServices.Implementation.Options;
+using Microsoft.VisualStudio.Shell;
namespace Roslyn.VisualStudio.DiagnosticsWindow.OptionsPages
{
[Guid(Guids.RoslynOptionPagePerformanceLoggersIdString)]
internal class PerformanceLoggersPage : AbstractOptionPage
{
+ private IAsynchronousOperationListenerProvider _asyncListenerProvider;
private IGlobalOptionService _optionService;
private IThreadingContext _threadingContext;
private IRemoteHostClientService _remoteService;
+ private IBrokeredServiceContainer _brokeredServiceContainer;
protected override AbstractOptionPageControl CreateOptionPage(IServiceProvider serviceProvider, OptionStore optionStore)
{
if (_optionService == null)
{
var componentModel = (IComponentModel)serviceProvider.GetService(typeof(SComponentModel));
+ _asyncListenerProvider = componentModel.GetService();
+
+ _brokeredServiceContainer = (IBrokeredServiceContainer)serviceProvider.GetService(typeof(SVsBrokeredServiceContainer));
_optionService = componentModel.GetService();
_threadingContext = componentModel.GetService();
@@ -43,10 +50,11 @@ protected override void OnApply(PageApplyEventArgs e)
{
base.OnApply(e);
- SetLoggers(_optionService, _threadingContext, _remoteService);
+ SetLoggers(_optionService, _asyncListenerProvider, _threadingContext, _remoteService, _brokeredServiceContainer);
}
- public static void SetLoggers(IGlobalOptionService optionService, IThreadingContext threadingContext, IRemoteHostClientService remoteService)
+ public static void SetLoggers(IGlobalOptionService optionService, IAsynchronousOperationListenerProvider asyncListenerProvider, IThreadingContext threadingContext,
+ IRemoteHostClientService remoteService, IBrokeredServiceContainer brokeredServiceContainer)
{
var loggerTypes = GetLoggerTypes(optionService).ToList();
@@ -55,7 +63,7 @@ public static void SetLoggers(IGlobalOptionService optionService, IThreadingCont
SetRoslynLogger(loggerTypes, () => new EtwLogger(options));
SetRoslynLogger(loggerTypes, () => new TraceLogger(options));
- SetRoslynLogger(loggerTypes, () => new OutputWindowLogger(options));
+ SetRoslynLogger(loggerTypes, () => new OutputWindowLogger(options, asyncListenerProvider, threadingContext, brokeredServiceContainer));
// second set RemoteHost options
var client = threadingContext.JoinableTaskFactory.Run(() => remoteService.TryGetRemoteHostClientAsync(CancellationToken.None));
diff --git a/src/VisualStudio/VisualStudioDiagnosticsToolWindow/Roslyn.VisualStudio.DiagnosticsWindow.csproj b/src/VisualStudio/VisualStudioDiagnosticsToolWindow/Roslyn.VisualStudio.DiagnosticsWindow.csproj
index c07c2e3d42de3..e341f4d83f084 100644
--- a/src/VisualStudio/VisualStudioDiagnosticsToolWindow/Roslyn.VisualStudio.DiagnosticsWindow.csproj
+++ b/src/VisualStudio/VisualStudioDiagnosticsToolWindow/Roslyn.VisualStudio.DiagnosticsWindow.csproj
@@ -60,6 +60,7 @@
+
diff --git a/src/VisualStudio/VisualStudioDiagnosticsToolWindow/VisualStudioDiagnosticsWindowPackage.cs b/src/VisualStudio/VisualStudioDiagnosticsToolWindow/VisualStudioDiagnosticsWindowPackage.cs
index 52aa23790ce64..b6ebe1ecbf387 100644
--- a/src/VisualStudio/VisualStudioDiagnosticsToolWindow/VisualStudioDiagnosticsWindowPackage.cs
+++ b/src/VisualStudio/VisualStudioDiagnosticsToolWindow/VisualStudioDiagnosticsWindowPackage.cs
@@ -11,6 +11,7 @@
using Microsoft.CodeAnalysis.Editor.Shared.Utilities;
using Microsoft.CodeAnalysis.Options;
using Microsoft.CodeAnalysis.Remote;
+using Microsoft.CodeAnalysis.Shared.TestHooks;
using Microsoft.VisualStudio.ComponentModelHost;
using Microsoft.VisualStudio.LanguageServices;
using Microsoft.VisualStudio.LanguageServices.Implementation.Options;
@@ -110,7 +111,10 @@ protected override async Task InitializeAsync(CancellationToken cancellationToke
var optionService = componentModel.GetService();
var remoteService = workspace.Services.GetService();
- PerformanceLoggersPage.SetLoggers(optionService, _threadingContext, remoteService);
+ var brokeredServiceContainer = (IBrokeredServiceContainer)await GetServiceAsync(typeof(SVsBrokeredServiceContainer)).ConfigureAwait(true);
+ var asyncOperationListenerProvider = componentModel.GetService();
+
+ PerformanceLoggersPage.SetLoggers(optionService, asyncOperationListenerProvider, _threadingContext, remoteService, brokeredServiceContainer);
}
#endregion
diff --git a/src/Workspaces/Core/Portable/Shared/TestHooks/FeatureAttribute_Names.cs b/src/Workspaces/Core/Portable/Shared/TestHooks/FeatureAttribute_Names.cs
index 59d5f24ac2b49..c1eb12ae3a0c0 100644
--- a/src/Workspaces/Core/Portable/Shared/TestHooks/FeatureAttribute_Names.cs
+++ b/src/Workspaces/Core/Portable/Shared/TestHooks/FeatureAttribute_Names.cs
@@ -28,6 +28,7 @@ internal partial class FeatureAttribute
public const string NavigateTo = nameof(NavigateTo);
public const string NavigationBar = nameof(NavigationBar);
public const string Outlining = nameof(Outlining);
+ public const string OutputWindowLogger = nameof(OutputWindowLogger);
public const string QuickInfo = nameof(QuickInfo);
public const string ReferenceHighlighting = nameof(ReferenceHighlighting);
public const string Rename = nameof(Rename);
@@ -40,5 +41,6 @@ internal partial class FeatureAttribute
public const string TodoCommentList = nameof(TodoCommentList);
public const string LanguageServerWorkspaceSymbolSearch = nameof(LanguageServerWorkspaceSymbolSearch);
public const string Workspace = nameof(Workspace);
+ public const string WorkspaceFailureLogger = nameof(WorkspaceFailureLogger);
}
}