提交 ef99ec94 编写于 作者: J Jason Malinowski

Make HostAnalyzerManager a bit lazier

We take the analyzer references provided from VSIX extensions and create
a map of AnalyzerReference.Id -> AnalyzerReference, which is done by
cracking the metadata and getting the .NET assembly identity for them.
We were doing this on the UI during package load, which really isn't
necessary.
上级 a4c008b7
......@@ -32,7 +32,7 @@ internal sealed partial class HostAnalyzerManager
///
/// We use the key to de-duplicate analyzer references if they are referenced from multiple places.
/// </summary>
private readonly ImmutableDictionary<object, AnalyzerReference> _hostAnalyzerReferencesMap;
private readonly Lazy<ImmutableDictionary<object, AnalyzerReference>> _hostAnalyzerReferencesMap;
/// <summary>
/// Key is the language the <see cref="DiagnosticAnalyzer"/> supports and key for the second map is analyzer reference identity and
......@@ -93,9 +93,9 @@ internal sealed partial class HostAnalyzerManager
_hostDiagnosticAnalyzerPackages = hostAnalyzerPackages;
_hostDiagnosticUpdateSource = hostDiagnosticUpdateSource;
_hostAnalyzerReferencesMap = hostAnalyzerReferences.IsDefault ? ImmutableDictionary<object, AnalyzerReference>.Empty : CreateAnalyzerReferencesMap(hostAnalyzerReferences);
_hostAnalyzerReferencesMap = new Lazy<ImmutableDictionary<object, AnalyzerReference>>(() => hostAnalyzerReferences.IsDefault ? ImmutableDictionary<object, AnalyzerReference>.Empty : CreateAnalyzerReferencesMap(hostAnalyzerReferences));
_hostDiagnosticAnalyzersPerLanguageMap = new ConcurrentDictionary<string, ImmutableDictionary<object, ImmutableArray<DiagnosticAnalyzer>>>(concurrencyLevel: 2, capacity: 2);
_lazyHostDiagnosticAnalyzersPerReferenceMap = new Lazy<ImmutableDictionary<object, ImmutableArray<DiagnosticAnalyzer>>>(() => CreateDiagnosticAnalyzersPerReferenceMap(_hostAnalyzerReferencesMap), isThreadSafe: true);
_lazyHostDiagnosticAnalyzersPerReferenceMap = new Lazy<ImmutableDictionary<object, ImmutableArray<DiagnosticAnalyzer>>>(() => CreateDiagnosticAnalyzersPerReferenceMap(_hostAnalyzerReferencesMap.Value), isThreadSafe: true);
_compilerDiagnosticAnalyzerMap = ImmutableDictionary<string, DiagnosticAnalyzer>.Empty;
_compilerDiagnosticAnalyzerDescriptorMap = ImmutableDictionary<DiagnosticAnalyzer, HashSet<string>>.Empty;
......@@ -120,10 +120,10 @@ public object GetAnalyzerReferenceIdentity(AnalyzerReference reference)
{
if (projectOpt == null)
{
return _hostAnalyzerReferencesMap;
return _hostAnalyzerReferencesMap.Value;
}
return _hostAnalyzerReferencesMap.AddRange(CreateProjectAnalyzerReferencesMap(projectOpt));
return _hostAnalyzerReferencesMap.Value.AddRange(CreateProjectAnalyzerReferencesMap(projectOpt));
}
/// <summary>
......@@ -310,7 +310,7 @@ public string GetDiagnosticAnalyzerPackageName(string language, DiagnosticAnalyz
var nameMap = CreateAnalyzerPathToPackageNameMap();
var builder = ImmutableDictionary.CreateBuilder<object, ImmutableArray<DiagnosticAnalyzer>>();
foreach (var kv in _hostAnalyzerReferencesMap)
foreach (var kv in _hostAnalyzerReferencesMap.Value)
{
var referenceIdentity = kv.Key;
var reference = kv.Value;
......@@ -401,7 +401,7 @@ private bool CheckAnalyzerReferenceIdentity(AnalyzerReference reference)
return false;
}
return !_hostAnalyzerReferencesMap.ContainsKey(reference.Id);
return !_hostAnalyzerReferencesMap.Value.ContainsKey(reference.Id);
}
private static ImmutableDictionary<object, ImmutableArray<DiagnosticAnalyzer>> CreateDiagnosticAnalyzersPerReferenceMap(
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册