Operators
using Microsoft.CSharp.RuntimeBinder.Syntax;
using System.Collections.Generic;
namespace Microsoft.CSharp.RuntimeBinder.Semantics
{
internal static class Operators
{
private class OPINFO
{
public TokenKind iToken;
public PredefinedName methodName;
public ExpressionKind expressionKind;
public OPINFO(TokenKind t, PredefinedName pn, ExpressionKind e, int c)
{
iToken = t;
methodName = pn;
expressionKind = e;
}
}
private static readonly Dictionary<OperatorKind, OPINFO> s_rgOpInfo = new Dictionary<OperatorKind, OPINFO> {
{
OperatorKind.OP_NONE,
new OPINFO(TokenKind.Unknown, PredefinedName.PN_COUNT, ExpressionKind.EK_COUNT, 0)
},
{
OperatorKind.OP_ASSIGN,
new OPINFO(TokenKind.Equal, PredefinedName.PN_COUNT, ExpressionKind.EK_COUNT, 2)
},
{
OperatorKind.OP_ADDEQ,
new OPINFO(TokenKind.PlusEqual, PredefinedName.PN_COUNT, (ExpressionKind)140, 2)
},
{
OperatorKind.OP_SUBEQ,
new OPINFO(TokenKind.MinusEqual, PredefinedName.PN_COUNT, (ExpressionKind)141, 2)
},
{
OperatorKind.OP_MULEQ,
new OPINFO(TokenKind.SplatEqual, PredefinedName.PN_COUNT, (ExpressionKind)142, 2)
},
{
OperatorKind.OP_DIVEQ,
new OPINFO(TokenKind.SlashEqual, PredefinedName.PN_COUNT, (ExpressionKind)143, 2)
},
{
OperatorKind.OP_MODEQ,
new OPINFO(TokenKind.PercentEqual, PredefinedName.PN_COUNT, (ExpressionKind)144, 2)
},
{
OperatorKind.OP_ANDEQ,
new OPINFO(TokenKind.AndEqual, PredefinedName.PN_COUNT, (ExpressionKind)147, 2)
},
{
OperatorKind.OP_XOREQ,
new OPINFO(TokenKind.HatEqual, PredefinedName.PN_COUNT, (ExpressionKind)149, 2)
},
{
OperatorKind.OP_OREQ,
new OPINFO(TokenKind.BarEqual, PredefinedName.PN_COUNT, (ExpressionKind)148, 2)
},
{
OperatorKind.OP_LSHIFTEQ,
new OPINFO(TokenKind.LeftShiftEqual, PredefinedName.PN_COUNT, (ExpressionKind)151, 2)
},
{
OperatorKind.OP_RSHIFTEQ,
new OPINFO(TokenKind.RightShiftEqual, PredefinedName.PN_COUNT, (ExpressionKind)152, 2)
},
{
OperatorKind.OP_QUESTION,
new OPINFO(TokenKind.Question, PredefinedName.PN_COUNT, ExpressionKind.EK_COUNT, 2)
},
{
OperatorKind.OP_VALORDEF,
new OPINFO(TokenKind.QuestionQuestion, PredefinedName.PN_COUNT, ExpressionKind.EK_COUNT, 2)
},
{
OperatorKind.OP_LOGOR,
new OPINFO(TokenKind.LogicalOr, PredefinedName.PN_COUNT, ExpressionKind.EK_LOGOR, 2)
},
{
OperatorKind.OP_LOGAND,
new OPINFO(TokenKind.LogicalAnd, PredefinedName.PN_COUNT, ExpressionKind.EK_LOGAND, 2)
},
{
OperatorKind.OP_BITOR,
new OPINFO(TokenKind.Bar, PredefinedName.PN_OPBITWISEOR, ExpressionKind.EK_BITOR, 2)
},
{
OperatorKind.OP_BITXOR,
new OPINFO(TokenKind.Hat, PredefinedName.PN_OPXOR, ExpressionKind.EK_BITXOR, 2)
},
{
OperatorKind.OP_BITAND,
new OPINFO(TokenKind.Ampersand, PredefinedName.PN_OPBITWISEAND, ExpressionKind.EK_BITAND, 2)
},
{
OperatorKind.OP_EQ,
new OPINFO(TokenKind.EqualEqual, PredefinedName.PN_OPEQUALITY, ExpressionKind.EK_EQ, 2)
},
{
OperatorKind.OP_NEQ,
new OPINFO(TokenKind.NotEqual, PredefinedName.PN_OPINEQUALITY, ExpressionKind.EK_NE, 2)
},
{
OperatorKind.OP_LT,
new OPINFO(TokenKind.LessThan, PredefinedName.PN_OPLESSTHAN, ExpressionKind.EK_LT, 2)
},
{
OperatorKind.OP_LE,
new OPINFO(TokenKind.LessThanEqual, PredefinedName.PN_OPLESSTHANOREQUAL, ExpressionKind.EK_LE, 2)
},
{
OperatorKind.OP_GT,
new OPINFO(TokenKind.GreaterThan, PredefinedName.PN_OPGREATERTHAN, ExpressionKind.EK_GT, 2)
},
{
OperatorKind.OP_GE,
new OPINFO(TokenKind.GreaterThanEqual, PredefinedName.PN_OPGREATERTHANOREQUAL, ExpressionKind.EK_GE, 2)
},
{
OperatorKind.OP_IS,
new OPINFO(TokenKind.Is, PredefinedName.PN_COUNT, ExpressionKind.EK_COUNT, 2)
},
{
OperatorKind.OP_AS,
new OPINFO(TokenKind.As, PredefinedName.PN_COUNT, ExpressionKind.EK_COUNT, 2)
},
{
OperatorKind.OP_LSHIFT,
new OPINFO(TokenKind.LeftShift, PredefinedName.PN_OPLEFTSHIFT, ExpressionKind.EK_LSHIFT, 2)
},
{
OperatorKind.OP_RSHIFT,
new OPINFO(TokenKind.RightShift, PredefinedName.PN_OPRIGHTSHIFT, ExpressionKind.EK_RSHIFT, 2)
},
{
OperatorKind.OP_ADD,
new OPINFO(TokenKind.Plus, PredefinedName.PN_OPPLUS, ExpressionKind.EK_ADD, 2)
},
{
OperatorKind.OP_SUB,
new OPINFO(TokenKind.Minus, PredefinedName.PN_OPMINUS, ExpressionKind.EK_SUB, 2)
},
{
OperatorKind.OP_MUL,
new OPINFO(TokenKind.Splat, PredefinedName.PN_OPMULTIPLY, ExpressionKind.EK_MUL, 2)
},
{
OperatorKind.OP_DIV,
new OPINFO(TokenKind.Slash, PredefinedName.PN_OPDIVISION, ExpressionKind.EK_DIV, 2)
},
{
OperatorKind.OP_MOD,
new OPINFO(TokenKind.Percent, PredefinedName.PN_OPMODULUS, ExpressionKind.EK_MOD, 2)
},
{
OperatorKind.OP_NOP,
new OPINFO(TokenKind.Unknown, PredefinedName.PN_COUNT, ExpressionKind.EK_COUNT, 1)
},
{
OperatorKind.OP_UPLUS,
new OPINFO(TokenKind.Plus, PredefinedName.PN_OPUNARYPLUS, ExpressionKind.EK_UPLUS, 1)
},
{
OperatorKind.OP_NEG,
new OPINFO(TokenKind.Minus, PredefinedName.PN_OPUNARYMINUS, ExpressionKind.EK_NEG, 1)
},
{
OperatorKind.OP_BITNOT,
new OPINFO(TokenKind.Tilde, PredefinedName.PN_OPCOMPLEMENT, ExpressionKind.EK_BITNOT, 1)
},
{
OperatorKind.OP_LOGNOT,
new OPINFO(TokenKind.Bang, PredefinedName.PN_OPNEGATION, ExpressionKind.EK_LOGNOT, 1)
},
{
OperatorKind.OP_PREINC,
new OPINFO(TokenKind.PlusPlus, PredefinedName.PN_OPINCREMENT, ExpressionKind.EK_ADD, 1)
},
{
OperatorKind.OP_PREDEC,
new OPINFO(TokenKind.MinusMinus, PredefinedName.PN_OPDECREMENT, ExpressionKind.EK_SUB, 1)
},
{
OperatorKind.OP_TYPEOF,
new OPINFO(TokenKind.TypeOf, PredefinedName.PN_COUNT, ExpressionKind.EK_TYPEOF, 1)
},
{
OperatorKind.OP_CHECKED,
new OPINFO(TokenKind.Checked, PredefinedName.PN_COUNT, ExpressionKind.EK_COUNT, 1)
},
{
OperatorKind.OP_UNCHECKED,
new OPINFO(TokenKind.Unchecked, PredefinedName.PN_COUNT, ExpressionKind.EK_COUNT, 1)
},
{
OperatorKind.OP_MAKEREFANY,
new OPINFO(TokenKind.MakeRef, PredefinedName.PN_COUNT, ExpressionKind.EK_COUNT, 1)
},
{
OperatorKind.OP_REFVALUE,
new OPINFO(TokenKind.RefValue, PredefinedName.PN_COUNT, ExpressionKind.EK_COUNT, 2)
},
{
OperatorKind.OP_REFTYPE,
new OPINFO(TokenKind.RefType, PredefinedName.PN_COUNT, ExpressionKind.EK_COUNT, 1)
},
{
OperatorKind.OP_ARGS,
new OPINFO(TokenKind.ArgList, PredefinedName.PN_COUNT, ExpressionKind.EK_COUNT, 0)
},
{
OperatorKind.OP_CAST,
new OPINFO(TokenKind.Unknown, PredefinedName.PN_COUNT, ExpressionKind.EK_COUNT, 2)
},
{
OperatorKind.OP_INDIR,
new OPINFO(TokenKind.Splat, PredefinedName.PN_COUNT, ExpressionKind.EK_COUNT, 1)
},
{
OperatorKind.OP_ADDR,
new OPINFO(TokenKind.Ampersand, PredefinedName.PN_COUNT, ExpressionKind.EK_COUNT, 1)
},
{
OperatorKind.OP_COLON,
new OPINFO(TokenKind.Colon, PredefinedName.PN_COUNT, ExpressionKind.EK_COUNT, 2)
},
{
OperatorKind.OP_THIS,
new OPINFO(TokenKind.This, PredefinedName.PN_COUNT, ExpressionKind.EK_COUNT, 0)
},
{
OperatorKind.OP_BASE,
new OPINFO(TokenKind.Base, PredefinedName.PN_COUNT, ExpressionKind.EK_COUNT, 0)
},
{
OperatorKind.OP_NULL,
new OPINFO(TokenKind.Null, PredefinedName.PN_COUNT, ExpressionKind.EK_COUNT, 0)
},
{
OperatorKind.OP_TRUE,
new OPINFO(TokenKind.True, PredefinedName.PN_OPTRUE, ExpressionKind.EK_COUNT, 1)
},
{
OperatorKind.OP_FALSE,
new OPINFO(TokenKind.False, PredefinedName.PN_OPFALSE, ExpressionKind.EK_COUNT, 1)
},
{
OperatorKind.OP_CALL,
new OPINFO(TokenKind.Unknown, PredefinedName.PN_COUNT, ExpressionKind.EK_COUNT, 0)
},
{
OperatorKind.OP_DEREF,
new OPINFO(TokenKind.Unknown, PredefinedName.PN_COUNT, ExpressionKind.EK_COUNT, 0)
},
{
OperatorKind.OP_PAREN,
new OPINFO(TokenKind.Unknown, PredefinedName.PN_COUNT, ExpressionKind.EK_COUNT, 0)
},
{
OperatorKind.OP_POSTINC,
new OPINFO(TokenKind.PlusPlus, PredefinedName.PN_COUNT, ExpressionKind.EK_ADD, 1)
},
{
OperatorKind.OP_POSTDEC,
new OPINFO(TokenKind.MinusMinus, PredefinedName.PN_COUNT, ExpressionKind.EK_SUB, 1)
},
{
OperatorKind.OP_DOT,
new OPINFO(TokenKind.Dot, PredefinedName.PN_COUNT, ExpressionKind.EK_COUNT, 2)
},
{
OperatorKind.OP_IMPLICIT,
new OPINFO(TokenKind.Implicit, PredefinedName.PN_OPIMPLICITMN, ExpressionKind.EK_COUNT, 1)
},
{
OperatorKind.OP_EXPLICIT,
new OPINFO(TokenKind.Explicit, PredefinedName.PN_OPEXPLICITMN, ExpressionKind.EK_COUNT, 1)
},
{
OperatorKind.OP_EQUALS,
new OPINFO(TokenKind.Unknown, PredefinedName.PN_OPEQUALS, ExpressionKind.EK_COUNT, 2)
},
{
OperatorKind.OP_COMPARE,
new OPINFO(TokenKind.Unknown, PredefinedName.PN_OPCOMPARE, ExpressionKind.EK_COUNT, 2)
},
{
OperatorKind.OP_DEFAULT,
new OPINFO(TokenKind.Unknown, PredefinedName.PN_COUNT, ExpressionKind.EK_COUNT, 0)
}
};
private static OPINFO GetInfo(OperatorKind op)
{
return s_rgOpInfo[op];
}
public static OperatorKind OperatorOfMethodName(NameManager namemgr, Name name)
{
for (OperatorKind operatorKind = OperatorKind.OP_NONE; operatorKind < OperatorKind.OP_LAST; operatorKind++) {
if (HasMethodName(operatorKind) && name == GetMethodName(namemgr, operatorKind))
return operatorKind;
}
return OperatorKind.OP_NONE;
}
public static bool HasMethodName(OperatorKind op)
{
return GetMethodName(op) != PredefinedName.PN_COUNT;
}
public static PredefinedName GetMethodName(OperatorKind op)
{
return GetInfo(op).methodName;
}
public static Name GetMethodName(NameManager namemgr, OperatorKind op)
{
return namemgr.GetPredefName(GetMethodName(op));
}
public static bool HasDisplayName(OperatorKind op)
{
return GetInfo(op).iToken != TokenKind.Unknown;
}
public static string GetDisplayName(OperatorKind op)
{
return TokenFacts.GetText(GetInfo(op).iToken);
}
public static ExpressionKind GetExpressionKind(OperatorKind op)
{
return GetInfo(op).expressionKind;
}
}
}