提交 4ec1f37f 编写于 作者: M Manish Vasani

Remove caching of declaring syntax references for symbols in analyzer driver -...

Remove caching of declaring syntax references for symbols in analyzer driver - this was done as part of addressing some performance regressions, but the subsequent tuning should make the original change redundant.

Fixes #7156
上级 4577bd48
......@@ -814,23 +814,10 @@ public override ImmutableArray<SyntaxReference> DeclaringSyntaxReferences
{
get
{
// PERF: Declaring references are cached for compilations with event queue.
return this.DeclaringCompilation?.EventQueue != null ? GetCachedDeclaringReferences() : this.SyntaxReferences;
return SyntaxReferences;
}
}
private ImmutableArray<SyntaxReference> GetCachedDeclaringReferences()
{
ImmutableArray<SyntaxReference> declaringReferences;
if (!Diagnostics.AnalyzerDriver.TryGetCachedDeclaringReferences(this, this.DeclaringCompilation, out declaringReferences))
{
declaringReferences = this.SyntaxReferences;
Diagnostics.AnalyzerDriver.CacheDeclaringReferences(this, this.DeclaringCompilation, declaringReferences);
}
return declaringReferences;
}
#endregion
#region Members
......
......@@ -111,23 +111,10 @@ public override ImmutableArray<SyntaxReference> DeclaringSyntaxReferences
{
get
{
// PERF: Declaring references are cached for compilations with event queue.
return this.DeclaringCompilation?.EventQueue != null ? GetCachedDeclaringReferences() : ComputeDeclaringReferencesCore();
return ComputeDeclaringReferencesCore();
}
}
private ImmutableArray<SyntaxReference> GetCachedDeclaringReferences()
{
ImmutableArray<SyntaxReference> declaringReferences;
if (!Diagnostics.AnalyzerDriver.TryGetCachedDeclaringReferences(this, this.DeclaringCompilation, out declaringReferences))
{
declaringReferences = ComputeDeclaringReferencesCore();
Diagnostics.AnalyzerDriver.CacheDeclaringReferences(this, this.DeclaringCompilation, declaringReferences);
}
return declaringReferences;
}
private ImmutableArray<SyntaxReference> ComputeDeclaringReferencesCore()
{
// SyntaxReference in the namespace declaration points to the name node of the namespace decl node not
......
......@@ -321,11 +321,6 @@ public async Task OnCompilationEventProcessedAsync(CompilationEvent compilationE
{
UpdateEventsMap_NoLock(compilationEvent, add: false);
}
if (symbolDeclaredEvent != null)
{
AnalyzerDriver.RemoveCachedDeclaringReferences(symbolDeclaredEvent.Symbol, symbolDeclaredEvent.Compilation);
}
}
/// <summary>
......
......@@ -20,16 +20,9 @@ internal class CompilationData
/// </summary>
private readonly Dictionary<SyntaxTree, SemanticModel> _semanticModelsMap;
/// <summary>
/// Cached syntax references for a symbol for the lifetime of symbol declared event.
/// PERF: This cache reduces allocations for computing declaring syntax references for a symbol.
/// </summary>
private readonly Dictionary<ISymbol, ImmutableArray<SyntaxReference>> _symbolDeclarationsMap;
public CompilationData(Compilation comp)
{
_semanticModelsMap = new Dictionary<SyntaxTree, SemanticModel>();
_symbolDeclarationsMap = new Dictionary<ISymbol, ImmutableArray<SyntaxReference>>();
this.SuppressMessageAttributeState = new SuppressMessageAttributeState(comp);
this.DeclarationAnalysisDataMap = new Dictionary<SyntaxReference, DeclarationAnalysisData>();
}
......@@ -47,8 +40,7 @@ public SemanticModel GetOrCreateCachedSemanticModel(SyntaxTree tree, Compilation
return model;
}
}
model = compilation.GetSemanticModel(tree);
// Invoke GetDiagnostics to populate the compilation's CompilationEvent queue.
......@@ -69,36 +61,6 @@ public bool RemoveCachedSemanticModel(SyntaxTree tree)
return _semanticModelsMap.Remove(tree);
}
}
public bool TryGetCachedDeclaringReferences(ISymbol symbol, out ImmutableArray<SyntaxReference> declaringReferences)
{
lock (_symbolDeclarationsMap)
{
if (!_symbolDeclarationsMap.TryGetValue(symbol, out declaringReferences))
{
declaringReferences = default(ImmutableArray<SyntaxReference>);
return false;
}
return true;
}
}
public void CacheDeclaringReferences(ISymbol symbol, ImmutableArray<SyntaxReference> declaringReferences)
{
lock (_symbolDeclarationsMap)
{
_symbolDeclarationsMap[symbol] = declaringReferences;
}
}
public bool RemoveCachedDeclaringReferences(ISymbol symbol)
{
lock (_symbolDeclarationsMap)
{
return _symbolDeclarationsMap.Remove(symbol);
}
}
}
internal class DeclarationAnalysisData
......@@ -166,24 +128,5 @@ public static bool RemoveCachedSemanticModel(SyntaxTree tree, Compilation compil
return s_compilationDataCache.TryGetValue(compilation, out compilationData) &&
compilationData.RemoveCachedSemanticModel(tree);
}
public static bool TryGetCachedDeclaringReferences(ISymbol symbol, Compilation compilation, out ImmutableArray<SyntaxReference> declaringReferences)
{
var compilationData = GetOrCreateCachedCompilationData(compilation);
return compilationData.TryGetCachedDeclaringReferences(symbol, out declaringReferences);
}
public static void CacheDeclaringReferences(ISymbol symbol, Compilation compilation, ImmutableArray<SyntaxReference> declaringReferences)
{
var compilationData = GetOrCreateCachedCompilationData(compilation);
compilationData.CacheDeclaringReferences(symbol, declaringReferences);
}
public static bool RemoveCachedDeclaringReferences(ISymbol symbol, Compilation compilation)
{
CompilationData compilationData;
return s_compilationDataCache.TryGetValue(compilation, out compilationData) &&
compilationData.RemoveCachedDeclaringReferences(symbol);
}
}
}
\ No newline at end of file
......@@ -1397,24 +1397,9 @@ Namespace Microsoft.CodeAnalysis.VisualBasic.Symbols
Public NotOverridable Overrides ReadOnly Property DeclaringSyntaxReferences As ImmutableArray(Of SyntaxReference)
Get
' PERF: Declaring references are cached for compilations with event queue.
Return If(Me.DeclaringCompilation?.EventQueue IsNot Nothing, GetCachedDeclaringReferences(), ComputeDeclaringReferencesCore())
Return GetDeclaringSyntaxReferenceHelper(SyntaxReferences)
End Get
End Property
Private Function GetCachedDeclaringReferences() As ImmutableArray(Of SyntaxReference)
Dim declaringReferences As ImmutableArray(Of SyntaxReference) = Nothing
If Not Diagnostics.AnalyzerDriver.TryGetCachedDeclaringReferences(Me, DeclaringCompilation, declaringReferences) Then
declaringReferences = ComputeDeclaringReferencesCore()
Diagnostics.AnalyzerDriver.CacheDeclaringReferences(Me, DeclaringCompilation, declaringReferences)
End If
Return declaringReferences
End Function
Private Function ComputeDeclaringReferencesCore() As ImmutableArray(Of SyntaxReference)
Return GetDeclaringSyntaxReferenceHelper(SyntaxReferences)
End Function
#End Region
#Region "Member from Syntax"
......
......@@ -391,21 +391,10 @@ Namespace Microsoft.CodeAnalysis.VisualBasic.Symbols
Public Overrides ReadOnly Property DeclaringSyntaxReferences As ImmutableArray(Of SyntaxReference)
Get
' PERF: Declaring references are cached for compilations with event queue.
Return If(Me.DeclaringCompilation?.EventQueue IsNot Nothing, GetCachedDeclaringReferences(), ComputeDeclaringReferencesCore())
Return ComputeDeclaringReferencesCore()
End Get
End Property
Private Function GetCachedDeclaringReferences() As ImmutableArray(Of SyntaxReference)
Dim declaringReferences As ImmutableArray(Of SyntaxReference) = Nothing
If Not Diagnostics.AnalyzerDriver.TryGetCachedDeclaringReferences(Me, DeclaringCompilation, declaringReferences) Then
declaringReferences = ComputeDeclaringReferencesCore()
Diagnostics.AnalyzerDriver.CacheDeclaringReferences(Me, DeclaringCompilation, declaringReferences)
End If
Return declaringReferences
End Function
Private Function ComputeDeclaringReferencesCore() As ImmutableArray(Of SyntaxReference)
Dim declarations As ImmutableArray(Of SingleNamespaceDeclaration) = _declaration.Declarations
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册