EXPRExtensions
using System;
using System.Collections.Generic;
namespace Microsoft.CSharp.RuntimeBinder.Semantics
{
internal static class EXPRExtensions
{
public static Expr Map(this Expr expr, Func<Expr, Expr> f)
{
if (expr == null)
return f(null);
Expr first = null;
Expr last = null;
foreach (Expr item in expr.ToEnumerable()) {
Expr newItem = f(item);
ExprFactory.AppendItemToList(newItem, ref first, ref last);
}
return first;
}
public static IEnumerable<Expr> ToEnumerable(this Expr expr)
{
Expr expr2 = expr;
while (true) {
if (expr2 == null)
yield break;
ExprList list = expr2 as ExprList;
if (list == null)
break;
yield return list.OptionalElement;
expr2 = list.OptionalNextListNode;
}
yield return expr2;
}
public static bool isLvalue(this Expr expr)
{
if (expr != null)
return (expr.Flags & EXPRFLAG.EXF_LVALUE) != (EXPRFLAG)0;
return false;
}
public static bool isChecked(this Expr expr)
{
if (expr != null)
return (expr.Flags & EXPRFLAG.EXF_CHECKOVERFLOW) != (EXPRFLAG)0;
return false;
}
public static bool isNull(this Expr expr)
{
ExprConstant exprConstant = expr as ExprConstant;
if (exprConstant != null && expr.Type.FundamentalType == FUNDTYPE.FT_REF)
return exprConstant.Val.IsNullRef;
return false;
}
public static bool IsZero(this Expr expr)
{
return (expr as ExprConstant)?.IsZero ?? false;
}
private static Expr GetSeqVal(this Expr expr)
{
if (expr == null)
return null;
Expr expr2 = expr;
while (expr2.Kind == ExpressionKind.Sequence) {
expr2 = ((ExprBinOp)expr2).OptionalRightChild;
}
return expr2;
}
public static Expr GetConst(this Expr expr)
{
Expr seqVal = expr.GetSeqVal();
ExpressionKind? nullable = seqVal?.Kind;
if (nullable.HasValue) {
ExpressionKind valueOrDefault = nullable.GetValueOrDefault();
if (valueOrDefault == ExpressionKind.Constant || valueOrDefault == ExpressionKind.ZeroInit)
return seqVal;
}
return null;
}
}
}