C#: Force population of compiler generated delegates used for lambdas.

This commit is contained in:
Michael Nebel
2024-01-09 14:39:33 +01:00
parent 9a64e2a9b0
commit e18534e748

View File

@@ -18,7 +18,12 @@ namespace Semmle.Extraction.CSharp.Entities
public IMethodSymbol SourceDeclaration => Symbol.OriginalDefinition;
public override Microsoft.CodeAnalysis.Location ReportingLocation => Symbol.GetSymbolLocation();
public override Microsoft.CodeAnalysis.Location ReportingLocation =>
IsCompilerGeneratedDelegate()
? Symbol.ContainingType.GetSymbolLocation()
: Symbol.GetSymbolLocation();
public override bool NeedsPopulation => base.NeedsPopulation || IsCompilerGeneratedDelegate();
public override void Populate(TextWriter trapFile)
{
@@ -47,6 +52,18 @@ namespace Semmle.Extraction.CSharp.Entities
ExtractCompilerGenerated(trapFile);
}
private bool IsCompilerGeneratedDelegate()
{
// Lambdas with parameter defaults or a `params` parameter are implemented
// using compiler generated delegate types.
if (Symbol.MethodKind == MethodKind.DelegateInvoke &&
Symbol.ContainingType is INamedTypeSymbol nt)
{
return nt.TypeKind == TypeKind.Delegate && nt.IsImplicitlyDeclared;
}
return false;
}
public static new OrdinaryMethod Create(Context cx, IMethodSymbol method)
{
if (method.MethodKind == MethodKind.ReducedExtension)