// // expression.cs: Expression representation for the IL tree. // // Author: // Miguel de Icaza (miguel@ximian.com) // // (C) 2001 Ximian, Inc. // namespace CIR { using System.Collections; using System.Diagnostics; using System; // // The ExprClass class contains the is used to pass the // classification of an expression (value, variable, namespace, // type, method group, property access, event access, indexer access, // nothing). // public enum ExprClass { Invalid, Value, Variable, Namespace, Type, MethodGroup, PropertyAccess, EventAccess, IndexerAccess, Nothing, } // // Base class for expressions // public abstract class Expression { protected ExprClass eclass; protected Type type; public Type Type { get { return type; } set { type = value; } } public ExprClass ExprClass { get { return eclass; } set { eclass = value; } } public abstract void Resolve (TypeContainer tc); public abstract void Emit (EmitContext ec); // // Protected constructor. Only derivate types should // be able to be created // protected Expression () { eclass = ExprClass.Invalid; type = null; } } public class Unary : Expression { public enum Operator { Plus, Minus, Negate, BitComplement, Indirection, AddressOf, PreIncrement, PreDecrement, PostIncrement, PostDecrement } Operator oper; Expression expr; public Unary (Operator op, Expression expr) { this.oper = op; this.expr = expr; } public Expression Expr { get { return expr; } set { expr = value; } } public Operator Oper { get { return oper; } set { oper = value; } } public override void Resolve (TypeContainer tc) { // FIXME: Implement; } public override void Emit (EmitContext ec) { } } public class Probe : Expression { string probe_type; Expression expr; Operator oper; public enum Operator { Is, As } public Probe (Operator oper, Expression expr, string probe_type) { this.oper = oper; this.probe_type = probe_type; this.expr = expr; } public Operator Oper { get { return oper; } } public Expression Expr { get { return expr; } } public string ProbeType { get { return probe_type; } } public override void Resolve (TypeContainer tc) { // FIXME: Implement; } public override void Emit (EmitContext ec) { } } public class Cast : Expression { string target_type; Expression expr; public Cast (string cast_type, Expression expr) { this.target_type = target_type; this.expr = expr; } public string TargetType { get { return target_type; } } public Expression Expr { get { return expr; } set { expr = value; } } public override void Resolve (TypeContainer tc) { // FIXME: Implement; } public override void Emit (EmitContext ec) { } } public class Binary : Expression { public enum Operator { Multiply, Divide, Modulo, Add, Substract, ShiftLeft, ShiftRight, LessThan, GreatherThan, LessOrEqual, GreatherOrEqual, Equal, NotEqual, BitwiseAnd, ExclusiveOr, BitwiseOr, LogicalAnd, LogicalOr } Operator oper; Expression left, right; public Binary (Operator oper, Expression left, Expression right) { this.oper = oper; this.left = left; this.right = right; } public Operator Oper { get { return oper; } set { oper = value; } } public Expression Left { get { return left; } set { left = value; } } public Expression Right { get { return right; } set { right = value; } } public override void Resolve (TypeContainer tc) { } public override void Emit (EmitContext ec) { } } public class Conditional : Expression { Expression expr, trueExpr, falseExpr; public Conditional (Expression expr, Expression trueExpr, Expression falseExpr) { this.expr = expr; this.trueExpr = trueExpr; this.falseExpr = falseExpr; } public Expression Expr { get { return expr; } } public Expression TrueExpr { get { return trueExpr; } } public Expression FalseExpr { get { return falseExpr; } } public override void Resolve (TypeContainer tc) { // FIXME: Implement; } public override void Emit (EmitContext ec) { } } public class SimpleName : Expression { string name; public SimpleName (string name) { this.name = name; } public string Name { get { return name; } } public override void Resolve (TypeContainer tc) { // FIXME: Implement; } public override void Emit (EmitContext ec) { } } public class LocalVariableReference : Expression { string name; Block block; public LocalVariableReference (Block block, string name) { this.block = block; this.name = name; } public Block Block { get { return block; } } public string Name { get { return name; } } public override void Resolve (TypeContainer tc) { // FIXME: Implement; } public override void Emit (EmitContext ec) { } } public class ParameterReference : Expression { Parameters pars; string name; public ParameterReference (Parameters pars, string name) { this.pars = pars; this.name = name; } public string Name { get { return name; } } public override void Resolve (TypeContainer tc) { // FIXME: Implement; } public override void Emit (EmitContext ec) { } } // // Used for arguments to New(), Invocation() // public class Argument { public enum AType { Expression, Ref, Out }; public readonly AType Type; Expression expr; public Argument (Expression expr, AType type) { this.expr = expr; this.Type = type; } public Expression Expr { get { return expr; } } } // // Invocation of methods or delegates. // public class Invocation : Expression { public readonly ArrayList Arguments; Expression expr; // // arguments is an ArrayList, but we do not want to typecast, // as it might be null. // // FIXME: only allow expr to be a method invocation or a // delegate invocation (7.5.5) // public Invocation (Expression expr, ArrayList arguments) { this.expr = expr; Arguments = arguments; } public Expression Expr { get { return expr; } } public override void Resolve (TypeContainer tc) { // FIXME: Implement; } public override void Emit (EmitContext ec) { } } public class New : Expression { public readonly ArrayList Arguments; public readonly string RequestedType; public New (string requested_type, ArrayList arguments) { RequestedType = requested_type; Arguments = arguments; } public override void Resolve (TypeContainer tc) { // FIXME: Implement; } public override void Emit (EmitContext ec) { } } public class This : Expression { public override void Resolve (TypeContainer tc) { // FIXME: Implement; } public override void Emit (EmitContext ec) { } } public class TypeOf : Expression { public readonly string QueriedType; public TypeOf (string queried_type) { QueriedType = queried_type; } public override void Resolve (TypeContainer tc) { // FIXME: Implement; } public override void Emit (EmitContext ec) { } } public class SizeOf : Expression { public readonly string QueriedType; public SizeOf (string queried_type) { this.QueriedType = queried_type; } public override void Resolve (TypeContainer tc) { // FIXME: Implement; } public override void Emit (EmitContext ec) { } } public class MemberAccess : Expression { public readonly string Identifier; Expression expr; public MemberAccess (Expression expr, string id) { this.expr = expr; Identifier = id; } public Expression Expr { get { return expr; } } public override void Resolve (TypeContainer tc) { // FIXME: Implement; } public override void Emit (EmitContext ec) { } } public class BuiltinTypeAccess : Expression { public readonly string AccessBase; public readonly string Method; public BuiltinTypeAccess (string type, string method) { System.Console.WriteLine ("DUDE! This type should be fully resolved!"); AccessBase = type; Method = method; } public override void Resolve (TypeContainer tc) { // FIXME: Implement; } public override void Emit (EmitContext ec) { } } }