Skip to content
This repository was archived by the owner on Apr 20, 2026. It is now read-only.

Commit 4000015

Browse files
Bart KoelmanBart Koelman
authored andcommitted
Performance: reuse existing semantic model on newer versions of Microsoft.CodeAnalysis
1 parent 229e34c commit 4000015

4 files changed

Lines changed: 23 additions & 7 deletions

File tree

src/CSharpGuidelinesAnalyzer/CSharpGuidelinesAnalyzer/Extensions/OperationExtensions.cs

Lines changed: 18 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,6 @@
1-
using System.Linq;
1+
using System;
2+
using System.Linq;
3+
using System.Reflection;
24
using System.Threading;
35
using JetBrains.Annotations;
46
using Microsoft.CodeAnalysis;
@@ -11,6 +13,9 @@ namespace CSharpGuidelinesAnalyzer.Extensions
1113
/// <summary />
1214
internal static class OperationExtensions
1315
{
16+
[CanBeNull]
17+
private static readonly PropertyInfo OperationSemanticModelProperty = typeof(IOperation).GetRuntimeProperty("SemanticModel");
18+
1419
[CanBeNull]
1520
public static IdentifierInfo TryGetIdentifierInfo([CanBeNull] this IOperation identifier)
1621
{
@@ -176,6 +181,18 @@ public static IMethodSymbol TryGetContainingMethod([NotNull] this IOperation ope
176181
return model.GetEnclosingSymbol(operation.Syntax.GetLocation().SourceSpan.Start) as IMethodSymbol;
177182
}
178183

184+
[NotNull]
185+
public static SemanticModel GetSemanticModel([NotNull] this IOperation operation, [NotNull] Compilation compilation)
186+
{
187+
if (OperationSemanticModelProperty != null)
188+
{
189+
object[] emptyArray = Array.Empty<object>();
190+
return (SemanticModel)OperationSemanticModelProperty.GetMethod.Invoke(operation, emptyArray);
191+
}
192+
193+
return compilation.GetSemanticModel(operation.Syntax.SyntaxTree);
194+
}
195+
179196
private sealed class IdentifierVisitor : OperationVisitor<object, IdentifierInfo>
180197
{
181198
[NotNull]

src/CSharpGuidelinesAnalyzer/CSharpGuidelinesAnalyzer/Rules/MiscellaneousDesign/DoNotPassNullOnEventInvocationAnalyzer.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -114,7 +114,7 @@ private static void AnalyzeEventInvocation([NotNull] IInvocationOperation invoca
114114
{
115115
if (operation is IConditionalAccessInstanceOperation)
116116
{
117-
SemanticModel model = compilation.GetSemanticModel(operation.Syntax.SyntaxTree);
117+
SemanticModel model = operation.GetSemanticModel(compilation);
118118

119119
if (model.GetSymbolInfo(operation.Syntax).Symbol is IEventSymbol eventSymbol)
120120
{

src/CSharpGuidelinesAnalyzer/CSharpGuidelinesAnalyzer/Rules/MiscellaneousDesign/RaiseEventFromProtectedVirtualMethodAnalyzer.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -97,7 +97,7 @@ private static IEventSymbol TryGetEventForNullConditionalAccessInvocation([NotNu
9797
{
9898
if (operation is IConditionalAccessInstanceOperation)
9999
{
100-
SemanticModel model = compilation.GetSemanticModel(operation.Syntax.SyntaxTree);
100+
SemanticModel model = operation.GetSemanticModel(compilation);
101101
return model.GetSymbolInfo(operation.Syntax, cancellationToken).Symbol as IEventSymbol;
102102
}
103103

src/CSharpGuidelinesAnalyzer/CSharpGuidelinesAnalyzer/Rules/Naming/UseUnderscoreForUnusedLambdaParameterAnalyzer.cs

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -69,7 +69,7 @@ private static void AnalyzeAnonymousFunction(SyntaxNodeAnalysisContext context)
6969
private static void AnalyzeParameterUsage([ItemNotNull] ImmutableArray<IParameterSymbol> parameters, [NotNull] SyntaxNode bodySyntax,
7070
SyntaxNodeAnalysisContext context)
7171
{
72-
DataFlowAnalysis dataFlowAnalysis = TryAnalyzeDataFlow(bodySyntax, context.Compilation);
72+
DataFlowAnalysis dataFlowAnalysis = TryAnalyzeDataFlow(bodySyntax, context.SemanticModel);
7373

7474
if (dataFlowAnalysis == null)
7575
{
@@ -107,10 +107,9 @@ private static bool ConsistsOfUnderscoresOnly([NotNull] string identifierName)
107107
}
108108

109109
[CanBeNull]
110-
private static DataFlowAnalysis TryAnalyzeDataFlow([NotNull] SyntaxNode bodySyntax, [NotNull] Compilation compilation)
110+
private static DataFlowAnalysis TryAnalyzeDataFlow([NotNull] SyntaxNode bodySyntax, [NotNull] SemanticModel semanticModel)
111111
{
112-
SemanticModel model = compilation.GetSemanticModel(bodySyntax.SyntaxTree);
113-
return model.SafeAnalyzeDataFlow(bodySyntax);
112+
return semanticModel.SafeAnalyzeDataFlow(bodySyntax);
114113
}
115114

116115
private static bool IsParameterUsed([NotNull] IParameterSymbol parameter, [NotNull] DataFlowAnalysis dataFlowAnalysis)

0 commit comments

Comments
 (0)