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); } }