in ClrHeapAllocationsAnalyzer/ExplicitAllocationAnalyzer.cs [42:113]
protected override void AnalyzeNode(SyntaxNodeAnalysisContext context)
{
var node = context.Node;
var semanticModel = context.SemanticModel;
Action<Diagnostic> reportDiagnostic = context.ReportDiagnostic;
var cancellationToken = context.CancellationToken;
string filePath = node.SyntaxTree.FilePath;
// An InitializerExpressionSyntax has an ObjectCreationExpressionSyntax as it's parent, i.e
// var testing = new TestClass { Name = "Bob" };
// | |--------------| <- InitializerExpressionSyntax or SyntaxKind.ObjectInitializerExpression
// |----------------------------| <- ObjectCreationExpressionSyntax or SyntaxKind.ObjectCreationExpression
var initializerExpression = node as InitializerExpressionSyntax;
if (initializerExpression?.Parent is ObjectCreationExpressionSyntax)
{
var objectCreation = node.Parent as ObjectCreationExpressionSyntax;
var typeInfo = semanticModel.GetTypeInfo(objectCreation, cancellationToken);
if (typeInfo.ConvertedType?.TypeKind != TypeKind.Error &&
typeInfo.ConvertedType?.IsReferenceType == true &&
objectCreation.Parent?.IsKind(SyntaxKind.EqualsValueClause) == true &&
objectCreation.Parent?.Parent?.IsKind(SyntaxKind.VariableDeclarator) == true)
{
reportDiagnostic(Diagnostic.Create(InitializerCreationRule, ((VariableDeclaratorSyntax)objectCreation.Parent.Parent).Identifier.GetLocation(), EmptyMessageArgs));
HeapAllocationAnalyzerEventSource.Logger.NewInitializerExpression(filePath);
return;
}
}
var implicitArrayExpression = node as ImplicitArrayCreationExpressionSyntax;
if (implicitArrayExpression != null)
{
reportDiagnostic(Diagnostic.Create(ImplicitArrayCreationRule, implicitArrayExpression.NewKeyword.GetLocation(), EmptyMessageArgs));
HeapAllocationAnalyzerEventSource.Logger.NewImplicitArrayCreationExpression(filePath);
return;
}
var newAnon = node as AnonymousObjectCreationExpressionSyntax;
if (newAnon != null)
{
reportDiagnostic(Diagnostic.Create(AnonymousNewObjectRule, newAnon.NewKeyword.GetLocation(), EmptyMessageArgs));
HeapAllocationAnalyzerEventSource.Logger.NewAnonymousObjectCreationExpression(filePath);
return;
}
var newArr = node as ArrayCreationExpressionSyntax;
if (newArr != null)
{
reportDiagnostic(Diagnostic.Create(NewArrayRule, newArr.NewKeyword.GetLocation(), EmptyMessageArgs));
HeapAllocationAnalyzerEventSource.Logger.NewArrayExpression(filePath);
return;
}
var newObj = node as ObjectCreationExpressionSyntax;
if (newObj != null)
{
var typeInfo = semanticModel.GetTypeInfo(newObj, cancellationToken);
if (typeInfo.ConvertedType != null && typeInfo.ConvertedType.TypeKind != TypeKind.Error && typeInfo.ConvertedType.IsReferenceType)
{
reportDiagnostic(Diagnostic.Create(NewObjectRule, newObj.NewKeyword.GetLocation(), EmptyMessageArgs));
HeapAllocationAnalyzerEventSource.Logger.NewObjectCreationExpression(filePath);
}
return;
}
var letKind = node as LetClauseSyntax;
if (letKind != null)
{
reportDiagnostic(Diagnostic.Create(LetCauseRule, letKind.LetKeyword.GetLocation(), EmptyMessageArgs));
HeapAllocationAnalyzerEventSource.Logger.LetClauseExpression(filePath);
return;
}
}