2 // expression.cs: Expression representation for the IL tree.
5 // Miguel de Icaza (miguel@ximian.com)
7 // (C) 2001 Ximian, Inc.
10 using System.Collections;
11 using System.Diagnostics;
14 public abstract class Expression {
24 public bool IsLValue {
34 public virtual bool IsLiteral {
41 // Protected constructor. Only derivate types should
42 // be able to be created
46 protected Expression ()
51 static bool EvaluateType (Expression expr, out string setType)
58 public class Unary : Expression {
59 public enum Operator {
60 Plus, Minus, Negate, BitComplement,
61 Indirection, AddressOf, PreIncrement,
62 PreDecrement, PostIncrement, PostDecrement
68 public Unary (Operator op, Expression expr)
74 public Expression Expr {
84 public Operator Oper {
95 public class Probe : Expression {
100 public enum Operator {
104 public Probe (Operator oper, Expression expr, string type)
111 public Operator Oper {
117 public Expression Expr {
123 public string ProbeType {
131 public class Cast : Expression {
135 public Cast (string type, Expression expr)
141 public string TargetType {
147 public Expression Expr {
157 public class Binary : Expression {
158 public enum Operator {
159 Multiply, Divide, Modulo,
161 ShiftLeft, ShiftRight,
162 LessThan, GreatherThan, LessOrEqual, GreatherOrEqual,
172 Expression left, right;
174 public Binary (Operator oper, Expression left, Expression right)
181 public Operator Oper {
190 public Expression Left {
199 public Expression Right {
209 public class Conditional : Expression {
210 Expression expr, trueExpr, falseExpr;
212 public Conditional (Expression expr, Expression trueExpr, Expression falseExpr)
215 this.trueExpr = trueExpr;
216 this.falseExpr = falseExpr;
219 public Expression Expr {
225 public Expression TrueExpr {
231 public Expression FalseExpr {
238 public class SimpleName : Expression {
241 public SimpleName (string name)
253 public class LocalVariableReference : Expression {
257 public LocalVariableReference (Block block, string name)
276 public class ParameterReference : Expression {
280 public ParameterReference (Parameters pars, string name)
294 // Used for arguments to New(), Invocation()
296 public class Argument {
306 public Argument (Expression expr, AType type)
312 public Expression Expr {
326 // Invocation of methods or delegates.
328 public class Invocation : Expression {
333 // arguments is an ArrayList, but we do not want to typecast,
334 // as it might be null.
336 // FIXME: only allow expr to be a method invocation or a
337 // delegate invocation (7.5.5)
339 public Invocation (Expression expr, ArrayList arguments)
342 this.arguments = arguments;
345 public Expression Expr {
351 public ArrayList Arguments {
358 public class New : Expression {
360 string requested_type;
362 public New (string requested_type, ArrayList arguments)
364 this.requested_type = requested_type;
365 this.arguments = arguments;
368 public ArrayList Arguments{
374 public string RequestedType {
376 return requested_type;
381 public class This : Expression {
384 public class TypeOf : Expression {
387 public TypeOf (string queried_type)
389 this.queried_type = queried_type;
392 public string QueriedType {
399 public class SizeOf : Expression {
402 public SizeOf (string queried_type)
404 this.queried_type = queried_type;
407 public string QueriedType {
414 public class MemberAccess : Expression {
418 public MemberAccess (Expression expr, string id)
424 public Expression Expr {
430 public string Identifier {
437 public class BuiltinTypeAccess : Expression {
441 public BuiltinTypeAccess (string type, string method)
443 System.Console.WriteLine ("DUDE! This type should be fully resolved!");
444 this.access_base = access_base;
445 this.method = method;
448 public string AccessBase {
454 public string Method {
461 public class MethodGroup : Expression {
462 Hashtable signatures;
465 public MethodGroup (string name)
467 signatures = new Hashtable ();
471 public bool Add (Method method)
473 string sig = method.ArgumentSignature;
475 if (signatures.Contains (sig))
478 signatures.Add (sig, method);
488 public Hashtable Methods {