Files
codeql/csharp/extractor/Semmle.Extraction.CSharp/Entities/Expressions/ObjectCreation/AnonymousObjectCreation.cs
2021-03-05 16:28:12 +01:00

54 lines
2.1 KiB
C#

using Microsoft.CodeAnalysis;
using Microsoft.CodeAnalysis.CSharp;
using Microsoft.CodeAnalysis.CSharp.Syntax;
using Semmle.Extraction.Entities;
using Semmle.Extraction.Kinds;
using System.IO;
namespace Semmle.Extraction.CSharp.Entities.Expressions
{
internal class AnonymousObjectCreation : Expression<AnonymousObjectCreationExpressionSyntax>
{
public AnonymousObjectCreation(ExpressionNodeInfo info)
: base(info.SetKind(ExprKind.OBJECT_CREATION)) { }
public static Expression Create(ExpressionNodeInfo info) =>
new AnonymousObjectCreation(info).TryPopulate();
protected override void PopulateExpression(TextWriter trapFile)
{
var target = Context.GetSymbolInfo(Syntax);
var method = (IMethodSymbol?)target.Symbol;
if (method is not null)
{
trapFile.expr_call(this, Method.Create(Context, method));
}
var child = 0;
if (!Syntax.Initializers.Any())
{
return;
}
var objectInitializer = new Expression(new ExpressionInfo(Context, Type, Location, ExprKind.OBJECT_INIT, this, -1, false, null));
foreach (var init in Syntax.Initializers)
{
// Create an "assignment"
var property = Context.GetModel(init).GetDeclaredSymbol(init)!;
var propEntity = Property.Create(Context, property);
var type = property.GetAnnotatedType();
var loc = Context.CreateLocation(init.GetLocation());
var assignment = new Expression(new ExpressionInfo(Context, type, loc, ExprKind.SIMPLE_ASSIGN, objectInitializer, child++, false, null));
Create(Context, init.Expression, assignment, 0);
Property.Create(Context, property);
var access = new Expression(new ExpressionInfo(Context, type, loc, ExprKind.PROPERTY_ACCESS, assignment, 1, false, null));
trapFile.expr_access(access, propEntity);
}
}
}
}