mirror of
https://github.com/github/codeql.git
synced 2025-12-17 17:23:36 +01:00
53 lines
2.1 KiB
C#
53 lines
2.1 KiB
C#
using System.IO;
|
|
using Microsoft.CodeAnalysis;
|
|
using Microsoft.CodeAnalysis.CSharp;
|
|
using Microsoft.CodeAnalysis.CSharp.Syntax;
|
|
using Semmle.Extraction.Kinds;
|
|
|
|
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, isCompilerGenerated: 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++, isCompilerGenerated: 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, isCompilerGenerated: false, null));
|
|
trapFile.expr_access(access, propEntity);
|
|
}
|
|
}
|
|
}
|
|
}
|