提交 98983b7f 编写于 作者: D David Poeschl

Make target-typed completion an experiment

上级 f5785337
...@@ -8,6 +8,7 @@ ...@@ -8,6 +8,7 @@
using System.Threading; using System.Threading;
using System.Threading.Tasks; using System.Threading.Tasks;
using Microsoft.CodeAnalysis.ErrorReporting; using Microsoft.CodeAnalysis.ErrorReporting;
using Microsoft.CodeAnalysis.Experiments;
using Microsoft.CodeAnalysis.Internal.Log; using Microsoft.CodeAnalysis.Internal.Log;
using Microsoft.CodeAnalysis.LanguageServices; using Microsoft.CodeAnalysis.LanguageServices;
using Microsoft.CodeAnalysis.Options; using Microsoft.CodeAnalysis.Options;
...@@ -31,6 +32,8 @@ internal abstract class AbstractSymbolCompletionProvider : CommonCompletionProvi ...@@ -31,6 +32,8 @@ internal abstract class AbstractSymbolCompletionProvider : CommonCompletionProvi
private static int s_cachedPosition; private static int s_cachedPosition;
private static readonly object s_cacheGate = new object(); private static readonly object s_cacheGate = new object();
private bool? _shouldCreateTargetTypeCompletionFilter = null;
protected AbstractSymbolCompletionProvider() protected AbstractSymbolCompletionProvider()
{ {
} }
...@@ -63,9 +66,12 @@ protected virtual CompletionItemRules GetCompletionItemRules(IReadOnlyList<ISymb ...@@ -63,9 +66,12 @@ protected virtual CompletionItemRules GetCompletionItemRules(IReadOnlyList<ISymb
symbolGroup.Key.displayText, symbolGroup.Key.suffix, symbolGroup.Key.insertionText, symbolGroup.ToList(), context, symbolGroup.Key.displayText, symbolGroup.Key.suffix, symbolGroup.Key.insertionText, symbolGroup.ToList(), context,
invalidProjectMap: null, totalProjects: null, preselect: preselect); invalidProjectMap: null, totalProjects: null, preselect: preselect);
if (symbolGroup.Any(s => 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); itemListBuilder.Add(item);
...@@ -74,6 +80,17 @@ protected virtual CompletionItemRules GetCompletionItemRules(IReadOnlyList<ISymb ...@@ -74,6 +80,17 @@ protected virtual CompletionItemRules GetCompletionItemRules(IReadOnlyList<ISymb
return itemListBuilder.ToImmutable(); return itemListBuilder.ToImmutable();
} }
private bool ShouldCreateTargetTypeCompletionFilter(Workspace workspace)
{
if (!_shouldCreateTargetTypeCompletionFilter.HasValue)
{
var experimentationService = workspace.Services.GetService<IExperimentationService>();
_shouldCreateTargetTypeCompletionFilter = experimentationService.IsExperimentEnabled(WellKnownExperimentNames.TargetTypedCompletionFilter);
}
return _shouldCreateTargetTypeCompletionFilter == true;
}
private bool ShouldIncludeInTargetTypedCompletionList(ISymbol symbol, ImmutableArray<ITypeSymbol> inferredTypes, SemanticModel semanticModel, int position) private bool ShouldIncludeInTargetTypedCompletionList(ISymbol symbol, ImmutableArray<ITypeSymbol> inferredTypes, SemanticModel semanticModel, int position)
{ {
// When searching for identifiers of type C, exclude the symbol for the `C` type itself. // When searching for identifiers of type C, exclude the symbol for the `C` type itself.
......
...@@ -23,5 +23,6 @@ internal static class WellKnownExperimentNames ...@@ -23,5 +23,6 @@ internal static class WellKnownExperimentNames
public const string CompletionAPI = nameof(CompletionAPI); public const string CompletionAPI = nameof(CompletionAPI);
public const string PartialLoadMode = "Roslyn.PartialLoadMode"; public const string PartialLoadMode = "Roslyn.PartialLoadMode";
public const string TypeImportCompletion = "Roslyn.TypeImportCompletion"; 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.
先完成此消息的编辑!
想要评论请 注册