diff --git a/src/Features/Core/Portable/Completion/Providers/AbstractSymbolCompletionProvider.cs b/src/Features/Core/Portable/Completion/Providers/AbstractSymbolCompletionProvider.cs index 6c061f5d60faf4b242b3eaf5cb4bed02d7884fde..65cda9ce4f8a76653c788d30ae99733654bf9331 100644 --- a/src/Features/Core/Portable/Completion/Providers/AbstractSymbolCompletionProvider.cs +++ b/src/Features/Core/Portable/Completion/Providers/AbstractSymbolCompletionProvider.cs @@ -8,6 +8,7 @@ using System.Threading; using System.Threading.Tasks; using Microsoft.CodeAnalysis.ErrorReporting; +using Microsoft.CodeAnalysis.Experiments; using Microsoft.CodeAnalysis.Internal.Log; using Microsoft.CodeAnalysis.LanguageServices; using Microsoft.CodeAnalysis.Options; @@ -31,6 +32,8 @@ internal abstract class AbstractSymbolCompletionProvider : CommonCompletionProvi private static int s_cachedPosition; private static readonly object s_cacheGate = new object(); + private bool? _shouldCreateTargetTypeCompletionFilter = null; + protected AbstractSymbolCompletionProvider() { } @@ -63,9 +66,12 @@ protected virtual CompletionItemRules GetCompletionItemRules(IReadOnlyList ShouldIncludeInTargetTypedCompletionList(s, inferredTypes, context.SemanticModel, context.Position))) + if (ShouldCreateTargetTypeCompletionFilter(context.Workspace)) { - item = item.AddTag(WellKnownTags.MatchingType); + if (symbolGroup.Any(s => ShouldIncludeInTargetTypedCompletionList(s, inferredTypes, context.SemanticModel, context.Position))) + { + item = item.AddTag(WellKnownTags.MatchingType); + } } itemListBuilder.Add(item); @@ -74,6 +80,17 @@ protected virtual CompletionItemRules GetCompletionItemRules(IReadOnlyList(); + _shouldCreateTargetTypeCompletionFilter = experimentationService.IsExperimentEnabled(WellKnownExperimentNames.TargetTypedCompletionFilter); + } + + return _shouldCreateTargetTypeCompletionFilter == true; + } + private bool ShouldIncludeInTargetTypedCompletionList(ISymbol symbol, ImmutableArray inferredTypes, SemanticModel semanticModel, int position) { // When searching for identifiers of type C, exclude the symbol for the `C` type itself. diff --git a/src/Workspaces/Core/Portable/Experiments/IExperimentationService.cs b/src/Workspaces/Core/Portable/Experiments/IExperimentationService.cs index 659dd9755ea7d19d4538fb5d46bcdf3cda299097..7c31f70cc2535d086c38cd7b9cffb7e9a0671e22 100644 --- a/src/Workspaces/Core/Portable/Experiments/IExperimentationService.cs +++ b/src/Workspaces/Core/Portable/Experiments/IExperimentationService.cs @@ -23,5 +23,6 @@ internal static class WellKnownExperimentNames public const string CompletionAPI = nameof(CompletionAPI); public const string PartialLoadMode = "Roslyn.PartialLoadMode"; public const string TypeImportCompletion = "Roslyn.TypeImportCompletion"; + public const string TargetTypedCompletionFilter = "Roslyn.TargetTypedCompletionFilter"; } }