in ClrHeapAllocationsAnalyzer/CallSiteImplicitAllocationAnalyzer.cs [25:67]
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;
if (semanticModel.GetOperation(node, cancellationToken) is not IInvocationOperation invocationOperation)
{
return;
}
var targetMethod = invocationOperation.TargetMethod;
if (targetMethod.IsOverride)
{
CheckNonOverridenMethodOnStruct(targetMethod, reportDiagnostic, node, filePath);
}
bool compilationHasSystemArrayEmpty = !semanticModel.Compilation.GetSpecialType(SpecialType.System_Array).GetMembers("Empty").IsEmpty;
// Loop on every argument because params argument may not be the last one.
// static void Fun1() => Fun2(args: "", i: 5);
// static void Fun2(int i = 0, params object[] args) {}
foreach (var argument in invocationOperation.Arguments)
{
if (argument.ArgumentKind != ArgumentKind.ParamArray)
{
continue;
}
bool isEmpty = (argument.Value as IArrayCreationOperation)?.Initializer.ElementValues.IsEmpty == true;
// Up to net45 the System.Array.Empty<T> singleton didn't existed so an empty params array was still causing some memory allocation.
if (argument.IsImplicit && (!isEmpty || !compilationHasSystemArrayEmpty))
{
reportDiagnostic(Diagnostic.Create(ParamsParameterRule, node.GetLocation(), EmptyMessageArgs));
}
break;
}
}