提交 167e4649 编写于 作者: C CyrusNajmabadi

Move away from conditional weak tables.

上级 3e5b27d9
......@@ -23,9 +23,17 @@ namespace Microsoft.CodeAnalysis.Completion
public abstract class CompletionServiceWithProviders : CompletionService
{
private static readonly Func<string, List<CompletionItem>> s_createList = _ => new List<CompletionItem>();
private IEnumerable<Lazy<CompletionProvider, CompletionProviderMetadata>> _importedProviders;
private readonly object _gate = new object();
private readonly Dictionary<string, CompletionProvider> _nameToProvider = new Dictionary<string, CompletionProvider>();
private readonly Dictionary<ImmutableHashSet<string>, ImmutableArray<CompletionProvider>> _rolesToProviders = new Dictionary<ImmutableHashSet<string>, ImmutableArray<CompletionProvider>>();
private readonly Func<ImmutableHashSet<string>, ImmutableArray<CompletionProvider>> _createRoleProviders;
private readonly Workspace _workspace;
private IEnumerable<Lazy<CompletionProvider, CompletionProviderMetadata>> _importedProviders;
protected CompletionServiceWithProviders(Workspace workspace)
{
_workspace = workspace;
......@@ -68,20 +76,15 @@ protected virtual ImmutableArray<CompletionProvider> GetBuiltInProviders()
internal void SetTestProviders(IEnumerable<CompletionProvider> testProviders)
{
_testProviders = testProviders != null ? testProviders.ToImmutableArray() : ImmutableArray<CompletionProvider>.Empty;
}
private class RoleProviders
{
public ImmutableArray<CompletionProvider> Providers;
lock (_gate)
{
_testProviders = testProviders != null ? testProviders.ToImmutableArray() : ImmutableArray<CompletionProvider>.Empty;
_rolesToProviders.Clear();
_nameToProvider.Clear();
}
}
private readonly ConditionalWeakTable<ImmutableHashSet<string>, RoleProviders> _roleProviders
= new ConditionalWeakTable<ImmutableHashSet<string>, RoleProviders>();
private readonly ConditionalWeakTable<ImmutableHashSet<string>, RoleProviders>.CreateValueCallback _createRoleProviders;
private RoleProviders CreateRoleProviders(ImmutableHashSet<string> roles)
private ImmutableArray<CompletionProvider> CreateRoleProviders(ImmutableHashSet<string> roles)
{
var builtin = GetBuiltInProviders();
var imported = GetImportedProviders()
......@@ -90,25 +93,22 @@ private RoleProviders CreateRoleProviders(ImmutableHashSet<string> roles)
var providers = builtin.Concat(imported).Concat(_testProviders);
lock (_gate)
foreach (var provider in providers)
{
foreach (var provider in providers)
{
_nameToProvider[provider.Name] = provider;
}
_nameToProvider[provider.Name] = provider;
}
return new RoleProviders { Providers = providers.ToImmutableArray() };
return providers.ToImmutableArray();
}
protected ImmutableArray<CompletionProvider> GetProviders(ImmutableHashSet<string> roles)
{
roles = roles ?? ImmutableHashSet<string>.Empty;
RoleProviders providers;
return _roleProviders.TryGetValue(roles, out providers)
? providers.Providers
: ImmutableArray<CompletionProvider>.Empty;
lock (_gate)
{
return _rolesToProviders.GetOrAdd(roles, _createRoleProviders);
}
}
protected virtual ImmutableArray<CompletionProvider> GetProviders(ImmutableHashSet<string> roles, CompletionTrigger trigger)
......@@ -123,24 +123,6 @@ protected virtual ImmutableArray<CompletionProvider> GetProviders(ImmutableHashS
}
}
private readonly object _gate = new object();
private readonly Dictionary<string, CompletionProvider> _nameToProvider = new Dictionary<string, CompletionProvider>();
private ImmutableDictionary<string, CompletionProvider> CreateNameToProviderMap()
{
var map = ImmutableDictionary<string, CompletionProvider>.Empty;
foreach (var provider in GetBuiltInProviders().Concat(GetImportedProviders().Select(lz => lz.Value)).Concat(_testProviders))
{
if (!map.ContainsKey(provider.Name))
{
map = map.Add(provider.Name, provider);
}
}
return map;
}
internal protected CompletionProvider GetProvider(CompletionItem item)
{
string name;
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册