in ClrHeapAllocationsAnalyzer/TypeConversionAllocationAnalyzer.cs [150:177]
private static void BinaryExpressionCheck(SyntaxNode node, SemanticModel semanticModel, bool isAssignmentToReadonly, Action<Diagnostic> reportDiagnostic, string filePath, CancellationToken cancellationToken)
{
var binaryExpression = node as BinaryExpressionSyntax;
// as expression
if (binaryExpression.IsKind(SyntaxKind.AsExpression) && binaryExpression.Left != null && binaryExpression.Right != null)
{
var leftT = semanticModel.GetTypeInfo(binaryExpression.Left, cancellationToken);
var rightT = semanticModel.GetTypeInfo(binaryExpression.Right, cancellationToken);
if (leftT.Type?.IsValueType == true && rightT.Type?.IsReferenceType == true)
{
reportDiagnostic(Diagnostic.Create(ValueTypeToReferenceTypeConversionRule, binaryExpression.Left.GetLocation(), EmptyMessageArgs));
HeapAllocationAnalyzerEventSource.Logger.BoxingAllocation(filePath);
}
return;
}
if (binaryExpression.Right != null)
{
var assignmentExprTypeInfo = semanticModel.GetTypeInfo(binaryExpression.Right, cancellationToken);
var assignmentExprConversionInfo = semanticModel.GetConversion(binaryExpression.Right, cancellationToken);
CheckTypeConversion(assignmentExprConversionInfo, reportDiagnostic, binaryExpression.Right.GetLocation(), filePath);
CheckDelegateCreation(binaryExpression.Right, assignmentExprTypeInfo, semanticModel, isAssignmentToReadonly, reportDiagnostic, binaryExpression.Right.GetLocation(), filePath, cancellationToken);
return;
}
}