mirror of
https://github.com/github/codeql.git
synced 2026-04-26 17:25:19 +02:00
C#: Force population of compiler generated delegates used for lambdas.
This commit is contained in:
@@ -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)
|
||||
|
||||
Reference in New Issue
Block a user