using Microsoft.CodeAnalysis.CSharp.Syntax; using Semmle.Extraction.Kinds; using Microsoft.CodeAnalysis.CSharp; using Microsoft.CodeAnalysis; using System.Collections.Generic; using Semmle.Util; using System.Linq; namespace Semmle.Extraction.CSharp.Entities.Expressions { class Lambda : Expression, IStatementParentEntity { bool IStatementParentEntity.IsTopLevelParent => false; protected override void Populate() { } void VisitParameter(ParameterSyntax p) { var symbol = cx.Model(p).GetDeclaredSymbol(p); Parameter.Create(cx, symbol, this); } Lambda(ExpressionNodeInfo info, CSharpSyntaxNode body, IEnumerable @params) : base(info) { // No need to use `Populate` as the population happens later cx.PopulateLater(() => { foreach (var param in @params) VisitParameter(param); if (body is ExpressionSyntax) Create(cx, (ExpressionSyntax)body, this, 0); else if (body is BlockSyntax) Statements.Block.Create(cx, (BlockSyntax)body, this, 0); else cx.ModelError(body, "Unhandled lambda body"); }); } Lambda(ExpressionNodeInfo info, ParenthesizedLambdaExpressionSyntax node) : this(info.SetKind(ExprKind.LAMBDA), node.Body, node.ParameterList.Parameters) { } public static Lambda Create(ExpressionNodeInfo info, ParenthesizedLambdaExpressionSyntax node) => new Lambda(info, node); Lambda(ExpressionNodeInfo info, SimpleLambdaExpressionSyntax node) : this(info.SetKind(ExprKind.LAMBDA), node.Body, Enumerators.Singleton(node.Parameter)) { } public static Lambda Create(ExpressionNodeInfo info, SimpleLambdaExpressionSyntax node) => new Lambda(info, node); Lambda(ExpressionNodeInfo info, AnonymousMethodExpressionSyntax node) : this(info.SetKind(ExprKind.ANONYMOUS_METHOD), node.Body, node.ParameterList == null ? Enumerable.Empty() : node.ParameterList.Parameters) { } public static Lambda Create(ExpressionNodeInfo info, AnonymousMethodExpressionSyntax node) => new Lambda(info, node); } }