using System;
using System.Collections.ObjectModel;
using System.Text;
namespace System.Linq.Expressions
{
// Token: 0x0200001D RID: 29
internal class ExpressionPrinter : ExpressionVisitor
{
// Token: 0x060001AC RID: 428 RVA: 0x00009E64 File Offset: 0x00008064
private ExpressionPrinter(StringBuilder builder)
{
this.builder = builder;
}
// Token: 0x060001AD RID: 429 RVA: 0x00009E74 File Offset: 0x00008074
private ExpressionPrinter()
: this(new StringBuilder())
{
}
// Token: 0x060001AE RID: 430 RVA: 0x00009E84 File Offset: 0x00008084
public static string ToString(Expression expression)
{
ExpressionPrinter expressionPrinter = new ExpressionPrinter();
expressionPrinter.Visit(expression);
return expressionPrinter.builder.ToString();
}
// Token: 0x060001AF RID: 431 RVA: 0x00009EAC File Offset: 0x000080AC
public static string ToString(ElementInit init)
{
ExpressionPrinter expressionPrinter = new ExpressionPrinter();
expressionPrinter.VisitElementInitializer(init);
return expressionPrinter.builder.ToString();
}
// Token: 0x060001B0 RID: 432 RVA: 0x00009ED4 File Offset: 0x000080D4
public static string ToString(MemberBinding binding)
{
ExpressionPrinter expressionPrinter = new ExpressionPrinter();
expressionPrinter.VisitBinding(binding);
return expressionPrinter.builder.ToString();
}
// Token: 0x060001B1 RID: 433 RVA: 0x00009EFC File Offset: 0x000080FC
private void Print(string str)
{
this.builder.Append(str);
}
// Token: 0x060001B2 RID: 434 RVA: 0x00009F0C File Offset: 0x0000810C
private void Print(object obj)
{
this.builder.Append(obj);
}
// Token: 0x060001B3 RID: 435 RVA: 0x00009F1C File Offset: 0x0000811C
private void Print(string str, params object[] objs)
{
this.builder.AppendFormat(str, objs);
}
// Token: 0x060001B4 RID: 436 RVA: 0x00009F2C File Offset: 0x0000812C
protected override void VisitElementInitializer(ElementInit initializer)
{
this.Print(initializer.AddMethod);
this.Print("(");
this.VisitExpressionList(initializer.Arguments);
this.Print(")");
}
// Token: 0x060001B5 RID: 437 RVA: 0x00009F68 File Offset: 0x00008168
protected override void VisitUnary(UnaryExpression unary)
{
ExpressionType nodeType = unary.NodeType;
if (nodeType != ExpressionType.Convert && nodeType != ExpressionType.ConvertChecked)
{
if (nodeType == ExpressionType.Negate)
{
this.Print("-");
this.Visit(unary.Operand);
return;
}
if (nodeType == ExpressionType.UnaryPlus)
{
this.Print("+");
this.Visit(unary.Operand);
return;
}
if (nodeType != ExpressionType.ArrayLength && nodeType != ExpressionType.Not)
{
if (nodeType == ExpressionType.Quote)
{
this.Visit(unary.Operand);
return;
}
if (nodeType != ExpressionType.TypeAs)
{
throw new NotImplementedException();
}
this.Print("(");
this.Visit(unary.Operand);
this.Print(" As {0})", new object[] { unary.Type.Name });
return;
}
}
this.Print("{0}(", new object[] { unary.NodeType });
this.Visit(unary.Operand);
this.Print(")");
}
// Token: 0x060001B6 RID: 438 RVA: 0x0000A070 File Offset: 0x00008270
private static string OperatorToString(BinaryExpression binary)
{
switch (binary.NodeType)
{
case ExpressionType.Add:
case ExpressionType.AddChecked:
return "+";
case ExpressionType.And:
return (!ExpressionPrinter.IsBoolean(binary)) ? "&" : "And";
case ExpressionType.AndAlso:
return "&&";
case ExpressionType.Coalesce:
return "??";
case ExpressionType.Divide:
return "/";
case ExpressionType.Equal:
return "=";
case ExpressionType.ExclusiveOr:
return "^";
case ExpressionType.GreaterThan:
return ">";
case ExpressionType.GreaterThanOrEqual:
return ">=";
case ExpressionType.LeftShift:
return "<<";
case ExpressionType.LessThan:
return "<";
case ExpressionType.LessThanOrEqual:
return "<=";
case ExpressionType.Modulo:
return "%";
case ExpressionType.Multiply:
case ExpressionType.MultiplyChecked:
return "*";
case ExpressionType.NotEqual:
return "!=";
case ExpressionType.Or:
return (!ExpressionPrinter.IsBoolean(binary)) ? "|" : "Or";
case ExpressionType.OrElse:
return "||";
case ExpressionType.Power:
return "^";
case ExpressionType.RightShift:
return ">>";
case ExpressionType.Subtract:
case ExpressionType.SubtractChecked:
return "-";
}
return null;
}
// Token: 0x060001B7 RID: 439 RVA: 0x0000A1E4 File Offset: 0x000083E4
private static bool IsBoolean(Expression expression)
{
return expression.Type == typeof(bool) || expression.Type == typeof(bool?);
}
// Token: 0x060001B8 RID: 440 RVA: 0x0000A21C File Offset: 0x0000841C
private void PrintArrayIndex(BinaryExpression index)
{
this.Visit(index.Left);
this.Print("[");
this.Visit(index.Right);
this.Print("]");
}
// Token: 0x060001B9 RID: 441 RVA: 0x0000A258 File Offset: 0x00008458
protected override void VisitBinary(BinaryExpression binary)
{
ExpressionType nodeType = binary.NodeType;
if (nodeType != ExpressionType.ArrayIndex)
{
this.Print("(");
this.Visit(binary.Left);
this.Print(" {0} ", new object[] { ExpressionPrinter.OperatorToString(binary) });
this.Visit(binary.Right);
this.Print(")");
return;
}
this.PrintArrayIndex(binary);
}
// Token: 0x060001BA RID: 442 RVA: 0x0000A2C8 File Offset: 0x000084C8
protected override void VisitTypeIs(TypeBinaryExpression type)
{
ExpressionType nodeType = type.NodeType;
if (nodeType != ExpressionType.TypeIs)
{
throw new NotImplementedException();
}
this.Print("(");
this.Visit(type.Expression);
this.Print(" Is {0})", new object[] { type.TypeOperand.Name });
}
// Token: 0x060001BB RID: 443 RVA: 0x0000A328 File Offset: 0x00008528
protected override void VisitConstant(ConstantExpression constant)
{
object value = constant.Value;
if (value == null)
{
this.Print("null");
}
else if (value is string)
{
this.Print("\"");
this.Print(value);
this.Print("\"");
}
else if (!ExpressionPrinter.HasStringRepresentation(value))
{
this.Print("value(");
this.Print(value);
this.Print(")");
}
else
{
this.Print(value);
}
}
// Token: 0x060001BC RID: 444 RVA: 0x0000A3B4 File Offset: 0x000085B4
private static bool HasStringRepresentation(object obj)
{
return obj.ToString() != obj.GetType().ToString();
}
// Token: 0x060001BD RID: 445 RVA: 0x0000A3D8 File Offset: 0x000085D8
protected override void VisitConditional(ConditionalExpression conditional)
{
this.Print("IIF(");
this.Visit(conditional.Test);
this.Print(", ");
this.Visit(conditional.IfTrue);
this.Print(", ");
this.Visit(conditional.IfFalse);
this.Print(")");
}
// Token: 0x060001BE RID: 446 RVA: 0x0000A438 File Offset: 0x00008638
protected override void VisitParameter(ParameterExpression parameter)
{
this.Print(parameter.Name ?? "");
}
// Token: 0x060001BF RID: 447 RVA: 0x0000A454 File Offset: 0x00008654
protected override void VisitMemberAccess(MemberExpression access)
{
if (access.Expression == null)
{
this.Print(access.Member.DeclaringType.Name);
}
else
{
this.Visit(access.Expression);
}
this.Print(".{0}", new object[] { access.Member.Name });
}
// Token: 0x060001C0 RID: 448 RVA: 0x0000A4B4 File Offset: 0x000086B4
protected override void VisitMethodCall(MethodCallExpression call)
{
if (call.Object != null)
{
this.Visit(call.Object);
this.Print(".");
}
this.Print(call.Method.Name);
this.Print("(");
this.VisitExpressionList(call.Arguments);
this.Print(")");
}
// Token: 0x060001C1 RID: 449 RVA: 0x0000A518 File Offset: 0x00008718
protected override void VisitMemberAssignment(MemberAssignment assignment)
{
this.Print("{0} = ", new object[] { assignment.Member.Name });
this.Visit(assignment.Expression);
}
// Token: 0x060001C2 RID: 450 RVA: 0x0000A550 File Offset: 0x00008750
protected override void VisitMemberMemberBinding(MemberMemberBinding binding)
{
this.Print(binding.Member.Name);
this.Print(" = {");
this.VisitList(binding.Bindings, new Action(this.VisitBinding));
this.Print("}");
}
// Token: 0x060001C3 RID: 451 RVA: 0x0000A5A0 File Offset: 0x000087A0
protected override void VisitMemberListBinding(MemberListBinding binding)
{
this.Print(binding.Member.Name);
this.Print(" = {");
this.VisitList(binding.Initializers, new Action(this.VisitElementInitializer));
this.Print("}");
}
// Token: 0x060001C4 RID: 452 RVA: 0x0000A5F0 File Offset: 0x000087F0
protected override void VisitList(ReadOnlyCollection list, Action visitor)
{
for (int i = 0; i < list.Count; i++)
{
if (i > 0)
{
this.Print(", ");
}
visitor(list[i]);
}
}
// Token: 0x060001C5 RID: 453 RVA: 0x0000A634 File Offset: 0x00008834
protected override void VisitLambda(LambdaExpression lambda)
{
if (lambda.Parameters.Count != 1)
{
this.Print("(");
this.VisitList(lambda.Parameters, new Action(this.Visit));
this.Print(")");
}
else
{
this.Visit(lambda.Parameters[0]);
}
this.Print(" => ");
this.Visit(lambda.Body);
}
// Token: 0x060001C6 RID: 454 RVA: 0x0000A6B0 File Offset: 0x000088B0
protected override void VisitNew(NewExpression nex)
{
this.Print("new {0}(", new object[] { nex.Type.Name });
if (nex.Members != null && nex.Members.Count > 0)
{
for (int i = 0; i < nex.Members.Count; i++)
{
if (i > 0)
{
this.Print(", ");
}
this.Print("{0} = ", new object[] { nex.Members[i].Name });
this.Visit(nex.Arguments[i]);
}
}
else
{
this.VisitExpressionList(nex.Arguments);
}
this.Print(")");
}
// Token: 0x060001C7 RID: 455 RVA: 0x0000A77C File Offset: 0x0000897C
protected override void VisitMemberInit(MemberInitExpression init)
{
this.Visit(init.NewExpression);
this.Print(" {");
this.VisitList(init.Bindings, new Action(this.VisitBinding));
this.Print("}");
}
// Token: 0x060001C8 RID: 456 RVA: 0x0000A7C4 File Offset: 0x000089C4
protected override void VisitListInit(ListInitExpression init)
{
this.Visit(init.NewExpression);
this.Print(" {");
this.VisitList(init.Initializers, new Action(this.VisitElementInitializer));
this.Print("}");
}
// Token: 0x060001C9 RID: 457 RVA: 0x0000A80C File Offset: 0x00008A0C
protected override void VisitNewArray(NewArrayExpression newArray)
{
this.Print("new ");
ExpressionType nodeType = newArray.NodeType;
if (nodeType == ExpressionType.NewArrayInit)
{
this.Print("[] {");
this.VisitExpressionList(newArray.Expressions);
this.Print("}");
return;
}
if (nodeType != ExpressionType.NewArrayBounds)
{
throw new NotSupportedException();
}
this.Print(newArray.Type);
this.Print("(");
this.VisitExpressionList(newArray.Expressions);
this.Print(")");
}
// Token: 0x060001CA RID: 458 RVA: 0x0000A898 File Offset: 0x00008A98
protected override void VisitInvocation(InvocationExpression invocation)
{
this.Print("Invoke(");
this.Visit(invocation.Expression);
if (invocation.Arguments.Count != 0)
{
this.Print(", ");
this.VisitExpressionList(invocation.Arguments);
}
this.Print(")");
}
// Token: 0x04000074 RID: 116
private const string ListSeparator = ", ";
// Token: 0x04000075 RID: 117
private StringBuilder builder;
}
}