C#: Clear TRAP stack when calling PopulateGenerics

This commit is contained in:
Tom Hvitved
2023-09-05 21:19:34 +02:00
parent 334502a3de
commit 718e491800
4 changed files with 48 additions and 42 deletions

View File

@@ -250,41 +250,44 @@ namespace Semmle.Extraction.CSharp.Entities
/// </summary>
public void PopulateGenerics()
{
if (Symbol is null || !NeedsPopulation || !Context.ExtractGenerics(this))
return;
var members = new List<ISymbol>();
foreach (var member in Symbol.GetMembers())
members.Add(member);
foreach (var member in Symbol.GetTypeMembers())
members.Add(member);
// Mono extractor puts all BASE interface members as members of the current interface.
if (Symbol.TypeKind == TypeKind.Interface)
Context.PopulateLater(() =>
{
foreach (var baseInterface in Symbol.Interfaces)
if (Symbol is null || !NeedsPopulation || !Context.ExtractGenerics(this))
return;
var members = new List<ISymbol>();
foreach (var member in Symbol.GetMembers())
members.Add(member);
foreach (var member in Symbol.GetTypeMembers())
members.Add(member);
// Mono extractor puts all BASE interface members as members of the current interface.
if (Symbol.TypeKind == TypeKind.Interface)
{
foreach (var member in baseInterface.GetMembers())
members.Add(member);
foreach (var member in baseInterface.GetTypeMembers())
members.Add(member);
foreach (var baseInterface in Symbol.Interfaces)
{
foreach (var member in baseInterface.GetMembers())
members.Add(member);
foreach (var member in baseInterface.GetTypeMembers())
members.Add(member);
}
}
}
foreach (var member in members)
{
Context.CreateEntity(member);
}
foreach (var member in members)
{
Context.CreateEntity(member);
}
if (Symbol.BaseType is not null)
Create(Context, Symbol.BaseType).PopulateGenerics();
if (Symbol.BaseType is not null)
Create(Context, Symbol.BaseType).PopulateGenerics();
foreach (var i in Symbol.Interfaces)
{
Create(Context, i).PopulateGenerics();
}
foreach (var i in Symbol.Interfaces)
{
Create(Context, i).PopulateGenerics();
}
}, preserveDuplicationKey: false);
}
public void ExtractRecursive(TextWriter trapFile, IEntity parent)