in ClrHeapAllocationsAnalyzer/TypeConversionAllocationAnalyzer.cs [255:309]
private static void CheckDelegateCreation(SyntaxNode node, TypeInfo typeInfo, SemanticModel semanticModel, bool isAssignmentToReadonly, Action<Diagnostic> reportDiagnostic, Location location, string filePath, CancellationToken cancellationToken)
{
// special case: method groups
if (typeInfo.ConvertedType?.TypeKind == TypeKind.Delegate)
{
// new Action<Foo>(MethodGroup); should skip this one
var insideObjectCreation = node?.Parent?.Parent?.Parent?.Kind() == SyntaxKind.ObjectCreationExpression;
if (node is ParenthesizedLambdaExpressionSyntax || node is SimpleLambdaExpressionSyntax ||
node is AnonymousMethodExpressionSyntax || node is ObjectCreationExpressionSyntax ||
insideObjectCreation)
{
// skip this, because it's intended.
}
else
{
if (node.IsKind(SyntaxKind.IdentifierName))
{
if (semanticModel.GetSymbolInfo(node, cancellationToken).Symbol is IMethodSymbol) {
reportDiagnostic(Diagnostic.Create(MethodGroupAllocationRule, location, EmptyMessageArgs));
HeapAllocationAnalyzerEventSource.Logger.MethodGroupAllocation(filePath);
}
}
else if (node.IsKind(SyntaxKind.SimpleMemberAccessExpression))
{
var memberAccess = node as MemberAccessExpressionSyntax;
if (semanticModel.GetSymbolInfo(memberAccess.Name, cancellationToken).Symbol is IMethodSymbol)
{
if (isAssignmentToReadonly)
{
reportDiagnostic(Diagnostic.Create(ReadonlyMethodGroupAllocationRule, location, EmptyMessageArgs));
HeapAllocationAnalyzerEventSource.Logger.ReadonlyMethodGroupAllocation(filePath);
}
else
{
reportDiagnostic(Diagnostic.Create(MethodGroupAllocationRule, location, EmptyMessageArgs));
HeapAllocationAnalyzerEventSource.Logger.MethodGroupAllocation(filePath);
}
}
}
else if (node is ArrowExpressionClauseSyntax)
{
var arrowClause = node as ArrowExpressionClauseSyntax;
if (semanticModel.GetSymbolInfo(arrowClause.Expression, cancellationToken).Symbol is IMethodSymbol) {
reportDiagnostic(Diagnostic.Create(MethodGroupAllocationRule, location, EmptyMessageArgs));
HeapAllocationAnalyzerEventSource.Logger.MethodGroupAllocation(filePath);
}
}
}
if (IsStructInstanceMethod(node, semanticModel, cancellationToken))
{
reportDiagnostic(Diagnostic.Create(DelegateOnStructInstanceRule, location, EmptyMessageArgs));
}
}
}