EXPR
namespace Microsoft.CSharp.RuntimeBinder.Semantics
{
internal abstract class EXPR
{
internal object RuntimeObject;
internal CType RuntimeObjectActualType;
public ExpressionKind kind;
public EXPRFLAG flags;
public bool IsError;
public bool IsOptionalArgument;
public string errorString;
public CType type;
protected static void RETAILVERIFY(bool f)
{
}
public void SetInaccessibleBit()
{
IsError = true;
}
public void SetMismatchedStaticBit()
{
ExpressionKind expressionKind = kind;
if (expressionKind == ExpressionKind.EK_CALL && this.asCALL().GetMemberGroup() != null)
this.asCALL().GetMemberGroup().SetMismatchedStaticBit();
IsError = true;
}
public void setType(CType t)
{
type = t;
}
public void setAssignment()
{
flags |= EXPRFLAG.EXF_ASSGOP;
}
public bool isOK()
{
return !HasError();
}
public bool HasError()
{
return IsError;
}
public void SetError()
{
IsError = true;
}
public bool HasObject()
{
switch (kind) {
case ExpressionKind.EK_CALL:
case ExpressionKind.EK_EVENT:
case ExpressionKind.EK_FIELD:
case ExpressionKind.EK_FUNCPTR:
case ExpressionKind.EK_PROP:
case ExpressionKind.EK_MEMGRP:
return true;
default:
return false;
}
}
public EXPR getArgs()
{
RETAILVERIFY(this.isCALL() || this.isPROP() || this.isFIELD() || this.isARRAYINDEX());
if (!this.isFIELD()) {
switch (kind) {
case ExpressionKind.EK_CALL:
return this.asCALL().GetOptionalArguments();
case ExpressionKind.EK_PROP:
return this.asPROP().GetOptionalArguments();
case ExpressionKind.EK_ARRAYINDEX:
return this.asARRAYINDEX().GetIndex();
default:
return null;
}
}
return null;
}
public void setArgs(EXPR args)
{
RETAILVERIFY(this.isCALL() || this.isPROP() || this.isFIELD() || this.isARRAYINDEX());
if (!this.isFIELD()) {
switch (kind) {
case ExpressionKind.EK_CALL:
this.asCALL().SetOptionalArguments(args);
break;
case ExpressionKind.EK_PROP:
this.asPROP().SetOptionalArguments(args);
break;
case ExpressionKind.EK_ARRAYINDEX:
this.asARRAYINDEX().SetIndex(args);
break;
}
}
}
public EXPR getObject()
{
RETAILVERIFY(HasObject());
switch (kind) {
case ExpressionKind.EK_FIELD:
return this.asFIELD().OptionalObject;
case ExpressionKind.EK_PROP:
return this.asPROP().GetMemberGroup().OptionalObject;
case ExpressionKind.EK_CALL:
return this.asCALL().GetMemberGroup().OptionalObject;
case ExpressionKind.EK_MEMGRP:
return this.asMEMGRP().OptionalObject;
case ExpressionKind.EK_EVENT:
return this.asEVENT().OptionalObject;
case ExpressionKind.EK_FUNCPTR:
return this.asFUNCPTR().OptionalObject;
default:
return null;
}
}
public void SetObject(EXPR pExpr)
{
RETAILVERIFY(HasObject());
switch (kind) {
case ExpressionKind.EK_FIELD:
this.asFIELD().OptionalObject = pExpr;
break;
case ExpressionKind.EK_PROP:
this.asPROP().GetMemberGroup().OptionalObject = pExpr;
break;
case ExpressionKind.EK_CALL:
this.asCALL().GetMemberGroup().OptionalObject = pExpr;
break;
case ExpressionKind.EK_MEMGRP:
this.asMEMGRP().OptionalObject = pExpr;
break;
case ExpressionKind.EK_EVENT:
this.asEVENT().OptionalObject = pExpr;
break;
case ExpressionKind.EK_FUNCPTR:
this.asFUNCPTR().OptionalObject = pExpr;
break;
}
}
public SymWithType GetSymWithType()
{
switch (kind) {
default:
return ((EXPRCALL)this).mwi;
case ExpressionKind.EK_CALL:
return ((EXPRCALL)this).mwi;
case ExpressionKind.EK_PROP:
return ((EXPRPROP)this).pwtSlot;
case ExpressionKind.EK_FIELD:
return ((EXPRFIELD)this).fwt;
case ExpressionKind.EK_EVENT:
return ((EXPREVENT)this).ewt;
}
}
}
}