提交 d6d41000 编写于 作者: S Sam Harwell

Only use IFeatureServiceFactory for controlling async completion

Closes #33807
上级 bb39bc82
......@@ -35,13 +35,6 @@ internal class AsyncCompletionService : ForegroundThreadAffinitizedObject, IAsyn
private readonly IEnumerable<Lazy<IBraceCompletionSessionProvider, BraceCompletionMetadata>> _autoBraceCompletionChars;
private readonly Dictionary<IContentType, ImmutableHashSet<char>> _autoBraceCompletionCharSet;
/// <summary>
/// The new completion API is not checked by default - null
/// false - disabled
/// true - enabled
/// </summary>
private bool? _newCompletionAPIEnabled = null;
[ImportingConstructor]
[Obsolete(MefConstruction.ImportingConstructorMessage, error: true)]
public AsyncCompletionService(
......@@ -95,40 +88,10 @@ public bool TryGetController(ITextView textView, ITextBuffer subjectBuffer, out
private bool UseLegacyCompletion(IFeatureServiceFactory featureServiceFactory, ITextView textView, ITextBuffer subjectBuffer)
{
if (!_newCompletionAPIEnabled.HasValue)
{
int userSetting = 0;
const string useAsyncCompletionOptionName = "UseAsyncCompletion";
if (textView.Options.GlobalOptions.IsOptionDefined(useAsyncCompletionOptionName, localScopeOnly: false))
{
userSetting = textView.Options.GlobalOptions.GetOptionValue<int>(useAsyncCompletionOptionName);
}
// The meaning of the UseAsyncCompletion option definition's values:
// -1 - user disabled async completion
// 0 - no changes from the user; check the experimentation service for whether to use async completion
// 1 - user enabled async completion
if (userSetting == 1)
{
_newCompletionAPIEnabled = true;
}
else if (userSetting == -1)
{
_newCompletionAPIEnabled = false;
}
else
{
if (Workspace.TryGetWorkspace(subjectBuffer.AsTextContainer(), out var workspace))
{
var experimentationService = workspace.Services.GetService<IExperimentationService>();
_newCompletionAPIEnabled = experimentationService.IsExperimentEnabled(WellKnownExperimentNames.CompletionAPI)
&& featureServiceFactory.GlobalFeatureService.IsEnabled(PredefinedEditorFeatureNames.AsyncCompletion);
}
}
}
var newCompletionEnabled = featureServiceFactory.GetOrCreate(textView).IsEnabled(PredefinedEditorFeatureNames.AsyncCompletion);
// Check whether the feature flag (async completion API) is set or this feature is off.
if (_newCompletionAPIEnabled == true || !subjectBuffer.GetFeatureOnOffOption(InternalFeatureOnOffOptions.CompletionSet))
if (newCompletionEnabled || !subjectBuffer.GetFeatureOnOffOption(InternalFeatureOnOffOptions.CompletionSet))
{
return false;
}
......
' Copyright (c) Microsoft. All Rights Reserved. Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
Imports Microsoft.VisualStudio.Utilities
Namespace Microsoft.CodeAnalysis.Editor.UnitTests.IntelliSense
Friend NotInheritable Class EmptyFeatureController
Implements IFeatureController
Friend Shared ReadOnly Instance As EmptyFeatureController = New EmptyFeatureController()
Private Sub New()
End Sub
End Class
End Namespace
......@@ -6,6 +6,7 @@ Imports Microsoft.CodeAnalysis.Completion
Imports Microsoft.CodeAnalysis.Editor.CommandHandlers
Imports Microsoft.VisualStudio.Text.Editor
Imports Microsoft.VisualStudio.Text.Editor.Commanding.Commands
Imports Microsoft.VisualStudio.Utilities
Imports Roslyn.Utilities
Imports VSCommanding = Microsoft.VisualStudio.Commanding
......@@ -32,6 +33,9 @@ Namespace Microsoft.CodeAnalysis.Editor.UnitTests.IntelliSense
MyBase.New(workspaceElement, extraCompletionProviders, excludedTypes, extraExportedTypes, includeFormatCommandHandler, workspaceKind)
Me.CompletionCommandHandler = GetExportedValue(Of CompletionCommandHandler)()
Dim featureServiceFactory = GetExportedValue(Of IFeatureServiceFactory)()
featureServiceFactory.GlobalFeatureService.Disable(PredefinedEditorFeatureNames.AsyncCompletion, EmptyFeatureController.Instance)
End Sub
#Region "Editor Related Operations"
......
......@@ -11,7 +11,6 @@
using System.Threading.Tasks;
using EnvDTE;
using Microsoft.VisualStudio.Setup.Configuration;
using Microsoft.Win32;
using RunTests;
using Process = System.Diagnostics.Process;
......@@ -328,19 +327,6 @@ private static Process StartNewVisualStudioProcess(string installationPath, int
// Disable background download UI to avoid toasts
Process.Start(vsRegEditExeFile, $"set \"{installationPath}\" {Settings.Default.VsRootSuffix} HKCU \"FeatureFlags\\Setup\\BackgroundDownload\" Value dword 0").WaitForExit();
// Remove legacy settings for controlling async completion to ensure they do not interfere
//
// 1. UseAsyncCompletion option
// 2. completionapi A/B experiment
Process.Start(vsRegEditExeFile, $"remove \"{installationPath}\" {Settings.Default.VsRootSuffix} HKCU \"ApplicationPrivateSettings\\WindowManagement\\Options\" UseAsyncCompletion").WaitForExit();
var disabledFlights = Registry.GetValue(@"HKEY_CURRENT_USER\Software\Microsoft\VisualStudio\ABExp\LocalTest", "DisabledFlights", Array.Empty<string>()) as string[] ?? Array.Empty<string>();
if (disabledFlights.Any())
{
disabledFlights = disabledFlights.Where(flight => !string.Equals(flight, "completionapi", StringComparison.OrdinalIgnoreCase)).ToArray();
Registry.SetValue(@"HKEY_CURRENT_USER\Software\Microsoft\VisualStudio\ABExp\LocalTest", "DisabledFlights", disabledFlights, RegistryValueKind.MultiString);
}
// Disable text editor error reporting because it pops up a dialog. We want to either fail fast in our
// custom handler or fail silently and continue testing.
Process.Start(vsRegEditExeFile, $"set \"{installationPath}\" {Settings.Default.VsRootSuffix} HKCU \"Text Editor\" \"Report Exceptions\" dword 0").WaitForExit();
......
......@@ -27,7 +27,6 @@ public DefaultExperimentationService()
internal static class WellKnownExperimentNames
{
public const string RoslynOOP64bit = nameof(RoslynOOP64bit);
public const string CompletionAPI = nameof(CompletionAPI);
public const string PartialLoadMode = "Roslyn.PartialLoadMode";
public const string TypeImportCompletion = "Roslyn.TypeImportCompletion";
public const string TargetTypedCompletionFilter = "Roslyn.TargetTypedCompletionFilter";
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册