提交 3e5b27d9 编写于 作者: C CyrusNajmabadi

Don't preload completion providers we don't need.

上级 13859e84
......@@ -29,6 +29,7 @@ public abstract class CompletionServiceWithProviders : CompletionService
protected CompletionServiceWithProviders(Workspace workspace)
{
_workspace = workspace;
_createRoleProviders = CreateRoleProviders;
}
public override CompletionRules GetRules()
......@@ -68,7 +69,6 @@ protected virtual ImmutableArray<CompletionProvider> GetBuiltInProviders()
internal void SetTestProviders(IEnumerable<CompletionProvider> testProviders)
{
_testProviders = testProviders != null ? testProviders.ToImmutableArray() : ImmutableArray<CompletionProvider>.Empty;
_lazyNameToProviderMap = null;
}
private class RoleProviders
......@@ -79,31 +79,36 @@ private class RoleProviders
private readonly ConditionalWeakTable<ImmutableHashSet<string>, RoleProviders> _roleProviders
= new ConditionalWeakTable<ImmutableHashSet<string>, RoleProviders>();
protected ImmutableArray<CompletionProvider> GetProviders(ImmutableHashSet<string> roles)
private readonly ConditionalWeakTable<ImmutableHashSet<string>, RoleProviders>.CreateValueCallback _createRoleProviders;
private RoleProviders CreateRoleProviders(ImmutableHashSet<string> roles)
{
roles = roles ?? ImmutableHashSet<string>.Empty;
var builtin = GetBuiltInProviders();
var imported = GetImportedProviders()
.Where(lz => lz.Metadata.Roles == null || lz.Metadata.Roles.Length == 0 || roles.Overlaps(lz.Metadata.Roles))
.Select(lz => lz.Value);
RoleProviders providers;
if (!_roleProviders.TryGetValue(roles, out providers))
var providers = builtin.Concat(imported).Concat(_testProviders);
lock (_gate)
{
providers = _roleProviders.GetValue(roles, _ =>
foreach (var provider in providers)
{
var builtin = GetBuiltInProviders();
var imported = GetImportedProviders()
.Where(lz => lz.Metadata.Roles == null || lz.Metadata.Roles.Length == 0 || roles.Overlaps(lz.Metadata.Roles))
.Select(lz => lz.Value);
return new RoleProviders { Providers = builtin.Concat(imported).ToImmutableArray() };
});
_nameToProvider[provider.Name] = provider;
}
}
if (_testProviders.Length > 0)
{
return providers.Providers.Concat(_testProviders);
}
else
{
return providers.Providers;
}
return new RoleProviders { Providers = 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;
}
protected virtual ImmutableArray<CompletionProvider> GetProviders(ImmutableHashSet<string> roles, CompletionTrigger trigger)
......@@ -118,19 +123,8 @@ protected virtual ImmutableArray<CompletionProvider> GetProviders(ImmutableHashS
}
}
private ImmutableDictionary<string, CompletionProvider> _lazyNameToProviderMap = null;
private ImmutableDictionary<string, CompletionProvider> NameToProviderMap
{
get
{
if (_lazyNameToProviderMap == null)
{
Interlocked.CompareExchange(ref _lazyNameToProviderMap, CreateNameToProviderMap(), null);
}
return _lazyNameToProviderMap;
}
}
private readonly object _gate = new object();
private readonly Dictionary<string, CompletionProvider> _nameToProvider = new Dictionary<string, CompletionProvider>();
private ImmutableDictionary<string, CompletionProvider> CreateNameToProviderMap()
{
......@@ -150,15 +144,17 @@ protected virtual ImmutableArray<CompletionProvider> GetProviders(ImmutableHashS
internal protected CompletionProvider GetProvider(CompletionItem item)
{
string name;
CompletionProvider provider;
CompletionProvider provider = null;
if (item.Properties.TryGetValue("Provider", out name)
&& this.NameToProviderMap.TryGetValue(name, out provider))
if (item.Properties.TryGetValue("Provider", out name))
{
return provider;
lock (_gate)
{
_nameToProvider.TryGetValue(name, out provider);
}
}
return null;
return provider;
}
public override async Task<CompletionList> GetCompletionsAsync(
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册